struts2小结

来源:互联网 发布:外汇的算法 编辑:程序博客网 时间:2024/05/22 02:12

1.Struts2下载

下载地址:http://struts.apache.org/download.cgi

2.Struts2的配置详解

解决在断网环境下,配置文件无提示的问题
我们可以看到Struts.xml在断网的情况下,前面有一个叹号,这时,我们按alt+/ 没有提示,这是因为” http://struts.apache.org/dtds/struts-2.0.dtd”是一个网络地址,如果上网的话,IDE会自动帮我们下载此文件,如果断网就没有办法了,但是我们还是有解决方法的.
首先在源码包里找到struts-2.0.dtd这个文件
在MyEclipse中菜单栏中选择:windowPreferencesMyEclipseFiles and Editors
Xmlxml Catalog在右边的下拉框中选择User Specified Entries点击Add按钮左边选中Catalog Entry右边的location中点击File System在弹出的对话框中将搜索到的文件全路径复制上去,并选中struts-2.0.dtd在key type下拉框中选择URIkey文本框中填写: http://struts.apache.org/dtds/struts-2.0.dtd ,点击OK即可. 这时我们可以看到Struts.xml文件中还有叹号,我们可以在Struts标签与package标签中打入一个回车后保存即可.

首先,我们先配置一个HelloWorld程序
环境的搭建和前面讲的一模一样,导6个jar包,复制struts.xml文件到src目录下,改写web.xml文件,将struts整合到web工程中,这里就不再演示
以下是代码:
Chapter1Action
package chapter1.action;

