struts拦截器
概述
拦截器,在面向切面编程中用于在某个方法或字段被访问之前,进行拦截然后在方法执行之前或之后加入某些操作。拦截是AOP面向切面编程的一种实现策略。
实现原理
Struts2拦截器的实现原理相对简单,当请求struts2的action时,请求到达struts2的servletDispatcher的时候,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中的拦截器。
struts2的拦截器是可插拔的。拦截器栈就是将拦截器按顺序联结成一条链,再访问被拦截的方法或者字段的时候拦截器链中的拦截器就会按之前定义的顺序被调用
struts2的执行流程
自定义拦截器
方式一.实现接口-Interceptor
import com.opensymphony.xwork2.interceptor.Interceptor;
public class jiekoushixian implements Interceptor{
@Override
public void destroy() {
}
@Override
public void init() {
}
@Override
public String intercept(ActionInvocation arg0) throws Exception {
return null;
}
}
实现这个接口,需要实现他的三个方法。
方式二.继承抽象拦截器类AbstractInterceptor
这个抽象类以及实现了init和destroy方法,只需要实现intercept方法
public class InterceptorDemo1 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("InterceptorDemo1执行了...");
String obj=invocation.invoke();
System.out.println("InterceptorDemo1结束");
return obj;
}
}
拦截器的配置
1.拦截器
<package name="demo1" extends="struts-default" namespace="/">
方式一:定义拦截器
<interceptors>
<interceptor name="interceptorDemo1" class="com.itheima.web.interceptor.InterceptorDemo1"></interceptor>
<interceptor name="interceptorDemo2" class="com.itheima.web.interceptor.InterceptorDemo2"></interceptor>
</interceptors>
<action name="actionDemo1" class="com.itheima.web.action.ActionDemo1">
<result>/demo1/demo1.jsp</result>
<!--引入拦截器(一旦引入自定义拦截器,默认拦截器栈里面的拦截器就不执行了) 所以就续收手动去引入那些必要的拦截器-->
<interceptor-ref name="interceptorDemo1"></interceptor-ref>
<interceptor-ref name="interceptorDemo2"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
2.拦截器栈
<package name="demo1" extends="struts-default" namespace="/">
<!-- 方式二:自定义拦截器栈 -->
<interceptors>
<!-- 拦截器 -->
<interceptor name="interceptorDemo1" class="com.itheima.web.interceptor.InterceptorDemo1"></interceptor>
<interceptor name="interceptorDemo2" class="com.itheima.web.interceptor.InterceptorDemo2"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="interceptorDemo1"></interceptor-ref>
<interceptor-ref name="interceptorDemo2"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="actionDemo1" class="com.itheima.web.action.ActionDemo1">
<result>/demo1/demo1.jsp</result>
<!-- 对应方式二:引入拦截器栈 -->
<interceptor-ref name="myStack"></interceptor-ref>
</action>
</package>
struts2的标签库
1.控制标签
1.1 if、elseif、else标签
1.2 iterator标签,属性包括begin/end/status/step/value/var,其中status包含count、first、last、index、even、odd等方法
1.3 数据标签常用的有<s:property>、<s:a>、<s:debug>、<s:include>、<s:sparam>
<s:property>
<s:a>
<s:set var="i" value="5" scope="request"/>
<s:if test="#request.i>3">
i 大于 3
</s:if>
<s:elseif test="#request.i<3">
i 小于 3
</s:elseif>
<s:else>
i 等于 3
</s:else>
<s:iterator var="i" value="{'aa','bb','cc'}">
<s:property value="#i"/> <s:property value="i"/><br/>
</s:iterator>
<hr/>
<s:iterator var="entry" value="#{'aaa':'111','bbb':'222','ccc':'333'}">
<s:property value="#entry.key"/>--<s:property value="#entry.value"/>
<s:property value="key"/>--<s:property value="value"/><br/>
</s:iterator>
<hr/>
<s:iterator var="i" begin="1" end="10" step="1">
<s:property value="#i"/>
</s:iterator>
<hr/>
<s:iterator var="i" begin="100" end="300" step="5" status="status">
<s:if test="#status.count % 3 == 0">
<font color="red"><s:property value="#i"/></font>
</s:if>
<s:else>
<s:property value="#i"/>
</s:else>
</s:iterator>
2.UI标签
2.1<s:form>标签
2.2<s:submit>标签
2.3<s:textfield>和<s:textarea>
2.4<s:password>
2.5<s:radio>
2.5<s:checkboxlist>
2.7<s:select>
2.8<s:hidden>
2.9<s:reset>
2.x代码
<h1>UI标签</h1>
<h3>传统的表单</h3>
<form action="${ pageContext.request.contextPath }/uiAction.action" method="post">
<input type="hidden" name="id"/>
用户名:<input type="text" name="name"/><br/>
密码:<input type="password" name="password"><br/>
年龄:<input type="text" name="age"><br/>
性别:<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女<br/>
籍贯:<select name="city">
<option value="">-请选择-</option>
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="深圳">深圳</option>
<option value="韩国">韩国</option>
</select><br/>
爱好:<input type="checkbox" name="hobby" value="basketball"/>篮球
<input type="checkbox" name="hobby" value="football"/>足球
<input type="checkbox" name="hobby" value="volleyball"/>排球
<input type="checkbox" name="hobby" value="pingpang"/>乒乓球<br/>
介绍:<textarea name="info" cols="8" rows="2"></textarea><br/>
<input type="submit" value="提交"/>
</form>
<s:debug></s:debug>
<h3>UI标签的表单</h3>
<s:form action="uiAction" namespace="/" method="post" >
<s:hidden name="id" />
<s:textfield name="name" label="用户名"/>
<s:password name="password" label="密码" showPassword="true"/>
<s:textfield name="age" label="年龄"/>
<s:radio list="{'男','女'}" name="sex" label="性别"/>
<s:select list="{'北京','上海','深圳','韩国'}" name="city" label="籍贯" headerKey="" headerValue="-请选择-"/>
<s:checkboxlist list="#{'basketball':'篮球','football':'足球','volleyball':'排球','pingpang':'乒乓球'}" name="hobby" label="爱好"/>
<s:textarea name="info" cols="8" rows="2" label="介绍" ></s:textarea>
<s:submit value="提交"/>
</s:form>