Struts2 拦截器

拦截器======
1.值栈 ValueStack 本质上是内存上的一块空间
用code去获取值栈
ValueStack vs=ActionContext.getContext().getValueStack();
内存结构vs:
ValueStack:
内容一: 单列集合 extends ArrayList

<s:debug> 放到值栈上方

内容二:双列Map集合 context implements Map
<s:debug> 放到值栈下方
2.OGNL Object Graph Navigation Language
对象导航图语言
典型的用法,a.b.c info.address.street

3.一个struts2标签
<s:iterator >
<s:property></s:propery>
</s:iterrator>

<s:date name="mydate" format="yyyy-MM-dd"></s:date>

1.拦截器(Interceptor)
解析:Struts2体系架构的核心
发出请求---->能匹配到拦截规则的请求会被
拦截器拦截,拦截

拦截器栈(InterceptorStack)

1.Struts执行流程
2.1 web.xml中 StrutsPrepareAndExecuteFilter类 核心控制器

2.2 找到doFilter方法
体现出一种设计模式
解释了Struts2中 request 并不是HttpServletRequest
request = prepare.wrap(包装)Request(request);

***:ActionMapping mapping = prepare.findActionMapping(request, response, true);

findActionMapping方法:
public ActionMapping findActionMapping() {
//先看内存中有没有映射结果!
ActionMapping mapping = (ActionMapping) request.getAttribute(STRUTS_ACTION_MAPPING_KEY);

//没有,找到ActionMapper构建
if (mapping == null || forceLookup) {

mapping = dispatcher.getContainer().getInstance(ActionMapper.class).
}

return mapping;
}

2.3 上面代码已经保证mapping不是null
if (mapping == null) {

} else {
//code execute
execute.executeAction(request, response, mapping);
}

executeAction方法原型如下:
public void executeAction() throws ServletException {
dispatcher.serviceAction(request, response, mapping);
}

*serviceAction原型
public void serviceAction(){

ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
namespace, name, method, extraContext, true, false);

}

*:寻找ActionInvocation

if (mapping.getResult() != null) {
Result result = mapping.getResult();
result.execute(proxy.getInvocation():返回值类型是ActionInvocation);
} else {
proxy.execute();
}

2018年2月28日08:35:24
1.拦截器:底层是动态代理实现的。主要作用是在方法执行前后,插入通用业务(日志和事务);
logback
2.自定义拦截器

1.定义一个拦截器类 implements Interceptor{

public String intercept(ActionInvocation invocation){
获取到一个Action
Action action= invocation.getAction();

//获取到session
Map<String,Object> session=ActionContext.getContext().getSession();
Object name=ssssion.get("uname");

//获取ActionName
String actionName=ActionContext.getProxy().getActionName();
String value;
if(actionName.equals("loginAction")){
value=invocation.invoke();
}else if(name!=null){
value=invocation.invoke();
}else{
value="login";
}
}

}

2.UI 页面 伪造 login.jsp success.jsp


3.Action开发
LoginAction implemtns Action{
UserInfo user;
public String execute(){

if(成立){
return SUCCESS;
}

}

}


4.针对拦截器xml配置
我们要配置到整体的Struts.xml中

5.观察执行效果 /分析原理

 1、客户端向Servlet容器(如Tomcat)提交一个请求
2、请求经过一系列过滤器(如ActionContextCleanUp过滤器等)
3、核心控制器被调用,询问ActionMapper来决定请求是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,核心控制器把控制权委派给ActionProxy (备注:JSP请求无需调用Action)
5、ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到需调用的Action类
6、ActionProxy创建一个ActionInvocation的实例
7、 ActionInvocation负责调用Action,在此之前会依次调用所有配置的拦截器
8、Action执行完毕,ActionInvocation负责根据结果码字符串在struts.xml的配置中找到对应的返回结果
9、拦截器被再次执行
10、过滤器被再次执行
原文地址:https://www.cnblogs.com/ztca/p/8483985.html