public class Chapter1Action {
private String message;

public String getMessage() {
   return message;
}

public String execute() {
   message = "我的第一个Struts2程序";
   return "success";
}


Struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="false"/>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.serve.static.browserCache" value="false"/>
<include file="chapter1.xml"/>
</struts> 

chapter1.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="chapter1" namespace="/chapter1" extends="struts-default">
   <action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute">
    <result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result>
   </action>
</package>
</struts> 

HelloWorld.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>HelloWorld</title>
</head> 
<body>
    ${message}
</body>
</html>

问题一:大家可以看到这里用到了EL表达式,我们知道EL表达式只能取出page,request,session,application四个范围之一里面的数据,但是我这里并没有将任何数据放入到四个范围中,为什么这里能够取出数据来呢?
问题二: Chapter1Action是一个非常普通的类,它不是Servlet,为什么能够处理用户的请求呢?

Struts2用于处理用户请求的Action,没有与Servlet API耦合,显示无法处理用户请求,而Struts2提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并调用Action的execute方法来处理用户的请求.

Struts.xml配置中包与action的介绍
<package name="chapter1" namespace="/chapter1" extends="struts-default">
<action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute">
   <result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result>
</action>
</package> 

Struts2框架中使用包来管理action,避免了Servlet在web.xml中难以管理的与维护的局面.包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action,在实际应用中,我们应该把一组业务功能相关的action 放在同一个包下.

配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,如果其他包要继承该包,必须通过该属性进行引用,包的namespace属性用于定义该包的命名空间,命名空间作用为访问该包下的action路径的一部分,见示例.namespace属性可以不配置,如果不指定该属性,默认的命名空间为””

通常每个包都应该继承struts-default包,因为struts2很多核心功能都是拦截来实现的,如,从请求中把请求参数封闭到action,文件上传和数据验证等都是通过拦截器实现的,struts-default定义了这些拦截器和Result类型,可以这么说,当包继承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar文件中的struts-defalut.xml中定义,struts-default.xml也是struts2默认配置文件,struts2每次都会自动加载struts-default.xml文件.

package还有一个abstract=”true”属性,指定此包为抽象包,和抽象类的概念差不多,说明此包只能被其他包继承,则它里面不允许包含action元素.

<action name="HelloWorld" class="chapter1.action.Chapter1Action" method="execute">
<result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result>
</action> 
Action 元素method属性,默认值为method=”execute”,也就是当action接收到请求后,交给哪个方法去处理,默认的是交给execute方法去处理,当然,也可以交给其他方法,后面会讲解到.

<result name="success">/WEB-INF/JspPage/chapter1/HelloWorld.jsp</result> 
result元素主要定义视图的跳转和返回的行为及类型,后面会详细介绍.

struts.xml文件的分离
从上一个项目实践中可以看到,我们的web.xml文件非常之大,到后来是越来越难的查找与维护,看得头都是大的,Struts2配置文件可以分离,很好的解决了此问题.
通过主次配置文件的分离,可以加强团队间的合作,并且互不打扰彼此的配置文件,出了问题也知道责任在哪里.
在实例开发中也是这样做的,通过一个主文件中,打开全局开关,引入其他子配置文件,如:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="false"/>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.serve.static.browserCache " value="false"/>
<include file="chapter1.xml"/>
</struts> 

常用开关的介绍
<constant name="struts.i18n.encoding" value="UTF-8"/>
指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法
<constant name="struts.action.extension" value="do"/>
该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。    如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。   
<constant name="struts.serve.static.browserCache " value="false"/>
设置浏览器是否缓存静态内容,默认值为true,开发阶段最好false
<constant name="struts.configuration.xml.reload" value="true"/>
当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false,开发阶段最好true
<constant name="struts.devMode" value="true"/>
开发模式下设为true,这样可以打印出更详细的错误信息
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
动态方法调用,可以解决多个请求对应一个Servlet的问题,后面详细讲解,默认为true,关闭则设为false.

这里只是列举了一些常用的开关,当然还有许多其他的开关,后面的学习中会逐渐介绍,大家在这里先了解一下.

以下是从网上摘得的,比较全的一个资料
struts.serve.static.browserCache 该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时,我们希望每次请求都获得服务器的最新响应,则可设置该属性为false。

struts.enable.DynamicMethodInvocation 该属性设置Struts 2是否支持动态方法调用,该属性的默认值是true。如果需要关闭动态方法调用,则可设置该属性为false。

struts.enable.SlashesInActionNames 该属性设置Struts 2是否允许在Action名中使用斜线,该属性的默认值是false。如果开发者希望允许在Action名中使用斜线,则可设置该属性为true。

struts.tag.altSyntax 该属性指定是否允许在Struts 2标签中使用表达式语法,因为通常都需要在标签中使用表达式语法,故此属性应该设置为true,该属性的默认值是true。

struts.devMode该属性设置Struts 2应用是否使用开发模式。如果设置该属性为true,则可以在应用出错时显示更多、更友好的出错提示。该属性只接受true和flase两个值,该属性的默认值是false。通常,应用在开发阶段,将该属性设置为true,当进入产品发布阶段后,则该属性设置为false。

struts.i18n.reload该属性设置是否每次HTTP请求到达时,系统都重新加载资源文件。该属性默认值是false。在开发阶段将该属性设置为true会更有利于开发,但在产品发布阶段应将该属性设置为false。

提示 开发阶段将该属性设置了true,将可以在每次请求时都重新加载国际化资源文件,从而可以让开发者看到实时开发效果;产品发布阶段应该将该属性设置为false,是为了提供响应性能,每次请求都需要重新加载资源文件会大大降低应用的性能。

struts.ui.theme该属性指定视图标签默认的视图主题,该属性的默认值是xhtml。
struts.ui.templateDir该属性指定视图主题所需要模板文件的位置,该属性的默认值是template,即默认加载template路径下的模板文件。
struts.ui.templateSuffix该属性指定模板文件的后缀,该属性的默认属性值是ftl。该属性还允许使用ftl、vm或jsp,分别对应FreeMarker、Velocity和JSP模板。
struts.configuration.xml.reload该属性设置当struts.xml文件改变后,系统是否自动重新加载该文件。该属性的默认值是false。
struts.velocity.configfile该属性指定Velocity框架所需的velocity.properties文件的位置。该属性的默认值为velocity.properties。
struts.velocity.contexts该属性指定Velocity框架的Context位置,如果该框架有多个Context,则多个Context之间以英文逗号(,)隔开。
struts.velocity.toolboxlocation该属性指定Velocity框架的toolbox的位置。
struts.url.http.port该属性指定Web应用所在的监听端口。该属性通常没有太大的用户,只是当Struts 2需要生成URL时(例如Url标签),该属性才提供Web应用的默认端口。
struts.url.https.port该属性类似于struts.url.http.port属性的作用,区别是该属性指定的是Web应用的加密服务端口。
struts.url.includeParams该属性指定Struts 2生成URL时是否包含请求参数。该属性接受none、get和all三个属性值,分别对应于不包含、仅包含GET类型请求参数和包含全部请求参数。
struts.custom.i18n.resources该属性指定Struts 2应用所需要的国际化资源文件,如果有多份国际化资源文件,则多个资源文件的文件名以英文逗号(,)隔开。
struts.dispatcher.parametersWorkaround 对于某些Java EE服务器,不支持HttpServlet Request调用getParameterMap()方法,此时可以设置该属性值为true来解决该问题。该属性的默认值是false。对于WebLogic、Orion和OC4J服务器,通常应该设置该属性为true。
struts.freemarker.manager.classname 该属性指定Struts 2使用的FreeMarker管理器。该属性的默认值是org.apache.struts2.views.freemarker.FreemarkerManager,这是Struts 2内建的FreeMarker管理器。
struts.freemarker.wrapper.altMap该属性只支持true和false两个属性值,默认值是true。通常无需修改该属性值。
struts.xslt.nocache 该属性指定XSLT Result是否使用样式表缓存。当应用处于开发阶段时,该属性通常被设置为true;当应用处于产品使用阶段时,该属性通常被设置为false。
struts.configuration.files 该属性指定Struts 2框架默认加载的配置文件,如果需要指定默认加载多个配置文件,则多个配置文件的文件名之间以英文逗号(,)隔开。该属性的默认值为struts-default.xml,struts-plugin.xml,struts.xml,看到该属性值,读者应该明白为什么Struts 2框架默认加载struts.xml文件了。 
在请求时,路径后的后缀action可要可不要,即下面的两种请求都是可以的
http://localhost:8080/Struts2/chapter1/HelloWorld
http://localhost:8080/Struts2/chapter1/HelloWorld.action

Action配置中的各项默认值
请看下面的代码
<action name="Login">
<result>/WEB-INF/JspPage/chapter1/Login.jsp</result>
</action> 
我们发现,当我们请求的路径为http://localhost:8080/Struts2/chapter1/Login时,同样可以实现页面的跳转,这是怎么回事呢?
如果没有为action指定class,默认是ActionSupport类
<action name="Login"> 
相当于 
<action name="Login" class="com.opensymphony.xwork2.ActionSupport">
如果没有为action指定method,默认执行action中的execute()方法
<action name="Login">
相当于
<action name="Login" class="com.opensymphony.xwork2.ActionSupport"
method="execute">
如果没有指定result的name属性,默认值为success.
<result>相当于<result name="success">


提出一个问题ActionSupport这个类到底是个什么类呢?
首先要肯定的一点是他是一个具有execute方法的类,并且execute方法返回”success”字符串,因为只有这样,前面的运行结果才能说的通. ActionSupport还实现了很多其他的结果,提供了许多定制的功能.


ActionSupport类的作用 
struts2不要求我们自己设计的action类继承任何的struts基类或struts接口,但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。 
Struts2中通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的getter和setter方法。
课堂笔记
默认值
class="" ActionSupport
method="" execute
name="" “success”
Action接口里提供了一些常量及execute方法,通常我们自己写的Action可以实现这个接口, ActionSupport已经实现了这个接口,并且还实现了验证,国际化等功能的接口,所以我们自己写的Action类通常会继承ActionSupport这个类来达到启用验证框架,国际化,自动转换等功能的目的.


struts2标签讲解

要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可:<%@ taglib prefix="s" uri="/struts-tags"%>

struts2的标签共分为五大类:

一、逻辑控制标签

用于进行逻辑控制输出。主要分以下几类:

1)条件标签:用于执行基本的条件流转

<s:if>:拥有一个test属性,其表达式的值用来决定标签里内容是否显示。<s:if test="#request.username=='hzd'">欢迎hzd</s:if>

<s:elseif>:同上。

<s:else>

2)迭代标签:用于遍历集合(java.util.Collection)或者枚举值(java.util.Iterator)类型的对象,value属性表示集合或枚举对象,status属性表示当前循环的对象,在循环体内部可以引用该对象的属性

