Struts2_03_控制器(过滤器/拦截器/Action)
一、过滤器
过滤器是Struts2控制器的最前端控制器,请求对象首先被过滤器过滤。Struts2的过滤器有三层次,参考工作原理图中与过滤器有关的部分,不再赘述。
二、拦截器
1.简单了解什么是拦截器?
- 拦截器是Struts2中第二个层次的控制器,他会在Action执行前后运行一些Action类需要的通用功能;
- 拦截器是使用AOP思想设计;
- API中提供了大量的拦截器类;当然,我们也可以自定义拦截功能,也就是自定义拦截器。
2.如何使用拦截器?
①定义拦截器
使用拦截器前,必须先在struts.xml文件中定义拦截器,使用标记<interceptor>定义。
②使用拦截器
定义拦截器之后就可以再Action中引用,通过标记<interceptor_ref>指定要使用的拦截器。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" /> <package name="default" extends="struts-default">
<!-- 定义拦截器 --> <interceptors> <interceptor name="MyInterceptor01" class="interceptor.MyInterceptor01" />
<interceptor name="MyInterceptor02" class="interceptor.MyInterceptor02" />
</interceptors>
<action name="loginAction" class="loginAction">
<!-- 引用拦截器-->
<interceptor-ref name="MyInterceptor01"></interceptor-ref>
<interceptor-ref name="MyInterceptor02"></interceptor-ref> <result name="fail">/index.jsp </result> <result name="success">/success.jsp</result> </action> </package> </struts>
3.拦截器栈的定义与使用
往往我们需要对多个拦截器一起使用,那么就可以定义一个拦截器栈,将需要使用的拦截器捆绑在一起,方便使用,也就是说拦截器栈是多个拦截器的集合。
先看下面的代码:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" /> <package name="default" extends="struts-default"> <interceptors>
<!--定义拦截器 --> <interceptor name="MyInterceptor01" class="interceptor.MyInterceptor01" />
<interceptor name="MyInterceptor02" class="interceptor.MyInterceptor02" />
<interceptor name="MyInterceptor03" class="interceptor.MyInterceptor03" />
<interceptor name="MyInterceptor04" class="interceptor.MyInterceptor04" />
<!--定义拦截器栈 -->
<interceptor-stack name="myInterceptorStack">
<interceptor-ref name="MyInterceptor01"/>
<interceptor-ref name="defaultStack02"/>
</interceptor-stack>
</interceptors>
<action name="loginAction" class="loginAction">
<!-- 使用拦截器栈 -->
<interceptor-ref name="myInterceptorStack" /> <result name="fail">/index.jsp </result> <result name="success">/success.jsp</result> </action> </package> </struts>
上述定义了4个拦截器,还定义了一个拦截器栈,拦截器栈中引用了两个拦截器,如果下次需要同时访问这两个拦截器,就可以直接访问拦截器栈即可以了。
4.默认拦截器或拦截器栈的定义与使用
在一个项目的某个包中,我们可以定义默认的拦截器或拦截器栈,那么,该包下的Action在<interceptor-ref>没有指定情况下,都会被默认拦截器或拦截器栈拦截。但是,如果包中的某个Action指定了<interceptor-ref>,则默认的拦截器或拦截器栈失效,必须再次指定方可使用。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" />
<!--定义默认拦截器栈 -->
<default-interceptor-ref name="myInterceptorStack" /> <package name="default" extends="struts-default"> <action name="loginAction" class="loginAction"> <result name="fail">/index.jsp </result> <result name="success">/success.jsp</result> </action> </package> </struts>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" />
<!--定义默认拦截器栈 -->
<default-interceptor-ref name="myInterceptorStack" /> <package name="default" extends="struts-default"> <action name="loginAction" class="loginAction">
<!--指定拦截器引用,此时默认拦截器失效-->
<interceptor-ref name="MyInterceptor01" />
<!-- 再次指定默认拦截器,使其生效 -->
<interceptor-ref name="myInterceptorStack" />
<result name="fail">/index.jsp </result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
5.struts-default.xml中定义的拦截器栈
struts.xml中的Action都继承了struts-default.xml中的struts-default包,因此都默认继承struts-default包的默认拦截器栈。
三、Action
- Action是Struts2的第三层的控制器,需要自行开发;
- Action是Struts2应用中使用数量最多的控制器;
- Action实现的功能与Servlet非常类似,然而,Action不是Servlet,仅仅是一个普通的java类;
- Action的主要作用就是:封装请求参数,调用业务逻辑,执行业务操作,根据执行结果返回结果视图,实现页面导航,被称为"业务控制器"。