Struts2拦截器详解

版权声明:本文为setlilei原创文章 转载请注明来源 https://blog.csdn.net/setlilei/article/details/86663111

Struts2拦截器与JavaEE中的Filter作用类似

<?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="test" namespace="/" extends="struts-default" >
		<!-- 定义全局结果集 -->
		<global-results>
			<result name="toLogin" type="redirect" >/login.jsp</result>
		</global-results>
		<global-exception-mappings>
			<!-- 如出现java.lang.RuntimeException异常 将跳转到名为error的结果 -->
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>

		<action name="UserAction_*" class="com.java.UserAction" method="{1}" >
			<result name="toHome" type="redirect" >/index.htm</result>
			<!-- 配置出现error页面 -->
			<result name="error"  >/login.jsp</result>
		</action>
	</package>
</struts>
<!-- 获得异常对象信息 -->
<s:property value="exception.message" />

自定义拦截器

创建拦截器

//实现Interceptor接口创建拦截器
public class TestInterceptor implements Interceptor {

	@Override
	public void init() {
	}

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		return null;
	}

	@Override
	public void destroy() {
	}
}
//继承AbstractInterceptor抽象类创建拦截器
public class TestInterceptor extends AbstractInterceptor {

	@Override
	//省去书写init方法和destroy方法
	public String intercept(ActionInvocation invocation) throws Exception {
		return null;
	}

}
//继承MethodFilterInterceptor抽象类创建拦截器
public class TestInterceptor extends MethodFilterInterceptor {

	@Override
	//方法过滤拦截器 定制拦截器需要拦截的方法和定制拦截器不需要拦截的方法
	protected String doIntercept(ActionInvocation invocation)
		throws Exception {

		System.out.println("Test拦截器前处理");//拦截器前处理
		String str = invocation.invoke();//放行 如不放行此行代码删去不写
		System.out.println("Test拦截器后处理");//后处理 不放行不会执行

		//return invocation.invoke(); | return str;//放行
		//当前拦截器如不放行则后续的拦截器和Action不会执行
		//Result会根据不放行的拦截器返回的字符串页面跳转
		return "success";
	}
}
拦截器生命周期 随项目启动创建 随项目关闭销毁

配置拦截器

public class TestAction extends ActionSupport {

	public String add() throws Exception {
		System.out.println("TestAction_add");
		return SUCCESS;
	}

	public String delete() throws Exception {
		System.out.println("TestAction_delete");
		return SUCCESS;
	}

	public String update() throws Exception {
		System.out.println("TestAction_update");
		return SUCCESS;
	}

	public String find() throws Exception {
		System.out.println("TestAction_find");
		return SUCCESS;
	}

}

<?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="interceptor" namespace="/" extends="struts-default" >
		<interceptors>
		<!-- 注册拦截器 -->
			<interceptor name="TestInterceptor" class="com.java.interceptor.TestInterceptor"></interceptor>
		<!-- 注册拦截器栈 -->
			<interceptor-stack name="TestStack">
				<!-- 自定义拦截器建议在20个拦截器之前引入 -->
				<interceptor-ref name="TestInterceptor">
				<!-- 拦截方法方式 下列方式二选一 -->
					<!-- 指定哪些方法不拦截 -->
					<!-- <param name="excludeMethods">add,delete</param> -->
					<!-- 指定哪些方法需要拦截 -->
					<param name="includeMethods">update,find</param>
				</interceptor-ref>
				<!-- 引用默认的20个拦截器栈 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>	
		</interceptors>
	<!-- 指定当前package内所有action默认拦截器栈 -->
		<default-interceptor-ref name="TestStack"></default-interceptor-ref>
		<action name="TestAction_*" class="com.java.TestAction" method="{1}" >
			<!-- 指定当前action单独拦截器栈 -->
			<!-- <interceptor-ref name="TestStack"></interceptor-ref> -->
			<result name="success" type="dispatcher" >/index.jsp</result>
		</action>
	</package>
</struts>
浏览器访问 http://localhost:8080/Test/TestAction_update
Console打印如下说明测试成功

	Test拦截器前处理
	TestAction_update
	Test拦截器后处理

拦截器实例

