1,filter是过滤器,把满足条件的那些通过,不满足条件的那些不让通过。首先需要在web.xml中配置
如:<filter>
<filter-name>myStruts1</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myStruts1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/*表示所有url的都满足,是路径映射。
*.action,*.jsp是扩展映射。就是扩展名映射。
2,自定义filter是可以通过implements Filter来自定义,也可以通过继承extends StrutsPrepareAndExecuetFilter来实现。
如:public class MyStrutsFilter1 extends StrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("继承struts2的过滤器MyStrutsFilter1 before");
super.doFilter(arg0, arg1, arg2);//调用父类的doFilter的方法即可。
System.out.println("继承struts2的过滤器MyStrutsFilter1 after");
}
}
3,如果配置了多个Filter时,有多个filter都满足时,按道理是(filter-mapping的顺序)依次配置的顺序来进行调用。不过实际上是xx.jsp是满足条件的,当有多个filter满足条件时,会依次执行多个filter。而例如满足的是xx.action则只执行最上面的那个filter的配置的class。
如:<filter>
<filter-name>myStruts1</filter-name>
<filter-class>com.filter.MyStrutsFilter1</filter-class>
</filter>
<filter>
<filter-name>myStruts2</filter-name>
<filter-class>com.filter.MyStrutsFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>myStruts1</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>myStruts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
4 过滤器有4中过滤器,request过滤器(默认的都是这种),forward过滤器,include过滤器和error过滤器,
request过滤器是默认的,是在<dispatcher>REQUEST</dispatcher>。因为默认的是request过滤器,所有才会出现当有多个filter满足xx.action时值执行最上面的那一个filter,别的就不执行了。request是只对客户端直接访问的起到过滤作用,而对过滤器转发请求的不起作用。
forward过滤器是只对过滤器请求的起作用。所以一般request和forward一起加上。
如:<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
include不是很懂。
error过滤器是当访问的目标资源不存在时,则会报一个错误如404.这时我们配置一个404的错误页面。则会跳转到该错误页面。
如:<filter>
<filter-name>myStruts1</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myStruts1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
/*表示所有url的都满足,是路径映射。
*.action,*.jsp是扩展映射。就是扩展名映射。
2,自定义filter是可以通过implements Filter来自定义,也可以通过继承extends StrutsPrepareAndExecuetFilter来实现。
如:public class MyStrutsFilter1 extends StrutsPrepareAndExecuteFilter {
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
System.out.println("继承struts2的过滤器MyStrutsFilter1 before");
super.doFilter(arg0, arg1, arg2);//调用父类的doFilter的方法即可。
System.out.println("继承struts2的过滤器MyStrutsFilter1 after");
}
}
3,如果配置了多个Filter时,有多个filter都满足时,按道理是(filter-mapping的顺序)依次配置的顺序来进行调用。不过实际上是xx.jsp是满足条件的,当有多个filter满足条件时,会依次执行多个filter。而例如满足的是xx.action则只执行最上面的那个filter的配置的class。
如:<filter>
<filter-name>myStruts1</filter-name>
<filter-class>com.filter.MyStrutsFilter1</filter-class>
</filter>
<filter>
<filter-name>myStruts2</filter-name>
<filter-class>com.filter.MyStrutsFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>myStruts1</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>myStruts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
4 过滤器有4中过滤器,request过滤器(默认的都是这种),forward过滤器,include过滤器和error过滤器,
request过滤器是默认的,是在<dispatcher>REQUEST</dispatcher>。因为默认的是request过滤器,所有才会出现当有多个filter满足xx.action时值执行最上面的那一个filter,别的就不执行了。request是只对客户端直接访问的起到过滤作用,而对过滤器转发请求的不起作用。
forward过滤器是只对过滤器请求的起作用。所以一般request和forward一起加上。
如:<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
include不是很懂。
error过滤器是当访问的目标资源不存在时,则会报一个错误如404.这时我们配置一个404的错误页面。则会跳转到该错误页面。