struts2中html
ActionContextCleanUp,java
StrutsPrepareAndExecuteFilter,web
StrutsPrepareFilter,StrutsExecuteFilter,数据库
FilterDispatcherdapache
刚看了文档中的描述(说的很清楚了,仍是文档好啊):session
org.apache.struts2.dispatcherapp
Class FilterDispatcherjsp
Deprecated. Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter
instead or StrutsPrepareFilter
and StrutsExecuteFilter
if needing using theActionContextCleanUp
filter in addition to this one网站
org.apache.struts2.dispatcher
Class ActionContextCleanUpui
Deprecated. Since Struts 2.1.3, use StrutsPrepareFilter
and StrutsExecuteFilter
to use other Servlet filters that need access to the ActionContext
org.apache.struts2.dispatcher.ng.filter
Class StrutsPrepareAndExecuteFilter
Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use when you don't have another filter that needs access to action context information, such as Sitemesh.
org.apache.struts2.dispatcher.ng.filter
Class StrutsPrepareFilter
Prepares the request for execution by a later StrutsExecuteFilter
filter instance.
org.apache.struts2.dispatcher.ng.filter
Class StrutsExecuteFilter
Executes the discovered request information. This filter requires the StrutsPrepareFilter
to have already been executed in the current chain.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.
StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.
StrutsPrepareAndExecuteFilter是StrutsPrepareFilter和StrutsExecuteFilter的组合,那何时用StrutsPrepareFilter和StrutsExecuteFilter的组合来替代StrutsPrepareAndExecuteFilter呢?下面会讲到。
这样的改革固然是有好处的.
为何这么说.? 应该知道若是咱们本身定义过滤器的话, 是要放在strtus2的过滤器以前的, 若是放在struts2过滤器以后,你本身的过滤器对action的过滤做用就废了,不会有效!除非你是访问jsp/html!
那我如今有需求, 我必须使用Action的环境,而又想在执行action以前拿filter作一些事, 用FilterDispatcher是作不到的.!
那么StrutsPrepareAndExecuteFilter能够把他拆分红StrutsPrepareFilter和StrutsExecuteFilter,能够在这两个过滤器之间加上咱们本身的过滤器.!
给你打个比喻, 如今有病人要作手术, 如今struts2要作两件事, 搭病床(环境),执行手术.! 那么打麻药的工做呢.? 不可能要病人站着打吧, 因此必须有病床的环境,打完麻药以后再动手术.! 这个比喻很是形象了.!
ActionContextCleanUp也是自2.1.3开始由StrutsPrepareFilter和StrutsExecuteFilter的组合替代。
看个例子:
在2.1.3以前用sitemesh的web.xml的配置:
<filter> <filter-name>ActionContextCleanUp</filter-name> <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class> </filter> <filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class> </filter> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>ActionContextCleanUp</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
其中ActionContextCleanUp filter
SiteMesh filter
FilterDispatcher的顺序不能改变。
ActionContextCleanUp的做用是延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action本身清除。
为了使用WebWork,咱们只须要在web.xml配置FilterDispatcher一个过滤器便可,阅读一下FilterDispatcher的JavaDoc和源码,咱们能够看到它调用了:
finally{
ActionContextCleanUp.cleanUp(req);
}
在ActionContextCleanUp中,有这样的代码:
req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE);
若是FilterDispatcher检测到这个属性,就不会清除ActionContext中的内容了,而由ActionContextCleanUp后续的代码来清除,保证了一系列的Filter访问正确的ActionContext。
自Struts2是2.1.3版本开始,死活不得行,老是报错。原来新版本中已经不能再采用这种方式了。
【从struts2.1.3开始ActionContextCleanUp 和 FilterDispatcher过滤器,已经不建议使用了。
将使用StrutsPrepareFilter和StrutsExecuteFilter拦截器替代】
而从Struts2.1.3开始应该改成如下配置才能集成起来,要否则你的装饰器页面或者被装饰页面
里面将不能使用Struts2的标签。一使用就会报错说什么the Struts Dispatcher not found
<filter> <filter-name>StrutsPrepareFilter</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class> </filter> <filter> <filter-name>sitemesh</filter-name> <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class> </filter> <filter> <filter-name>StrutsExecuteFilter</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>StrutsPrepareFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>StrutsExecuteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
按StrutsPrepareFilter,sitemesh,StrutsExecuteFilter的顺序配置过滤器,sitemesh夹在中间。
经过以上配置能正确使用。
使用Filter分为两部分:编写Filter和配置Filter。
1.编写Filter:
1)实现 javax.servlet.Filter 接口
2)实现接口中方法。
public void init(FilterConfig config) throws ServletException ,
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterchain) throws IOException, ServletException ,
public void destroy() 三个方法。
其中,在doFilter中,filterchain.doFilter(servletRequest, servletResponse);用于继续执行原有请求的活动。
好比你访问了网站index.jsp页面,但愿在访问这个页面前对数据库进行查询来初始化这个页面,那么能够在doFilter方法中,编写数据库查询的代码。可是以后必定要写filterchain.doFilter(servletRequest, servletResponse);这样页面才会在执行完数据库查询后跳转至index.jsp。即在filter后继续执行原有的请求。
注意:在doFilter的参数中的request和response参数为ServletRequest 和ServletResponse,如需获取session,可将它们转换为HttpServletRequest和HttpServletResponse。再经过request.getSession()获取HttpSession。
代码例子:
import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class UserroleFilter implements Filter{ public void destroy() { } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterchain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; HttpServletRequest request = (HttpServletRequest)servletRequest; HttpSession session = request.getSession(); //须要过滤的代码 filterchain.doFilter(servletRequest, servletResponse); } public void init(FilterConfig config) throws ServletException { } }
2.配置Filter:
在web.xml中配置哪些请求须要使用过滤器进行过滤。
<filter> <filter-name>selfTestFilter</filter-name> <filter-class>com.maggie.filter.SelfTestFilter</filter-class> </filter> <filter-mapping> <filter-name>selfTestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>