struts2的执行流程
当浏览器访问action的时候,会被前端控制器拦截住执行dofilter方法,
在dofilter方法中会判断访问是否是action.如果不是,放行
如果是,会往struts2核心程序里面走
在核心程序中,会创建action的代理对象,但是这个代理对象并不是真正干活的对象
因为在它里面又调用了一个别的对象的方法(invocation.invoke())
这个方法会获取所有的默认拦截器,一个一个的递归判断执行
执行完毕所有的默认拦截器 会执行自己的action方法
action执行完毕会返回一个逻辑视图名给配置文件
配置文件接收到指定的逻辑视图名会走指定的页面
自定义拦截器入门
1 需要创建一个拦截器(javabean)
实现Interceptor
继承AbstractInterceptor
2 为action声明这个创建好的拦截器
3 定义一个拦截器组 组里面可以放1或多个拦截器 注意:组和组可以互相调用 拦截器可以出现在多个组中
4 指定执行组中拦截器
ps(重点): 实现Interceptor 继承AbstractInterceptor 针对的都是action的所有方法
如果要针对action的某一个方法 那就得用别的(工作中使用的)
继承MethodFilterInterceptor:
特点:没有指定某个方法,默认是拦截action的所有方法
1.创建一个拦截器(javabean), 实现Interceptor。
MyInterceptorl1.java
package com.it.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptorl1 implements Interceptor{
//创建
@Override
public void destroy() {
// TODO Auto-generated method stub
}
//销毁
@Override
public void init() {
// TODO Auto-generated method stub
}
//核心拦截方法
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("在action之前执行了");
// 放行
String em = invocation.invoke();//判断有没有下一个 如果没有直接执行action
System.out.println("在action之后执行了");
return em;
}
}
2 为action声明这个创建好的拦截器
3 定义一个拦截器组 组里面可以放1或多个拦截器 注意:组和组可以互相调用 拦截器可以出现在多个组中
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="com.it.action" extends="struts-default" namespace="/">
<!--2.全局的: 为page下面的所有action申明拦截器 -->
<interceptors>
<interceptor name="MyInterceptor1" class="com.it.interceptor.MyInterceptorl1">
</interceptor>
<!-- 3.定义一个拦截器组 -->
<interceptor-stack name="MyInterceptors">
<!-- 指向上面定义好的拦截器 -->
<interceptor-ref name="MyInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 4.执行在访问action的时候 需要执行的拦截器组 -->
<default-interceptor-ref name="MyInterceptors"></default-interceptor-ref>
<action name="ad1" class="com.it.action.ActionDemo1">
<result name="ok">/1.jsp</result>
</action>
</package>
</struts>
测试用的action类
ActionDemo1
package com.it.action;
import com.opensymphony.xwork2.ActionSupport;
public class ActionDemo1 extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println(1111);
return "ok";
}
}
拦截器运行后的结果
拦截器的局部配置,拦截的部分方法配置
<?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 :包的名称
* extends :继承其他的包
* namespace :名称空间
-->
<!-- 1: struts2获取servlet的API -->
<package name="com.it.action" extends="struts-default" namespace="/">
<!--全局的: 为page下面的所有action申明拦截器 -->
<interceptors>
<interceptor name="MyInterceptor1" class="com.it.interceptor.MyInterceptorl1"></interceptor>
<interceptor name="MyInterceptorl2" class="com.it.interceptor.MyInterceptorl2"></interceptor>
<interceptor name="MyInterceptorl3" class="com.it.interceptor.MyInterceptorl3">
<!--使用了继承MethodFilterInterceptor类,可自定义不需要拦截的方法 -->
<!--includeMethods:需要拦截的方法 -->
<!--excludeMethods:不需要拦截的方法 -->
<param name="excludeMethods">findAll</param>
</interceptor>
<!-- 定义一个拦截器组 -->
<interceptor-stack name="MyInterceptors">
<!-- 可以把其他的拦截器组放进来 -->
<!--defaultStack:Struts2默认的拦截器组 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 指向上面定义好的拦截器 -->
<interceptor-ref name="MyInterceptor1"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 执行在访问action的时候 需要执行的拦截器组 -->
<default-interceptor-ref name="MyInterceptors"></default-interceptor-ref>
<!--全局拦截 -->
<action name="ad1" class="com.it.action.ActionDemo1">
<result name="ok">/1.jsp</result>
</action>
<!--局部拦截 -->
<action name="ad2" class="com.it.action.ActionDemo2">
<!-- 局部拦截器 -->
<interceptor-ref name="MyInterceptorl2"></interceptor-ref>
<!-- 局部拦截器组 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="ok">/1.jsp</result>
</action>
<!-- 方法拦截 -->
<action name="ad3" class="com.it.action.ActionDemo3" method="findAll">
<interceptor-ref name="MyInterceptorl3"></interceptor-ref>
<result name="ok">/1.jsp</result>
</action>
</package>
</struts>