//登录拦截器 除登录功能外 其他功能都被拦截
public class LoginInterceptor extends MethodFilterInterceptor {
	@Override
	//指定不拦截登陆方法 其他方法都拦截
	protected String doIntercept(ActionInvocation invocation) throws Exception {

		//获得session
		Map<String, Object> session = ActionContext.getContext().getSession();
		//获得登陆标识
		Object object = session.get("user");
		//判断登陆标识是否存在
		if(object == null){
			//不存在->没登录->重定向到登录页面
			return "toLogin";
		}else{
			//存在->已经登陆->放行
			return invocation.invoke();
		}

	}

}
<?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="login" namespace="/" extends="struts-default" >
		<interceptors>
			<interceptor name="LoginInterceptor" class="com.java.interceptor.LoginInterceptor"></interceptor>
		<!-- 注册拦截器栈 -->
			<interceptor-stack name="LoginStack">
				<!-- 自定义拦截器建议在20个拦截器之前引入 -->
				<interceptor-ref name="LoginInterceptor">
					<!-- 指定哪些方法不拦截 -->
					<param name="excludeMethods">login</param>
				</interceptor-ref>
				<!-- 引用默认的20个拦截器栈 -->
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<!-- 指定当前package内所有action默认拦截器栈 -->
		<default-interceptor-ref name="TestStack"></default-interceptor-ref>
		<!-- 定义全局结果集 -->
		<global-results>
			<result name="toLogin" type="redirect" >/login.jsp</result>
		</global-results>
		<global-exception-mappings>
			<!-- 如出现java.lang.RuntimeException异常 将跳转到名为error的结果 -->
			<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
		</global-exception-mappings>
		<action name="UserAction" class="com.java.TestAction" method="login" >
			<!-- 指定当前action单独拦截器栈 -->
			<interceptor-ref name="LoginStack"></interceptor-ref>
			<result name="success" type="dispatcher" >/index.jsp</result>
		</action>
	</package>
	<package name="this" namespace="/" extends="struts-default" >
		<action name="OneAction" class="com.java.OneAction" method="execute" >
			<result name="success" type="dispatcher" >/one.jsp</result>
		</action>
		<action name="TwoAction" class="com.java.TwoAction" method="execute" >
			<result name="success" type="dispatcher" >/two.jsp</result>
		</action>
	</package>
</struts>

struts2常用标签

<!-- jsp页面引入struts标签库 -->
<%@ taglib prefix="s" uri="/struts-tags"%>

<!-- 遍历标签 -->
<!-- 不使用var 会把集合遍历到栈顶 下面直接获取即可 -->
<s:iterator value="list" >
	<!-- 获取栈顶的 -->
	<s:property />
</s:iterator >
<!-- 使用var 会以var值为kay把集合遍历到ActionContext中 -->
<s:iterator value="list" var="user" >
	name : <s:property value="#user.name" />
</s:iterator >

<!-- int i = 1,i<=100,i++ -->
<s:iterator begin="1" end="100" step="1">
	number : <s:property />
</s:iterator>

<!-- 逻辑标签 -->
<s:if test="#list.size()>4">list长度>4</s:if>
<s:elseif test="#list.size()<4">list长度<4</s:elseif>
<s:else>list长度=4</s:else>

<!-- 表单标签 -->
<!-- 
	action填写struts.xml中action的name
	根据栈中属性参数自动回显 EL写法${param.name}
	theme:指定表单样式
		xhtml:默认样式
		simple:无样式
 -->
<s:form action="Demo3Action" namespace="/" theme="xhtml" >
	<s:textfield name="name" label="用户名"  ></s:textfield>
	<s:password name="password" label="密码" ></s:password>
	<!-- 提供List|Map给list属性作为选项 提交时 gender="男" gender="女" -->
	<s:radio list="{'',''}" name="gender" label="性别" ></s:radio>
	<!-- 提交时 gender="1" gender="0" -->
	<s:radio list="#{1:'',0:''}" name="gender" label="性别" ></s:radio>
	<!-- 提交时 habits="2"&habits="1"&habits="0" -->
	<s:checkboxlist list="#{2:'one',1:'two',0:'three'}" name="habits" label="爱好" ></s:checkboxlist>
	<s:select list="#{2:'大专',1:'本科',0:'硕士'}" headerKey="" headerValue="---请选择---" name="edu" label="学历" >
	</s:select>
	<s:file name="photo" label="近照" ></s:file>
	<s:textarea name="desc" label="个人简介" ></s:textarea>
	<s:submit value="提交" ></s:submit>
</s:form>

<!-- 
	public String excute() throws Exception {
		this.addActionError("错误信息");
	}
 -->
<s:actionerror/>

<!-- 日期标签 -->
<s:date name="user.birthday" format="dd/MM/yyyy" />
<s:date name="user.birthday" format="%{getText('some.i18n.key')}" />
<s:date name="user.birthday" /><!-- 默认格式显示 -->

<!-- 调试标签 -->
<s:debug></s:debug>

猜你喜欢

转载自blog.csdn.net/setlilei/article/details/86663111