版权声明:本文为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>