一、拦截器
1、拦截器是单例模式的,因此拦截器最好是无状态的;
2、配置拦截器步骤:
1):编写实现Interceptor接口或继承AbstractInterceptor抽象类的类;
2):在struts.xml配置文件中定义拦截器;
3):在action中配置拦截器。
3、一旦定义了自己的拦截器,将其配置到action上后,我们需要在action最后加上默认的拦截器栈:defaultStack
二、拦截器应用(用户登录)
1、登录页面login.jsp
<body>
<h3>用户登录</h3>
<form action="login" method = "post">
username:<input type = "text" name = "username"/><br/>
password:<input type = "text" name = "password"/><br/>
<input type = "submit" value = "submit"/>
</form>
</body>
2、LoginAction
public class LoginAction extends ActionSupport{
private String username;
private String password;
//...setter/getter....
public String execute()throws Exception{
return SUCCESS;
}
}
3、定义自己的拦截器MyInterceptor
public class MyInterceptor implements Interceptor
{
private String test;
public void destroy()
{
System.out.println("MyInterceptor is destory!");
}
public void init()
{
System.out.println("MyInterceptor is init !");
}
public String intercept(ActionInvocation arg0) throws Exception
{
System.out.println("intercept before");
String temp = arg0.invoke();
//该方法为如果下面有烂机器就调用下一个,如果没有就执行Action。
System.out.println("MyInterceptor is intercept:"+temp);
System.out.println("intercept after");
return temp;
}
public String getTest()
{
return test;
}
public void setTest(String test)
{
this.test = test;
}
}
4、配置文件struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="struts2" extends="struts-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="com.liusheng.interceptor.MyInterceptor">
<!-- 配置初始化参数 ,与成员变量对应赋值,在给成员变量赋值时机在init方法之前进行-->
<param name="test">test</param>
</interceptor>
</interceptors>
<action name="login" class="com.liusheng.action.LoginAction">
<result name="success">index.jsp</result>
<!-- exception:是对于抛出该处出现的异常进行处理
result:自定义的结果名,有其对应的result进行处理
-->
<!-- 配置拦截器,拦截器按照配置的顺序依次拦截 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<!-- 一旦使用了自定义的拦截器,默认的拦截器就不会起作用,因此需要手动在自定义拦截器后
配置默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
三、方法拦截器
方法拦截器(可以对指定方法进行拦截):MethodFilterInterceptor
如果既没有指定includeMethods参数,也没有指定execludeMethods参数,那么所有的方法都有会被拦截。
依旧延续以上的案例
1、编写自定义的方法拦截器
public class MyMethodInterceptor extends MethodFilterInterceptor
{
@Override
protected String doIntercept(ActionInvocation arg0) throws Exception
{
//可以添加监听器
arg0.addPreResultListener(new TheLisener());
System.out.println("method interceptor before");
String s = arg0.invoke();
System.out.println("method interceptor after");
return s;
}
}
2、struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="struts2" extends="struts-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="com.liusheng.interceptor.MyInterceptor">
<!-- 配置初始化参数 ,与成员变量对应赋值,在给成员变量赋值时机在init方法之前进行-->
<param name="test">test</param>
</interceptor>
<!-- 配置方法拦截器 -->
<interceptor name="methodInterceptor" class="com.liusheng.interceptor.MyMethodInterceptor"></interceptor>
</interceptors>
<action name="login" class="com.liusheng.action.LoginAction">
<result name="success">index.jsp</result>
<!-- exception:是对于抛出该处出现的异常进行处理
result:自定义的结果名,有其对应的result进行处理
-->
<!-- 配置拦截器,拦截器按照配置的顺序依次拦截 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="methodInterceptor">
<param name="includeMethods">execute</param>
<param name="execludeMethods"></param>
</interceptor-ref>
<!-- 一旦使用了自定义的拦截器,默认的拦截器就不会起作用,因此需要手动在自定义拦截器后
配置默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
四、自定义默认的拦截器栈
1、配置struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="struts2" extends="struts-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="myInterceptor" class="com.liusheng.interceptor.MyInterceptor">
<!-- 配置初始化参数 ,与成员变量对应赋值,在给成员变量赋值时机在init方法之前进行-->
<param name="test">test</param>
</interceptor>
<!-- 配置方法拦截器 -->
<interceptor name="methodInterceptor" class="com.liusheng.interceptor.MyMethodInterceptor"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myDefaultInterceptorStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="methodInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 自定义默认的拦截器栈,替换掉了系统默认的拦截器栈 -->
<default-interceptor-ref name="myDefaultInterceptorStack"></default-interceptor-ref>
<action name="login" class="com.liusheng.action.LoginAction">
<result name="success">index.jsp</result>
<!-- exception:是对于抛出该处出现的异常进行处理
result:自定义的结果名,有其对应的result进行处理
-->
<!-- 配置拦截器,拦截器按照配置的顺序依次拦截 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="methodInterceptor">
<param name="includeMethods">execute</param>
<param name="execludeMethods"></param>
</interceptor-ref>
<!-- 一旦使用了自定义的拦截器,默认的拦截器就不会起作用,因此需要手动在自定义拦截器后
配置默认拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
如上配置好之后,面对登录不需要进行拦截的请求,只能通过在代码中对该情况进行处理。