<s:iterator value="userList" status="user">

姓名:<s:property value="user.userName" />

年龄:<s:property value="user.age" />

</s:iterator>

3)组合标签:用于将多个枚举值对象进行叠加,形成一个新的枚举值列表

如将3个列表对象进行了组合,形成新的列表对象:

<s:append var="newIteratorList">

<s:param value="%{myList1}" />

<s:param value="%{myList2}" />

<s:param value="%{myList3}" />

</s:append>

输出:

<s:iterator value="%{#newIteratorList}">

<s:property />

</s:iterator>

4)分割标签:用于将一个字符串进行分隔,产生一个枚举值列表

下面的代码将分隔为3个字符串,然后循环输出

<s:generator val="%{'aaa,bbb,ccc'}">

<s:iterator>

<s:property />

</s:iterator>

</s:generator>

5)合并标签:用于将多个枚举值按照数组的索引位置进行合并

<s:merge var="newMergeList">

<s:param value="%{mylist1}">--设mylist1列表中有a,b,c三个元素

<s:param value="%{mylist2}">--设mylist2列表中有1,2,3三个元素

</s:merge>

合并后新的列表的元素及其顺序为:a,1,b,2,c,3

<s:iterator value="%{#newMergeList}">

<s:property />

</s:iterator>

6)排序标签:用于对一组枚举值进行排序,属性comparator指向一个继承自java.util.Comparator的比较器,该比较器可以是对应Action页面中的一个比较器变量,source指定要排序的列表对象

<s:sort comparator="myComparator" source="myList">

<s:iterator>

<s:property value="..."/>

</s:iterator>

</s:sort>

7)子集标签:用于取得一个枚举列表的子集,source用于指定检索的列表对象,start用于指定起始检索的索引位置,count用于指定检索的结果数量,decider属性必须是一个org.apache.struts2.util.SubsetIteratorFilter.Decider类的子类实例,用以指定检索的条件。例如在Action中提供了以下方法用来取得一个Decider对象:

public Decider getDecider()

{

return new Decider(){

public boolean decide(Object element) throws Exception{

int i=((Integer)element).intValue();

return (((i%2)==0)?true:false);

}

};

}

然后引用该对象筛选子集:

<s:subset source="myList" decider="decider">

</s:subset>

或者不使用Decider对象:

<s:subset source="myList" count="13" start="3">

</s:subset>

 

二、数据输出标签

数据输出标签用以输出页面中的元素、属性、隐含变量等,即包括静态文本的输出,也包括struts2集成的各种变量的输出。

1)链接标签:用于创建一个<a>标签,errorText用于显示错误信息,priInvokeJS表示该链接执行时的javascript提示函数,href表示跳转地址.

<s:a errorText="删除错误" preInvokeJS="confirm('确认删除?')" href="test.jsp">

<img src="/image/delete.gif" />

</s:a>

2)Action标签:可以直接调用Action类中的函数,前提是该Action类在struts.xml中有定义,name属性用于指向映射文件中配置的Action函数,executeResult属性表示是否执行结果集的跳转

<s:action name="LoginAction" executeResult="true" />--表示执行LoginAction的默认处理方法execute()

<s:action name="LoginAction!login" executeResult="true" />--表示执行LoginAction的处理方法login()

3)JavaBean标签:用于创建一个JavaBean对象,name表示JavaBean类全名,var表示变量的实例名,并可以包含<s:param>设置实例化输入参数

<s:bean name="xxx,xxx,xxx" var="xxx">

<s:param name="name" value="hzd" />--为该JavaBean的构造方法传递参数

</s:bean>

4)日期标签:用以输出一个格式化的日期对象,name表示要输出的对象,format表示输出的日期格式

 <s:date name="user.birthday" format="dd/MM/yyyy" />

<s:date name="user.birthday" format="%{getText('some.i18n.key')}" />

<s:date name="user.birthday" />--默认格式

5)调用标签:用以输出页面的值栈调试信息,通常在进行程序调用时使用,便于查找JSP页面中的错误

6)引用资源文件标签:用于加载资源包到值栈,它可以允许<s:text>标签访问任何资源包的信息,而不只是当前action相关联的资源包。name属性用以指定资源包的类路径

如xxx.xxx.xxx.ApplicationMessages中定义了标签:HelloWord=欢迎您!

则可以这样引用:

<s:i18n name="xxx.xxx.xxx.ApplilcationMessages">

<s:text name="HelloWord" />

</s:i18n>

7)包含页面标签:用来包含一个Servlet的输出(Servlet或JSP页面),使用value属性指定包含页名称,可以使用<s:param>传递参数给子页

<s:include value="/test.jsp">

<s:param name="username">hzd</s:param>--参数username=hzd给test.jsp页面

</s:include>

8)传递参数标签:用来为其他标签提供参数,所以一般是嵌套在其它标签的内部,name属性用来指定参数名称,value(可选)属性用来指定参数值

<s:param name="username" value="hzd" />--这种方式的参数值会以String格式放入stack

<s:param name="username">hzd</s:param>--这种方式的参数值会以Object的格式放入stack

9)值栈标签:用以加入一个值到值栈中

<s:push value="user">

<s:property value="name" />--为user指定name属性

<s:property value="age" />--为user指定age属性

</s:push>

10)变量赋值标签:赋予变量一个特定范围内的值,name属性表示变量的名字,scope表示变量的作用域(application.session.request.page.action),value变量的值

<s:set>

11)国际化标签:用于输出国际化信息,name属性指定国际化资源文件中消息文本的key,可以与<s:i18n>标签结合使用

<s:text name="HelloWord" />--它会按照一定的顺序查找资源文件,直到找到定义HellowWord标签的资源文件为止

12)链接标签:用于创建一个URL链接,并可以通过<s:param>标签提供request参数

<s:url id="url" value="/test.jsp">

<s:param name="username">hzd</s:param>

</s:url>

13)属性标签:用以输出value属性的值,并拥有一个default属性,在value对象不存在时显示。escape属性为true,来输出原始的HTML文本

<s:property value="getText('some.key')">

 

三、HTML表单标签

HTML标签都拥有以下3个设置样式的属性。

templateDir:执行模板路径

