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

拦截器运行后的结果

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

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

猜你喜欢

转载自blog.csdn.net/qq_43122641/article/details/89360566