struts2之implements SessionAware, ServletRequestAware, ServletResponseAware原理分析
来源:互联网 发布:不用网络的小说软件 编辑:程序博客网 时间:2024/06/14 06:44
我们在开发项目一般会新建一个action父类,然后让所有的子类来继承它。下面的代码展示了我们在新建父类时实现了SessionAware, ServletRequestAware, ServletResponseAware三个接口,实现这三个接口的目的是自动创建session,HttpServletRequest,HttpServletResponse来为我们服务。下面我们就从源码的角度来分析一下为什么实现了这三个接口struts框架就会帮我们自动创建session,HttpServletRequest,HttpServletResponse的实现。
public class MyActionSupport extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware { protected Map<String, Object> session; protected HttpServletRequest request; protected HttpServletResponse response; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; } @Override public void setServletResponse(HttpServletResponse response) { this.response = response; } @Override public void setSession(Map<String, Object> session) { this.session = session; }}
1.在struts的配置文件struts.xml中我们定义了自己的拦截器,同时把默认的拦截器包含到自定义的拦截器栈,同时设置系统的拦截器栈。我们之所以可以引用默认拦截器到我们自己的拦截器中,是因为在我们自己的配置文件继承了struts自带的配置文件struts-default.xml
<struts> <package name="myDefault" extends="struts-default"> <interceptors> <interceptor name="checkLogin" class="com.deity.finance.interceptors.CheckLogin" /> <interceptor-stack name="checkLoginStack"> <interceptor-ref name="checkLogin" /> <interceptor-ref name="defaultStack" /> </interceptor-stack> </interceptors> <default-interceptor-ref name="checkLoginStack"/> ......
2.下面是struts-default.xml中关于默认拦截器servletConfig的配置情况,我们之所以要列出该拦截器的配置情况,是因为拦截器就是自动创建session的关键。下面让我们继续查看该拦截器的源码
<interceptors> ...... <interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/> ......</interceptors><interceptor-stack name="defaultStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> ......</interceptor-stack>
3.从servletConfig拦截器的代码中我们可以看到,首先拦截器会判断action是否实现了SessionAware, ServletRequestAware, ServletResponseAware接口,如果实现的话就从context获取相应的session,request,response通过set方法赋值给action属性,这样我们就通过实现接口可以获取到相应的属性来为我们服务了。
public class ServletConfigInterceptor extends AbstractInterceptor implements StrutsStatics { private static final long serialVersionUID = 605261777858676638L; public String intercept(ActionInvocation invocation) throws Exception { final Object action = invocation.getAction(); final ActionContext context = invocation.getInvocationContext(); if (action instanceof ServletRequestAware) { HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST); ((ServletRequestAware) action).setServletRequest(request); } if (action instanceof ServletResponseAware) { HttpServletResponse response = (HttpServletResponse) context.get(HTTP_RESPONSE); ((ServletResponseAware) action).setServletResponse(response); } if (action instanceof SessionAware) { ((SessionAware) action).setSession(context.getSession()); } ...... return invocation.invoke(); }}
1 0
- struts2之implements SessionAware, ServletRequestAware, ServletResponseAware原理分析
- [Struts2] Action Implements SessionAware
- [Struts2] Action Implements SessionAware
- [Struts2] Action Implements SessionAware
- struts2获取response对象---实现ServletResponseAware接口
- Struts2访问Web元素(RequestAware,SessionAware,ApplicationAware)
- Struts2访问Web元素(RequestAware,SessionAware,ApplicationAware)
- Struts2访问Web元素(RequestAware,SessionAware,ApplicationAware)
- struts2继承ServletRequestAware获取request为null的问题
- struts2原理分析
- Struts2原理分析
- Struts2原理分析
- Struts2工作原理分析
- struts2 urlrewrite之forward跳转 页面404原理分析
- Struts2之拦截器原理分析及使用-上
- Struts2之拦截器原理分析及使用-中
- Struts2之拦截器原理分析及使用-再中
- Struts2之拦截器原理分析及使用-下
- matlab矩阵的基本操作
- VMware虚拟机上Ubuntu安装TensorFlow 1.0
- Android Studio SVN 使用方法
- Linux下命令使用笔记
- MySQL中tinytext、text、mediumtext和longtext详解
- struts2之implements SessionAware, ServletRequestAware, ServletResponseAware原理分析
- 三种算法求最大公约数c语言
- Pandas 文本数据方法 get_dummies()
- Android动画专题之属性动画
- 树莓派学习笔记(1):入手树莓派
- 使用炫彩界面库完美实现窗口阴影效果
- clone()方法(浅复制、深复制)
- 我为什这么强烈而又坚定的推荐你做TPS云集品
- 题目1040:Prime Number