theme:指定主题名称,可选值包括simple、xhtml、ajax等

template:指定模板名称

使用HTML表单标签会生成大量格式化的HTML代码,这些代码是由struts2的模板生成的,这样的好处是可以让我们的jsp代码十分简单,只需要配置使用不同的主题模板,就可以显示不同的页面样式。

struts2默认提供了5种主题(在此不做详细介绍):

simple主题:最简单的主题

XHTML主题:默认主题,使用常用的HTML技巧

CSS XHTML主题:使用CSS实现的XHTML主题

archive主题:使用文档生成主题

AJAX主题:基于AJAX实现的主题

通过在struts.properties文件中改变struts.ui.theme,struts.ui.templateDir,struts.ui.templateSuffix三个标签来自由切实可行换主题

由于HTML表单标签也不少,所以还是要用的时候在网上找吧...

 四、HTML非表单标签

主要用来输出各种错误和消息。

1)错误标签:用以输出Action错误信息

<s:actionerror />

2)消息标签:用以输出Action普通消息

<s:atcionmessage />

3)字段错误标签:用以输出Action校验中某一个字段的错误信息或所有字段的错误信息

<s:fielderror />--输出所有字段的错误信息

<s:fielderror>

<s:param>username</s:param>--输出字段username的错误信息

<s:param>password</s:param>--输出字段password的错误信息

<s:fielderror>

4)DIV标签:用以输出一个<div>标签

 

五、AJAX标签

AJAX标签是struts2专门提供的一组进行AJAX操作的标签,在使用这些标签之前,需要在JSP页面中添加如下引用:

<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>

1)链接标签:用于创建一个<a>链接,并且在单击该链接时执行异步的请求,该标签的url属性必须使用<s:url/>标签进行设置,target属性指向要被更新的页面组件,showLoadingText属性决定是否显示文本,indicator表示异步请求时要显示的图片

使用form标签:

<s:div id="targetDiv">

<s:form action="LoginAction">

<sx:a targets="targetDiv" showLoadingText="false" indicator="loadingImage" />

</s:form>

</s:div>

使用url标签:

<s:div id="targetDiv">

<s:url id="ajaxTest" value="/LoginAction.action">

<sx:a targets="targetDiv" href="%{ajaxTest}" showLoadingText="false" indicator="loadingImage" />

</s:div>

2)自动完成标签:是一个组合框组件,在文本框中输入文本,能够给出一个下拉的提示列表。list属性用以指定一个自动提示检索的列表集合(可以是Action中的List类型的属性),autoComplete属性为true时表示进行自动提示

<sx:autocompleter name="test" list="{'上海','湖南',广东}" autoCompleter="true" />

3)自动事件绑定标签:该标签可以为多个对象的多个事件进行监听,并能够发送异步请求。src属性指定监听的对象源,events属性指定监听的事件类型(JavaScript事件),target属性指定异步返回内容填充的目标,indicator属性表示执行异步请求时显示的图片

<s:div id="targetDiv">

<s:form action="login">

<s:submit id="bin" />

<s:bind src="bin" events="onclick" targets="targetDiv" showLoadingText="false" indicator="%{getText('loadingImage')}" />

</s:form>

</s:div>

4)日期选择标签:用以弹出一个日期和时间的选择窗口,displayFormat属性指定要选择日期的格式,name表示当前组件的属性的对象,value表示默认值,label表示显示的文本

<sx:datetimepicker name="order.date" label="Order Date" displayFormat="yyyy-MM-dd" value="%{'2006-01-01'}" />

5)树标签:用以输出一个树形结构

<sx:tree>

6)Tab页标签:使用AJAX的方式显示多个Tab页

<s:tabbedpanel>


Struts2工作原理

Struts2请求响应流程:

 

在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller、ActionProxy、ActionMapping、Configuration Manager、ActionInvocation、Inerceptor、Action、Result等。下面我们来具体看看这些组件有什么联系,它们之间是怎样在一起工作的。

 

(1)  客户端(Client)向Action发用一个请求(Request)

(2)  Container通过web.xml映射请求,并获得控制器(Controller)的名字

(3)  容器(Container)调用控制器(StrutsPrepareAndExecuteFilter或FilterDispatcher)。在Struts2.1以前调用FilterDispatcher,Struts2.1以后调用StrutsPrepareAndExecuteFilter

(4)  控制器(Controller)通过ActionMapper获得Action的信息

(5)  控制器(Controller)调用ActionProxy

(6)  ActionProxy读取struts.xml文件获取action和interceptor stack的信息。

(7)  ActionProxy把request请求传递给ActionInvocation

(8)  ActionInvocation依次调用action和interceptor

(9)  根据action的配置信息,产生result

(10) Result信息返回给ActionInvocation

(11) 产生一个HttpServletResponse响应

(12) 产生的响应行为发送给客服端。



Struts2.3.4 所需的Jar包及介绍

Jar包的分类

jar包名称

jar包版本

jar包

文件名

jar包

的作用

jar包内包含的主要包路径及主要类

依赖的自有jar包名称

依赖的第三方jar包名称

本jar包是否为第三方包

Struts

2.3.4

struts2-core

-2.3.4.jar

2.3.4

struts2-core

-2.3.4

struts2的核心包

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

xwork-core

-2.3.4.jar

 

xwork-core

-2.3.4.jar

 

2.3.4

xwork-core

-2.3.4

xwork核心包

com.opensymphony.xwork2/ com.opensymphony.xwork2.cinfig/ com.opensymphony.xwork2.ognl/

 

 

aopalliance.jar

 

1.0

aopalliance

 

这个包为AOP提供了最普通和通用的接口

org.aopalliance.aop/org.aopalliance.aop.intercept

 

 

commons-fileupload-1.2.2.jar

1.2.2

 

commons-fileupload-1.2.2

 

Struts文件的上传下载

org.apacher.commons.fileupload/ org.apacher.commons.fileupload.util

 

 

commons-lang

3-3.1.jar

3.3.1

 

commons-lang3-3.1

为java.lang包提供扩展

org.apacher.commons.lang3/ org.apacher.commons.lang3.builder

 

 

commons-logging

-1.1.1.jar

1.1.1

commons-logging

-1.1.1

 

