目录
1. Struts2的拦截器
1.1 拦截器概述
- 拦截器,在AOP中用于在某个方法或某个字段被访问之前,进行拦截然后再之前或之后加入某些操作。拦截是AOP的一种实现策略。
- 拦截器是动态拦截Action调用对象。它提供了一种机制可以使开发者定义一个action执行的前后的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
- 拦截器和过滤器的区别
- 拦截器:
Interceptor
,拦截客户端对Action的访问。是一种更加细粒度化的拦截,可以拦截Action中具体的方法。 - 过滤器:
Filter
,用于过滤客户端向服务器端发送的请求。
- 拦截器:
- Struts2框架核心的功能都是依赖拦截器实现的。
1.2 拦截器的实现原理
- 不部分的时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispathce时,Struts2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个列表,最后一个一个地调用列表中地拦截器。
- Struts2拦截器时可插拔地,拦截器时AOP地以一种实现。Struts2拦截器栈就是将拦截器按一定地顺序联结成一条链。在访问被拦截地方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用。
1.3 Struts的执行流程
- 客户端向服务器发送一个
Action
的请求,执行核心过滤器(doFilter
)方法。在这个方法中,调用executeAction()
方法,在这个方法内部调用dispatcher.serviceAction();
在这个方法内部创建一个Action
代理,最终执行的是Action
代理中的execute()
,在代理中执行的execute
方法中调用ActionInvocation
的invoke
方法。在这个方法内部递归执行一组拦截器(完成部分功能),如果没有下一个拦截器,就会执行目标Action
,根据Action
的返回的结果进行页面跳转。
1.4 拦截器入门
1.4.1 环境搭建
-
新建工程,导入需要的
jar
包。 -
在
web.xml
中配置配置核心过滤器。 -
新建
Action
类com.itzhouq.web.action.ActionDemo1
package com.itzhouq.web.action; import com.opensymphony.xwork2.ActionSupport; public class ActionDemo1 extends ActionSupport { @Override public String execute() throws Exception { System.out.println("ActionDemo1执行了......"); return super.execute(); } }
-
在主配置文件
struts.xml
中配置Action
<?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> <!-- 开启静态方法 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <package name="demo1" extends="struts-default" namespace="/"> <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1"> <result>/demo1/test.jsp</result> </action> </package> </struts>
-
编写跳转页面
../WebContent/demo1/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>test.jsp</h1> <% System.out.println("test.jsp执行了......."); %> </body> </html>
-
测试
- 在浏览器访问工程下的
../actionDemo1.action
- 页面打印了
test.jsp
- 后台控制台打印了
ActionDemo1执行了......
和test.jsp执行了.......
- 环境搭建成功。
- 在浏览器访问工程下的
1.4.2 编写拦截器
-
在
com.itzhouq.web.interceptor
下编写两个拦截器package com.itzhouq.web.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /** * 自定义拦截器一: * @author itzhouq * */ public class InterceptorDemo1 extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("InterceptorDemo1执行了......"); String str = invocation.invoke(); System.out.println("InterceptorDemo1执行结束了......"); return str; } }
1.4.3 配置拦截器
-
方式一:定义拦截器进行配置
-
注意:一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了。所以,需要手动引入默认拦截器。
-
在主配置文件做如下配置
<?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> <!-- 开启静态方法 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <package name="demo1" extends="struts-default" namespace="/"> <!-- 定义拦截器 --> <interceptors> <interceptor name="interceptorDemo1" class="com.itzhouq.web.interceptor.InterceptorDemo1"/> <interceptor name="interceptorDemo2" class="com.itzhouq.web.interceptor.InterceptorDemo2"/> </interceptors> <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1"> <result>/demo1/test.jsp</result> <!-- 引入拦截器(一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了) --> <interceptor-ref name="defaultStack"/> <interceptor-ref name="interceptorDemo1"/> <interceptor-ref name="interceptorDemo2"/> </action> </package> </struts>
-
方式二:定义拦截器栈的方式
<struts> <!-- 开启静态方法 --> <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant> <package name="demo1" extends="struts-default" namespace="/"> <!-- 定义拦截器 --> <interceptors> <interceptor name="interceptorDemo1" class="com.itzhouq.web.interceptor.InterceptorDemo1"/> <interceptor name="interceptorDemo2" class="com.itzhouq.web.interceptor.InterceptorDemo2"/> <!-- 定义拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="interceptorDemo1"/> <interceptor-ref name="interceptorDemo2"/> </interceptor-stack> </interceptors> <action name="actionDemo1" class="com.itzhouq.web.action.ActionDemo1"> <result>/demo1/test.jsp</result> <!-- 引入拦截器(一旦引入自定义拦截器,默认拦截器栈的拦截器就不执行了) --> <interceptor-ref name="myStack"/> </action> </package> </struts>
-
测试:
- 在浏览器访问工程下的
../actionDemo1.action
. - 页面打印了
test.jsp
. - 后台信息如下:
- 在浏览器访问工程下的
2. Struts2的标签库
2.1 通用标签库
-
判断标签:
<s:if>
、<s:elseif>
、<s:else>
-
迭代标签:
<s:iterator>
-
其他标签:
<s:property/>
<s:debug>
<s:date>
----在页面上进行日期格式化
-
举例:编写
../WebContent/demo2/test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <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:iterator> <hr> <s:iterator var="entry" value="#{'aaa':'111', 'bbb':'222','ccc':'333' }"> <s:property value="#entry.key"/>--<s:property value="#entry.value"/><br> </s:iterator> <hr> <s:iterator var="i" begin="100" end="150" 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> </body> </html>
-
测试:访问工程下
../demo2/test.jsp