Struts2的执行流程(面试问题),拦截器的使用

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";
	}
}

拦截器运行后的结果

 

方法拦截器

package com.it.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
//如果需要针对action类中的某个方法进行拦截,需要继承的是MethodFilterInterceptor
public class MyInterceptorl3 extends MethodFilterInterceptor{

	@Override
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		System.out.println("拦截前的");
		String bm = invocation.invoke();
		System.out.println("拦截后的");
		return bm;
	}

}

 

拦截器的局部配置,拦截的部分方法配置

 

<?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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Exception.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值