Jakarta的通用日志记录包

org.apacher.commons.logging/org.apacher.commons.logging.impl

 

 

 

freemarker-2.3.19.jar

 

2.3.19

freemarker-2.3.19

 

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具

 

 

 

ognl-3.0.5.jar

 

3.0.5

ognl-3.0.5

 

支持ognl表达式

Ognl

 

 

Jar

struts2-spring

-plugin-2.3.4.jar

 

2.3.4

 

struts2-spring

-plugin-2.3.4

 

struts2和spring整合需要的包

 

 

 

antlr-2.7.2.jar

 

2.7.2

antlr-2.7.2

它是这样的一种工具,它可以接受词文法语言描述,并能产生识别这些语言的语句的程序

 

 

 

 

asm-3.3.jar

 

3.3

asm-3.3

操作java字节码的类库

 

 

 

 

asm-commons-3.3.jar

3.3

asm-commons-3.3

提供了基于事件的表现形式

 

 

 

 

asm-tree-3.3.jar

 

3.3

asm-tree-3.3

 

提供了基于对象的表现形式

 

 

 

 

classworlds-1.1.jar

1.1

classworlds-1.1

基于java操作类装载的开发框架。java的classloader的机制和本地类可以引起头痛,多为某些类型的应用程序开发的混乱。

 

 

 

 

 

 

commons-beanutils-1.8.0.jar

 

1.8.0

commons-beanutils-1.8.0

jakarta commons项目中的一个子项目。这个项目开发的目的是帮助开发者动态的获取/设值JavaBean的属性,同时解决每次都要写getXXX和setXXX的麻烦

 

 

 

 

commons-chain-1.2.jar

 

1.2

 

commons-chain-1.2

Apache 的 Commons-Chain 项目已将命令模式(Command)和责任链(Chain of Responsebility)模式两者完美的结合

 

 

 

 

 

commons-collections-3.1.jar

 

 

3.1

commons-collections-3.1

包含了一些Apache开发的集合类,扩展了标准的Java Collection框架,提供了额外的Map、List 和Set实现以及多个有用的工具类库。功能比java.util.*强大。

 

 

 

 

commons-digester-2.0.jar

 

2.0

commons-digester-2.0

Jakarta Struts中的一个工具,用于处理struts-config.xml配置文件

 

 

 

 

 

 

commons-logging-api-1.1.jar

 

1.1

commons-logging-api-1.1

Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。

 

 

 

 

commons-validator-1.3.1.jar

 

1.3.1

 

commons-validator-1.3.1

校验方法)和校验规则。支持校验规则的和错误消息的国际化。 struts使用它对表单进行验证

 

 

 

 

 

dwr-1.1.1.jar

 

1.1.1

dwr-1.1.1

Direct Web Remoting是一个WEB远程调用框架.Java开发利用这个框架可以让AJAX开发变得很简单.

 

 

 

 

 

 

ezmorph-1.0.6.jar

 

1.0.6

ezmorph-1.0.6

EZMorph是一个简单的java类库用于将一种对象转换成另外一种对象。EZMorph原先是Json-lib项目中的转换器。EZMorph支持原始数据类型(Primitive),对象(Object),多维护数组转换与DynaBeans的转换。struts2中,json的处理便使用了EZMorph库

 

 

 

 

google-collections-1.0.jar

 

1.0

google-collections-1.0

对现有Java集合类的一个扩展。

 

 

 

 

 

 

jackson-core-asl-1.9.2.jar

1.9.2

jackson-core-asl-1.9.2

一个高性能的解析器的核心库

 

 

 

 

json-lib-2.3-jdk15.jar

 

2.3

 

json-lib-2.3-jdk15

 

 

提供了强大的JSON支持,利用Ajax提交上来的JSON字符串进行解析,可以转化为POJO对象,可以从POJO转化为js可以识别的JSON对象。

 

 

 

 

juli-6.0.18.jar

 

6.0.18

juli-6.0.18

用于tomcat 错误日志查看

 

 

 

 

oro-2.0.8.jar

 

2.0.8

oro-2.0.8

RO一套文本处理工具,能提供perl5.0兼容的正则表达式,AWK-like正则表达式, glob表达式。还提供替换,分割,文件名过虑等功能

 

 

 

 

oval-1.31.jar

 

1.31

oval-1.31

OVal是一个提供事务和对象的可扩展验证框架的任何类型的Java对象。

 

 

 

 

plexus-container-default-1.0-alpha-10.jar

 

1.0

 

 

plexus-container-default-1.0-alpha-10

Plexus项目提供完整的软件栈,用于创建和执行软件项目。根据丛容器,应用程序可以利用面向组件编程构建模块化,它可以轻易地组装和重用可重用组件。根据Plexus容器,应用程序可以利用面向组件编程构建模块化,它可以轻易地组装和重用可重用组件。

 

 

 

 

plexus-utils-1.2.jar

 

1.2

 

plexus-utils

Plexus项目提供完整的软件栈,用于创建和执行软件项目。根据丛容器,应用程序可以利用面向组件编程构建模块化,它可以轻易地组装和重用可重用组件。

 

 

 

 

sitemesh-2.4.2.jar

 

2.4.2

sitemesh-2.4.2

SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)的框架组件,能够帮助网站开发人员较容易实现页面中动态内容和静态装饰外观的分离。

 

 

 

 

 

 

struts2-codebehind-plugin-2.3.4.jar

2.3.4

struts2-codebehind-plugin-2.3.4

通常JSP页面来自于文件系统。利用这个插件,你可以将jsp页面部署到jar包中

 

 

 

 

struts2-config-browser-plugin-2.3.4.jar

 

2.3.4

struts2-config-browser-plugin-2.3.4

struts配置浏览器所需要的插件

 

 

 

 

struts2-convention-plugin-2.3.4.jar

 

2.3.4

 

struts2-convention-plugin-2.3.4

在默认情况下该公约插件查找操作类在以下软件包支柱,struts2的行为或行动,任何包相匹配这些名称将被考虑作为根包为常规插件。

 

 

 

 

 

 

struts2-dojo-plugin-2.3.4.jar

 

2.3.4

 

 

struts2-dojo-plugin-2.3.4

为struts所提供的一些控件例如:日历

 

 

 

 

