引题:Struts2框架对很多功能进行了封装,这些功能是由拦截器实现的,所以拦截器是Struts2的核心。
下面便结合案例从三个部分讲解下拦截器。
1.what:拦截器是什么
Struts2的拦截器和Servlet中的过滤器类似。用生活中例子来说,拦截器的作用类似于“保安”的角色。
举个例子来说:
生活中,来访者要访问部队某团长,是不能直接进去,需要经过门口保安的检查和登记。
在Struts2中,在浏览器端发起请求的用户相当于来访者,一个个的action类相当于团长,而拦截器就是保安。
当用户在浏览器端访问某个action资源时,需要先经过拦截器的拦截,经过了拦截器的“检查”才可访问到对应的action资源。
拦截器的实现原理:
当请求一个action资源时,Struts2会先查找struts.xml配置文件,并根据配置实例化配置的拦截器对象,然后串成一个列表,最后一个个地调用列表中的拦截器。
在执行Action之前,先执行该Action中配置的所有拦截器的intercept方法,被该方法放行后才可执行Action。
2.why:为什么使用拦截器
如果不采用拦截器,那么很多常用的功能就需要手动写代码。
比如,“类型转换”。web项目,从浏览器端输入的参数都是以String类型传到服务器端的,但在服务器端并非全部存储为String类型,这时就需要进行类型转换),例子如下。
public class LoginAction extends ActionSupport {
private String name;
private int age;
.......
}
如果采用了拦截器,就可以将强制类型转换功能(这个功能Struts2框架已写好了)写到拦截器中,配置好,不用每次写action时重新写一遍。
这样就使得程序具备了以下优点:
- “功能”可插拔
- 提取action中的共性代码,减少代码冗余
3.how:Struts2中怎么使用拦截器
3.1 Struts2的内置拦截器
Struts2本身提供了很多的拦截器,这些拦截器已经在struts-default.xml文件中定义,在Web应用程序中可以直接引用这些拦截器。
常用的内置拦截器有:
使用方式:
只要在struts.xml中extends=“"struts-default”即可。
struts.xml
<struts>
<package name="global" extends="struts-default">
...
</struts>
3.2 Struts2的自定义拦截器
(1)通过继承AbstractInterceptor写一个拦截器类
public class OneInteceptor extends AbstractInterceptor{
@Override
public void init() {
System.out.println("OneIntecepto 初始化....");
}
@Override
public String intercept(ActionInvocation inv) throws Exception {
System.out.println("1:OneIntecptor在Action执行之前.....");
//result是用来接收Action中方法的返回值
String result = inv.invoke();//放行,去执行用户要访问的资源---action
System.out.println("3:OneInteceptor在Action执行之后.....");
return result;
}
@Override
public void destroy() {
System.out.println("OneInteceptor 销毁....");
}
}
(2)LoginAction.java
//LoginAction
public class LoginAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("LoginAction执行...");
return SUCCESS;
}
}
(3)拦截器的定义和配置
在struts.xml中对拦截器进行定义和配置
<struts>
<package name="global" extends="struts-default">
<interceptors>
<!-- 定义拦截器 -->
<interceptor name="oneinte" class="cn.inspur.inteceptor.OneInteceptor"></interceptor>
</interceptors>
<action name="login" class="cn.inspur.action.LoginAction">
<!-- 配置拦截器,使拦截器oneinte对LoginAction生效 -->
<interceptor-ref name="oneinte"></interceptor-ref>
<result name="success">/success.jsp
</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
结果截图如下:
拦截器的应用
拦截器可以用来实现:拦截未登录用户访问页面的功能
这个案例的实现代码,有机会再跟大家完整分享。