上述两个action mapping调用的是同一个action类只是执行的方法不同而已并且所执行的方法名都是action mapping名字的开头部分而且action mapping的名字除去方法名之后剩下的部分是一样的这种情况下我们可以使用一个action mapping来代替上面两个action mapping
<action name=
*Crud
class=
example
CrudAction
method=
{
}
>
匹配过程是这样的 (以请求的action mapping的名字是editCrud为例)
● *可以表示任何内容因此任何以Crud结尾的action mapping都会匹配上
● 当editCrud匹配上后*的内容此时就是edit
● 调用名字为第一个*号的内容的方法此时仅有一个*号并且此时它的内容为edit因此action类的edit方法被调用了
● 同理如果请求的action是deleteCrud匹配成功后*的内容就是delete调用的方法就是delete了
使用通配符匹配方法可以让我们减少配置文件的内容是配置更加简洁
如果我们没有给action元素指定class属性的话框架会默认它的class属性为comopensymphonyxworkActionSupport如果想指定别的类作为默认的Action类可以通过package的defaultactionref属性来设置在设置了defaultactionref之后如果我们在package中没有匹配到所请求的action那么这个默认的action就会被调用一般一个命名空间下最好只定义一个默认的action
.Result元素配置
action类处理完一个请求后会返回一个字符串这个字符串将被用来选择一个result元素通常一个action mapping会有多个result代表各个可能不同的结果ActionSupport中定义了几个标准的result token如下所示
String SUCCESS =
success
;
String NONE = none;
String ERROR = error;
String INPUT = input;
String LOGIN = login;
通常我们都会自定义一些result token类匹配特定的情况
result元素负责完成两个工作提供一个逻辑名用于与action类的返回字符串进行匹配提供一个返回类型(Result Type)尽管大多数的result只是简单的转向一个页面或模板但是我们还可以利用其它的返回类型(Result Type)做其它的一些事情我们可以为每个包设置默认的返回类型(Result Type)如果一个包继承了另外一个包它可以选择设置自己的默认返回类型或者直接使用父包的设置默认返回类型的方式如下
<result
types>
<resulttype name=dispatcher default=true
class=orgapachestrutsdispatcherServletDispatcherResult/>
</resulttypes>
Result元素有两个属性name和type它们都是可选的name属性的默认值是successtype的属性为我们所设置的默认返回类型如上例中即为dispatcher
定义在action元素里面的result我们可以称之为局部result除此之外我们可以还可以全局的result这些result会被多个action所共享框架会首先寻找嵌套在action元素中的result如果没有匹配的就去全局result中去寻找一个全局result的例子如下
<globalresults>
<result name=error>/Errorjsp</result>
<result name=invalidtoken>/Errorjsp</result>
<result name=login type=redirectaction>Logon!input</result>
</globalresults>
有时候我们的result在运行前可能是未知的比方说一个result它所跳转的页面取决于它所在action类的运行结果或者客户端的输入等等这时候我们可以使用动态的result也就是说result的值可以使用表达式语言(EL)来表示这个表达式的值是动态的取决于action的运行时状况下面是一个例子
在上例中result的值将是它所在action的nextAction的属性值nextAction属性的值不同当action的方法返回next时所跳向的url也不同
[] []