struts2-dwr-plugin-2.3.4.jar

 

2.3.4

struts2-dwr-plugin-2.3.4

用于整合DWR

 

 

 

 

struts2-embeddedjsp-plugin-2.3.4.jar

 

2.3.4

struts2-embeddedjsp-plugin-2.3.4

用于将jsp页面放在jar包中

 

 

 

 

struts2-jasperreports-plugin-2.3.4.jar

2.3.4

struts2-jasperreports-plugin-2.3.4

用于整合JasperReports

 

 

 

 

struts2-javatemplates-plugin-2.3.4.jar

2.3.4

struts2-javatemplates-plugin-2.3.4

Apache提供的'javatemplates'用于代替默认的Freemarker渲染器

 

 

 

 

struts2-jfreechart-plugin-2.3.4.jar

 

2.3.4

struts2-jfreechart-plugin-2.3.4

struts2使用jfreechart的插件包

 

 

 

 

struts2-jsf-plugin-2.3.4.jar

 

2.3.4

struts2-jsf-plugin-2.3.4

sturts整合jsf的插件包

 

 

 

 

struts2-json-plugin-2.3.4.jar

2.3.4

struts2-json-plugin-2.3.4

struts2所用到的json插件包

 

 

 

 

struts2-junit-plugin-2.3.4.jar

2.3.4

struts2-junit-plugin-2.3.4

struts所提供的junit调试

 

 

 

 

struts2-osgi-plugin-2.3.4.jar

 

2.3.4

struts2-osgi-plugin-2.3.4

这个插件提供了支持启动一个实例的Apache Felix在一个web应用程序,和扫描安装的bundle的Struts配置。还提供了一个管理包

 

 

 

 

struts2-oval-plugin-2.3.4.jar

2.3.4

struts2-oval-plugin-2.3.4

插件定义了拦截器”ovalValidation”和拦截器堆栈”ovalValidationStack”在“oval-default”包。使用这个拦截器,扩大“oval-default””包

 

 

 

 

struts2-plexus-plugin-2.3.4.jar

 

2.3.4

struts2-plexus-plugin-2.3.4

使用该插件,当配置Struts动作,拦截器,在Struts或结果。xml,设置class属性包含丛对象id,而不是实际的Java类。这将允许丛来创建对象和注入任何依赖关系也由管理丛。

 

 

 

 

struts2-portlet-plugin-2.3.4.jar

2.3.4

struts2-portlet-plugin-2.3.4

Portlet的插件,用于发展中JSR286 Portlet使用Struts

 

 

 

 

struts2-rest-plugin-2.3.4.jar

 

2.3.4

struts2-rest-plugin-2.3.4

rest插件用于自动处理序列化,并反序列化每种格式。

 

 

 

 

struts2-sitegraph-plugin-2.3.4.jar

2.3.4

struts2-sitegraph-plugin-2.3.4

生成一个web应用程序的图形视图

 

 

 

 

struts2-struts1-plugin-2.3.4.jar

2.3.4

struts2-struts1-plugin-2.3.4

这个jar包是用于将strusts和spring进行整合的一个插件,在处理数据库的事物时,通过这个插件将数据源配置到底层的sessionFactory中,然后再将sessionFactory注入到相应Dao层或者service层,在配置请求页面的处理结果页面配置struts.xml文件由spring进行管理的

 

 

 

 

struts2-testng-plugin-2.3.4.jar

2.3.4

struts2-testng-plugin-2.3.4

这个插件是用来在单元测试,而不是在运行时。因此,它包含在您的构建的类路径中,但不要将它部署WEB-INF/lib在Struts2的应用程序

 

 

 

 

struts2-tiles-plugin-2.3.4.jar

2.3.4

struts2-tiles-plugin-2.3.4

这个插件可以安装插件jar复制到应用程序的WEB-INF/lib 目录中

 

 

 

 

struts2-tiles-plugin-2.3.4.jar

2.3.4

struts2-tiles-plugin-2.3.4

这个插件可以安装插件jar复制到应用程序的WEB-INF/lib 目录中

 

 

 

 

testng-5.1-jdk15.jar

5.1

testng-5.1-jdk15

TestNG是一个测试框架从JUnit和NUnit启发,但该框架引入了一些新功能,使它更强大,也更容易使用。而该jar包就是用于整合使用该框架。

 

 

 

 

tiles-api-2.0.6.jar

2.0.6

tiles-api-2.0.6

提供对tiles的支持:类和标记库在一个JSP环境中使用tiles。

 

 

 

 

tiles-core-2.0.6.jar

 

2.0.6

tiles-core-2.0.6

tiles核心库,包括基本的实现的api。

 

 

 

 

tiles-jsp-2.0.6.jar

2.0.6

tiles-jsp-2.0.6

提供对tilesJSP的支持:类和标记库在一个JSP环境使用tiles。

 

 

 

 

velocity-1.6.3.jar

1.6.3

velocity-1.6.3

Java模板技术-velocity

 

 

 

 

xmlpull-1.1.3.1.jar

 

1.1.3.1

xmlpull-1.1.3.1

支持可扩展的XML

 

 

 

 

xpp3_min-1.1.4c.jar

 

1.1.4

xpp3_min-1.1.4c

Java对象和XML之间相互转换所需JAR包

 

 

 

 

xstream-1.4.2.jar

1.4.2

xstream-1.4.2

xstream 提供对象和xml之间的转换

 




Struts2拦截器的使用 (详解)

如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):
<interceptor-ref name="checkbox">
  <param name="uncheckedValue">0</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"/>(必须加,否则出错)

也可以改为对全局Action设置自己需要的拦截器,如下:

在struts.xml里面定义全局的配置设置
  <package name="struts-shop" extends="struts-default">
    <interceptors>
      <interceptor-stack name="myStack">
        <interceptor-ref name="checkbox">
          <param name="uncheckedValue">0</param>
       </interceptor-ref>
       <interceptor-ref name="defaultStack"/>
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="myStack"/>(这句是设置所有Action自动调用的拦截器堆栈)
  </package>
 
