Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。
该方法如下:
<wbr><wbr></wbr></wbr>publicString execute()throwsException
Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:
<wbr><wbr><wbr></wbr></wbr></wbr>publicString<wbr></wbr>xxx()
在实际开发中,action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。
开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。
<wbr></wbr>
1.<wbr><wbr><wbr></wbr></wbr></wbr>Action映射:
<wbr></wbr>action映射是Struts2框架中的基本”工作单元”,action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>action元素的完整属性表
属性 | 是否必须 | 说明 |
name | 是 | action的名字,用于匹配URL |
class | 否 | Action实现类的完整类名 |
method | 否 | 执行Action类时调用的方法 |
convert | 否 | 应用于action的类型转换的完整类名 |
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>例如:
<actionname="user"class="org.lesson05.UserAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr><resultname="success">/user.jsp</result>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr></wbr></wbr></wbr>2.使用method属性
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>在配置action时,我们可以通过action元素的method属性来指定action调用的
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>方法,所指定的方法,必须遵循与execute方法相同的格式。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>在Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>method属性。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>在Struts.xml文件中为同一个Action类配置不同的别名
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr><wbr></wbr><!--使用method属性-->
<packagename="methods"namespace="/"
extends="struts-default">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的execute方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="list"class="org.lesson05.MethodAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/list.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的add方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="add"class="org.lesson05.MethodAction"
method="add">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/add.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的edit方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="edit"class="org.lesson05.MethodAction"
method="edit">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/edit.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的delete方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="delete"
class="org.lesson05.MethodAction"
<wbr></wbr>method="delete">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/delete.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
</package>
对应的MethodAction类,代码如下:
<wbr><wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr>importcom.opensymphony.xwork2.ActionSupport;
publicclassMethodActionextendsActionSupport
{
<wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>@Override
<wbr><wbr><wbr></wbr></wbr></wbr>publicString execute()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
<wbr><wbr><wbr></wbr></wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>publicString add()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
<wbr><wbr><wbr></wbr></wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>publicString edit()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
<wbr><wbr><wbr></wbr></wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>publicStringdelete()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
}
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>使用action的method属性可以任意指定处理请求的方法(只要该方法和execute
方法具有相同的格式),这样就可以在同一个类中完成相关的任务,而不需要去编写不
同的Action类。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>注意:Struts2在根据action元素的method属性查找方法时有两种途径:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>1.查找与method属性值完全一致的方法.
2.查找doMethod()形式的方法.
<wbr><wbr></wbr></wbr>3.动态方法调用:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>另外一种无需配置就可以直接调用Action中的非execute方法的方式,是使用
Struts2的动态方法调用。
<wbr><wbr></wbr></wbr>动态方法调用是在action的名字中使用感叹号(!)来标识要调用的方法名,其语法格
式为actionName!methodName.action
<wbr><wbr></wbr></wbr>例如,我们配置了如下的action
<wbr><wbr></wbr></wbr><actionname="user"class="org.lesson05.UserAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/list.jsp</result>
<wbr><wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>当请求/user!delete.action时,就会自动调用UserAction中的delete()方
法
用这种方式需要先开启一个开关:<constant name="struts.enable.DynamicMethodInvocation" value="true" />
提示,这种调用方式会带来安全隐患!
<wbr></wbr>
4.模拟Struts1中的ForwardAction
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="user">
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr><result>/index.jsp</result>
<wbr><wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>这样写就可以了.
<wbr></wbr>
<wbr><wbr></wbr></wbr>5.默认的action
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>如果请求一个不存在的action,结果将是HTTP404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>默认的action使用default-action-ref元素来声明,如下所示:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--默认action -->
<packagename="defaultAction"namespace="/default"
extends="struts-default">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><default-action-refname="error"></default-action-ref><wbr></wbr><wbr><wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="defaultaction"
class="org.lesson05.DefaultAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/defaultAction.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="error">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><result>/error.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr></wbr></wbr></wbr></package>
<wbr><wbr></wbr></wbr>注意:根据struts-2.0.dtd中定义的package元素的内容模型,
default-acion-ref必须在action元素之前使用。
<wbr><wbr></wbr></wbr>如果请求的是/default/defaultaction1.action,框架找不到映射到defaultaction1的action,那么名为error的action将被调用。
<wbr><wbr><wbr></wbr></wbr></wbr>注意:每个包中都可以有它自己默认的action,但是每一个名称空间应该只有一个默认action。如果具有相同名称空间的多个包中都声明了默认action,那么哪一个action才是默认的将无法保证。
<wbr><wbr><wbr></wbr></wbr></wbr>注意:默认action只对action的访问有效。如果你访问一个非action的资源,例如/user.jsp,而该页面不存在,这时仍会看到HTTP404错误。如果想为整个Web应用程序指定默认页面,需要在web.xml文件中对HTTP404错误指定相应的错误处理页面。
<wbr></wbr>
6.通配符映射
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>随着Web应用程序的增加,所需的Action也会更多,从而导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>通配符即星号(*),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>以下是在action映射中使用通配符:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="news*"<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
class="org.struts2.lesson05.News{1}Action">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/WEB-INF/News/{1}.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>我们在action元素的name属性中使用了通配符(*),允许这个映射匹配所有以/news开始的URL,例如/newsAdd,/newsEdit,/newsDelete,但是,如果请求的是/newsEdit/add,那么这个映射就不会被匹配。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>在上面,有一个特殊的记号{1},这是作为占位符使用的,它将被通配符所匹配的值替换,例如访问/newsEdit,通配符(*)匹配的部分是Edit,那么,这个值将替换{1},最终调用的类是org.struts2.lesson05.NewsEditAction,Action
<wbr><wbr></wbr></wbr>执行成功后导向的结果页面是/WEB-INF/News/Edit.jsp。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>在action映射和action结果中,通配符匹配的值可以用记号{N}来访问,N是从1到9的数字,指出替换的是哪一个通配符匹配的值。整个请求URL可以用记号{0}来访问。例如如下的action映射:
<wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr><actionname="*_*"class="org.struts2.lesson05.{1}Action"<wbr></wbr>
method="{2}">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><result>/WEB-INF/News/{0}.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>当访问/News_delete时,name属性中的第一个”*”匹配News,第二个”*”匹配delete,class属性中使用的记号是{1},所以被News所替换,method属性中使用的记号是{2},于是被delete所替换。结果映射中使用的记号是{0},于是被整个URL替换,即News_delete所替换。整个替换后的结果是:当请求/News_delete时,框架调用NewsAction实例的delete方法对请求进行处理。执行成功后,请求被导向到/WEB-INF/News/News_delete.jsp页面。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>通配符方法设置的另一种常见方式是使用后缀通配符,即将”*”放在action名字的后面,在”*”和名字前缀之间使用一个特殊字符作为分隔,常用的特殊字符是下划线(_),当然也可以使用其他字符。例如:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="News_*"
class="org.struts2.lesson05.NewsAction"method="{1}">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><result>/WEB-INF/News/{0}.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr>当请求/News_delete时,调用的是NewsAction实例的delete方法,当请求/News_edit的时候,调用的是NewsAction实例的edit方法。
Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。
该方法如下:
<wbr><wbr></wbr></wbr>publicString execute()throwsException
Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:
<wbr><wbr><wbr></wbr></wbr></wbr>publicString<wbr></wbr>xxx()
在实际开发中,action类很少直接实现Action接口,通常都是从com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。
开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。
<wbr></wbr>
1.<wbr><wbr><wbr></wbr></wbr></wbr>Action映射:
<wbr></wbr>action映射是Struts2框架中的基本”工作单元”,action映射就是将一个请求URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字时,框架就使用这个映射来确定如何处理请求。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>action元素的完整属性表
属性 | 是否必须 | 说明 |
name | 是 | action的名字,用于匹配URL |
class | 否 | Action实现类的完整类名 |
method | 否 | 执行Action类时调用的方法 |
convert | 否 | 应用于action的类型转换的完整类名 |
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr>
<wbr></wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>例如:
<actionname="user"class="org.lesson05.UserAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr><resultname="success">/user.jsp</result>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr></wbr></wbr></wbr>2.使用method属性
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>在配置action时,我们可以通过action元素的method属性来指定action调用的
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>方法,所指定的方法,必须遵循与execute方法相同的格式。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>在Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>method属性。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>在Struts.xml文件中为同一个Action类配置不同的别名
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr><wbr></wbr><!--使用method属性-->
<packagename="methods"namespace="/"
extends="struts-default">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的execute方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="list"class="org.lesson05.MethodAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/list.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的add方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="add"class="org.lesson05.MethodAction"
method="add">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/add.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的edit方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="edit"class="org.lesson05.MethodAction"
method="edit">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/edit.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--对应着MethodAction里面的delete方法-->
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="delete"
class="org.lesson05.MethodAction"
<wbr></wbr>method="delete">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/delete.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
</package>
对应的MethodAction类,代码如下:
<wbr><wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr>importcom.opensymphony.xwork2.ActionSupport;
publicclassMethodActionextendsActionSupport
{
<wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>@Override
<wbr><wbr><wbr></wbr></wbr></wbr>publicString execute()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
<wbr><wbr><wbr></wbr></wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>publicString add()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
<wbr><wbr><wbr></wbr></wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>publicString edit()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
<wbr><wbr><wbr></wbr></wbr></wbr>
<wbr><wbr><wbr></wbr></wbr></wbr>publicStringdelete()throwsException
<wbr><wbr><wbr></wbr></wbr></wbr>{
<wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>returnSUCCESS;
<wbr><wbr><wbr></wbr></wbr></wbr>}
}
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>使用action的method属性可以任意指定处理请求的方法(只要该方法和execute
方法具有相同的格式),这样就可以在同一个类中完成相关的任务,而不需要去编写不
同的Action类。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>注意:Struts2在根据action元素的method属性查找方法时有两种途径:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>1.查找与method属性值完全一致的方法.
2.查找doMethod()形式的方法.
<wbr><wbr></wbr></wbr>3.动态方法调用:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>另外一种无需配置就可以直接调用Action中的非execute方法的方式,是使用
Struts2的动态方法调用。
<wbr><wbr></wbr></wbr>动态方法调用是在action的名字中使用感叹号(!)来标识要调用的方法名,其语法格
式为actionName!methodName.action
<wbr><wbr></wbr></wbr>例如,我们配置了如下的action
<wbr><wbr></wbr></wbr><actionname="user"class="org.lesson05.UserAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/Methods/list.jsp</result>
<wbr><wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>当请求/user!delete.action时,就会自动调用UserAction中的delete()方
法
用这种方式需要先开启一个开关:<constant name="struts.enable.DynamicMethodInvocation" value="true" />
提示,这种调用方式会带来安全隐患!
<wbr></wbr>
4.模拟Struts1中的ForwardAction
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="user">
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr><result>/index.jsp</result>
<wbr><wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>这样写就可以了.
<wbr></wbr>
<wbr><wbr></wbr></wbr>5.默认的action
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>如果请求一个不存在的action,结果将是HTTP404错误。在Struts2中,可以指定一个默认的action,如果一个请求没有其他的action匹配,那么默认的action将被执行。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>默认的action使用default-action-ref元素来声明,如下所示:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><!--默认action -->
<packagename="defaultAction"namespace="/default"
extends="struts-default">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><default-action-refname="error"></default-action-ref><wbr></wbr><wbr><wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="defaultaction"
class="org.lesson05.DefaultAction">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/defaultAction.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="error">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><result>/error.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr></wbr></wbr></wbr></package>
<wbr><wbr></wbr></wbr>注意:根据struts-2.0.dtd中定义的package元素的内容模型,
default-acion-ref必须在action元素之前使用。
<wbr><wbr></wbr></wbr>如果请求的是/default/defaultaction1.action,框架找不到映射到defaultaction1的action,那么名为error的action将被调用。
<wbr><wbr><wbr></wbr></wbr></wbr>注意:每个包中都可以有它自己默认的action,但是每一个名称空间应该只有一个默认action。如果具有相同名称空间的多个包中都声明了默认action,那么哪一个action才是默认的将无法保证。
<wbr><wbr><wbr></wbr></wbr></wbr>注意:默认action只对action的访问有效。如果你访问一个非action的资源,例如/user.jsp,而该页面不存在,这时仍会看到HTTP404错误。如果想为整个Web应用程序指定默认页面,需要在web.xml文件中对HTTP404错误指定相应的错误处理页面。
<wbr></wbr>
6.通配符映射
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>随着Web应用程序的增加,所需的Action也会更多,从而导致大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的Action或者Action方法可以使用通用的样式来配置。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>通配符即星号(*),用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用星号(*)来匹配任意的字符。
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>以下是在action映射中使用通配符:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="news*"<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
class="org.struts2.lesson05.News{1}Action">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><resultname="success">/WEB-INF/News/{1}.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>我们在action元素的name属性中使用了通配符(*),允许这个映射匹配所有以/news开始的URL,例如/newsAdd,/newsEdit,/newsDelete,但是,如果请求的是/newsEdit/add,那么这个映射就不会被匹配。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>在上面,有一个特殊的记号{1},这是作为占位符使用的,它将被通配符所匹配的值替换,例如访问/newsEdit,通配符(*)匹配的部分是Edit,那么,这个值将替换{1},最终调用的类是org.struts2.lesson05.NewsEditAction,Action
<wbr><wbr></wbr></wbr>执行成功后导向的结果页面是/WEB-INF/News/Edit.jsp。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>在action映射和action结果中,通配符匹配的值可以用记号{N}来访问,N是从1到9的数字,指出替换的是哪一个通配符匹配的值。整个请求URL可以用记号{0}来访问。例如如下的action映射:
<wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr><actionname="*_*"class="org.struts2.lesson05.{1}Action"<wbr></wbr>
method="{2}">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><result>/WEB-INF/News/{0}.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>当访问/News_delete时,name属性中的第一个”*”匹配News,第二个”*”匹配delete,class属性中使用的记号是{1},所以被News所替换,method属性中使用的记号是{2},于是被delete所替换。结果映射中使用的记号是{0},于是被整个URL替换,即News_delete所替换。整个替换后的结果是:当请求/News_delete时,框架调用NewsAction实例的delete方法对请求进行处理。执行成功后,请求被导向到/WEB-INF/News/News_delete.jsp页面。
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr>通配符方法设置的另一种常见方式是使用后缀通配符,即将”*”放在action名字的后面,在”*”和名字前缀之间使用一个特殊字符作为分隔,常用的特殊字符是下划线(_),当然也可以使用其他字符。例如:
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><actionname="News_*"
class="org.struts2.lesson05.NewsAction"method="{1}">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><result>/WEB-INF/News/{0}.jsp</result>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></action>
<wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr><wbr></wbr>当请求/News_delete时,调用的是NewsAction实例的delete方法,当请求/News_edit的时候,调用的是NewsAction实例的edit方法。