struts-action.xml里面配置Action如下:
  <package name="LogonAdmin" extends="struts-shop">(这里扩展struts.xml里面定义的配置就可以了)
  <action name="logon" class="logonAction">
     <result>/jsp/smeishop/admin/index.jsp</result>
     <result name="error">/jsp/smeishop/admin/logon.jsp</result>
     <result name="input">/jsp/smeishop/admin/logon.jsp</result>
   </action>
   <action name="logout" class="logoutAction">
     <result>/jsp/smeishop/admin/logon.jsp</result>
   </action>
 </package>

你的拦截器可以正常工作了!!HOHO

以下是参考资料

struts2自带的配置及其拦截器配置


Struts2 拦截器 [Interceptor]


拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。

 

每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。

 

如何自定义一个拦截器?

自定义一个拦截器需要三步:

1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 在strutx.xml中注册上一步中定义的拦截器。

3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

 

Interceptor接口声明了三个方法:

 

public interface Interceptor extends Serializable {

 

    void destroy();

 

    void init();

 

    String intercept(ActionInvocation invocation) throws Exception;

}

 

Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。 

Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。 

Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。

另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:

public abstract class AbstractInterceptor implements Interceptor {

 

     public void init() {

    }

   

    public void destroy() {

    }

 

 

    public abstract String intercept(ActionInvocation invocation) throws Exception;

}

在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。

 

我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户Session中是否存在特定的属性(LOGIN属性)如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为:

public class CheckLoginInterceptor extends AbstractInterceptor {

    public static final String LOGIN_KEY = "LOGIN";

    public static final String LOGIN_PAGE = "global.login";

 

    public String intercept(ActionInvocation actionInvocation) throws Exception {

 

        System.out.println("begin check login interceptor!");

        // 对LoginAction不做该项拦截

        Object action = actionInvocation.getAction();

        if (action instanceof LoginAction) {

            System.out.println("exit check login, because this is login action.");

            return actionInvocation.invoke();

        }

 

        // 确认Session中是否存在LOGIN

        Map session = actionInvocation.getInvocationContext().getSession();

        String login = (String) session.get(LOGIN_KEY);

        if (login != null && login.length() > 0) {

            // 存在的情况下进行后续操作。

            System.out.println("already login!");

            return actionInvocation.invoke();

        } else {

            // 否则终止后续操作,返回LOGIN

            System.out.println("no login, forward login page!");

            return LOGIN_PAGE;

        }

    }

}

 

注册拦截器

<interceptors>

            <interceptor

name="login" 

class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>

            <interceptor-stack name="teamwareStack">

                <interceptor-ref name="login"/>

                <interceptor-ref name="defaultStack"/>

            </interceptor-stack>

</interceptors>

 

将上述拦截器设定为默认拦截器:

<default-interceptor-ref name="teamwareStack"/>

这样在后续同一个package内部的所有Action执行之前都会被login拦截。

 

 

Struts2(XWork)提供的拦截器的功能说明:

 

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。

Checkbox Interceptor

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox

Cookies Interceptor

cookies

使用配置的name,value来是指cookies

Conversion Error Interceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

Create Session Interceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

Debugging Interceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

Execute and Wait Interceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

Exception Interceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的locale

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

Action状态存入session和application的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

Static Parameters Interceptor

staticParams

struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。

Roles Interceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

Timer Interceptor

timer

输出Action执行的时间

Token Interceptor

token

通过Token来避免双击

Token Session Interceptor

tokenSession

Token Interceptor一样,不过双击的时候把请求的数据存储在Session

Validation Interceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据。

Workflow Interceptor

workflow

调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profiling

通过参数激活profile

 

注册并引用Interceptor

<package name="default" extends="struts-default">

   <interceptors>

       <interceptor name="timer" class=".."/>

       <interceptor name="logger" class=".."/>

   </interceptors>

 

   <action name="login" class="tutorial.Login">

        <interceptor-ref name="timer"/>

        <interceptor-ref name="logger"/>

        <result name="input">login.jsp</result>

        <result name="success"

            type="redirect-action">/secure/home</result>

   </action>

</package>

 

可以将多个拦截器合并在一起作为一个堆栈调用,当一个拦截器堆栈被附加到一个Action的时候,要想Action执行,必须执行拦截器堆栈中的每一个拦截器。

<package name="default" extends="struts-default">

   <interceptors>

        <interceptor name="timer" class=".."/>

        <interceptor name="logger" class=".."/>

        <interceptor-stack name="myStack">

           <interceptor-ref name="timer"/>

           <interceptor-ref name="logger"/>

        </interceptor-stack>

    </interceptors>

 

    <action name="login" class="tutuorial.Login">

         <interceptor-ref name="myStack"/>

         <result name="input">login.jsp</result>

         <result name="success"

             type="redirect-action">/secure/home</result>

    </action>

</package>

 

上述说明的拦截器在默认的Struts2应用中,根据惯例配置了若干个拦截器堆栈,详细情参看struts-default.xml

其中有一个拦截器堆栈比较特殊,他会应用在默认的每一个Action上。

<interceptor-stack name="defaultStack">

    <interceptor-ref name="exception"/>

    <interceptor-ref name="alias"/>

    <interceptor-ref name="servletConfig"/>

    <interceptor-ref name="prepare"/>

    <interceptor-ref name="i18n"/>

    <interceptor-ref name="chain"/>

    <interceptor-ref name="debugging"/>

    <interceptor-ref name="profiling"/>

    <interceptor-ref name="scopedModelDriven"/>

    <interceptor-ref name="modelDriven"/>

    <interceptor-ref name="fileUpload"/>

    <interceptor-ref name="checkbox"/>

    <interceptor-ref name="staticParams"/>

    <interceptor-ref name="params">

      <param name="excludeParams">dojo"..*</param>

    </interceptor-ref>

    <interceptor-ref name="conversionError"/>

    <interceptor-ref name="validation">

        <param name="excludeMethods">input,back,cancel,browse</param>

    </interceptor-ref>

    <interceptor-ref name="workflow">

        <param name="excludeMethods">input,back,cancel,browse</param>

    </interceptor-ref>

</interceptor-stack>

 

每一个拦截器都可以配置参数,有两种方式配置参数,一是针对每一个拦截器定义参数,二是针对一个拦截器堆栈统一定义所有的参数,例如:

<interceptor-ref name="validation">

 <param name="excludeMethods">myValidationExcudeMethod</param>

</interceptor-ref>

<interceptor-ref name="workflow">

 <param name="excludeMethods">myWorkflowExcludeMethod</param>

</interceptor-ref>

或者

<interceptor-ref name="defaultStack">

    <param name="validation.excludeMethods">myValidationExcludeMethod</param>

    <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>

</interceptor-ref>

 

每一个拦截器都有两个默认的参数:

excludeMethods - 过滤掉不使用拦截器的方法和

includeMethods – 使用拦截器的方法。

 

需要说明的几点:

拦截器执行的顺序按照定义的顺序执行,例如:

<interceptor-stack name="xaStack">

 <interceptor-ref name="thisWillRunFirstInterceptor"/>

 <interceptor-ref name="thisWillRunNextInterceptor"/>

 <interceptor-ref name="followedByThisInterceptor"/>

 <interceptor-ref name="thisWillRunLastInterceptor"/>

</interceptor-stack>

的执行顺序为:

thisWillRunFirstInterceptor

 thisWillRunNextInterceptor

    followedByThisInterceptor

      thisWillRunLastInterceptor

        MyAction1

        MyAction2 (chain)

        MyPreResultListener

        MyResult (result)

      thisWillRunLastInterceptor

    followedByThisInterceptor

 thisWillRunNextInterceptor

thisWillRunFirstInterceptor

 

2 使用默认拦截器配置每个Action都需要的拦截器堆栈,例如:

<action name="login" class="tutorial.Login">

     <interceptor-ref name="timer"/>

     <interceptor-ref name="logger"/>

     <interceptor-ref name="default-stack"/>

 

     <result name="input">login.jsp</result>

     <result type="redirect-action">/secure/home</result>

</action>

可以按照如下的方式定义:

<interceptors>

     <interceptor-stack name="myStack">

        <interceptor-ref name="timer"/>

        <interceptor-ref name="logger"/>

        <interceptor-ref name="default-stack"/>

     </interceptor-stack>

</interceptors>

 

<default-interceptor-ref name="myStack"/>

 

<action name="login" class="tutorial.Login">

       <result name="input">login.jsp</result>

       <result type="redirect-action">/secure/home</result>

</action>

 

如何访问HttpServletRequest,HttpServletResponse或者HttpSession

有两种方法可以达到效果,使用ActionContext

Map attibutes = ActionContext.getContext().getSession();

或者实现相应的接口:

HttpSession            SessionAware

HttpServletRequest     ServletRequestAware

HttpServletResponse    ServletResponseAware



Struts2自定义拦截器实例—只允许从登录页面进入系统

  1. 【1】struts.xml:
  2.  <!-- 定义一个拦截器 -->  
  3.         <interceptors>  
  4.             <interceptor name="authority"  
  5.                 class="org.interceptot.LoginInterceptor">  
  6.             </interceptor>  
  7.             
  8.             <!-- 拦截器栈 -->  
  9.             <interceptor-stack name="mydefault">  
  10.                 <interceptor-ref name="defaultStack" />  
  11.                 <interceptor-ref name="authority" />  
  12.             </interceptor-stack>  
  13.         </interceptors>
  14.         
  15.          
  16.         
  17.          <!-- 定义全局Result -->  
  18.         <global-results>  
  19.             <!-- 当返回login视图名时,转入/login.jsp页面 -->  
  20.             <result name="login">/login.jsp</result>  
  21.         </global-results>
  22.         
  23.         
  24.         <action name="show" class="org.action.showAction">  
  25.             <result name="success">/main.jsp</result>  
  26.             <!-- 使用此拦截器 -->  
  27.             <interceptor-ref name="mydefault" />  
  28.         </action>  
  29.         
  30.         
  31.         <!--验证登录用户信息  -->
  32.         <action name="login" class="org.action.loginAction" method="execute">
  33.             <result name="error">/login.jsp</result>  
  34.             <result name="input">/login.jsp</result> 
  35.         </action>
  36.        
  37. 【2】自定义拦截器org.interceptot.LoginInterceptor:
  38. package org.interceptot;
  39. import java.util.Map;  

  40. import com.opensymphony.xwork2.Action;  
  41. import com.opensymphony.xwork2.ActionContext;  
  42. import com.opensymphony.xwork2.ActionInvocation;  
  43. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
  44. public class LoginInterceptor extends AbstractInterceptor {  
  45.  
  46.     @Override  
  47.     public String intercept(ActionInvocation invocation) throws Exception {  
  48.   
  49.         // 取得请求相关的ActionContext实例  
  50.         ActionContext ctx = invocation.getInvocationContext();  
  51.         Map session = ctx.getSession();  
  52.         String user = (String) session.get("username");  
  53.   
  54.         // 如果没有登陆,即用户名不存在,都返回重新登陆  
  55.         System.out.println("user:"+user);
  56.         if (user != null) {  
  57.             System.out.println("test");  
  58.             return invocation.invoke();  
  59.         }  
  60.         System.out.println("你还没有登录"); 
  61.         ctx.put("tip", "你还没有登录");  
  62.         return Action.LOGIN;    //返回一个叫login的result结果
  63.   
  64.     }  
  65.   
  66. }  
  67. 【3】进入主页面的Action:org.action.showAction
  68. package org.action;

  69. import com.opensymphony.xwork2.ActionSupport;  

  70. public class showAction extends ActionSupport {  
  71.  public String execute() {  
  72.   return "success";  
  73.  }  
  74. }  

  75. 【4】LoginAction:

  76. private boolean isInvalid(String value) {     
  77. return (value == null || value.length() == 0);     
  78. }  
  79. if (isInvalid(user.getUsername()))   
  80.        return INPUT;     
  81.  if (isInvalid(user.getPassword()))     
  82.        return INPUT;    
  83.  //登录成功将User放入session中
  84. HttpServletRequest request = ServletActionContext.getRequest();
  85. Map  map=ActionContext.getContext().getSession();
  86. map.put("username", user.getUsername());

  87. 【5】如果我们通过show.action访问main.jsp那么就会被自定义拦截器拦住,拦截器检查session中
  88. 是否有值,有证明用户已经登录,没有则为没有登录,那么就会被跳转到登陆页面。


0 0
原创粉丝点击