配置Action
action映射是框架中基本的工作单元,action映射就是将一个请求URI映射到一个action类,当一个请求匹配某个action名字时,框架就使用这个映射来确定如何处理请求。struts.xml文件中的每一个action元素就是一个action映射。
例如:
<action name="login" class="org.fyw.struts.action.LoginAction">
<result>/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
在配置action时,我们可以通过action元素的method属性来指定action调用的方法。所指定的方法必须遵循与execute方法相同的格式。在struts.xml文件中,我们可以为同一个action类配置不同的别名,并使用method属性,例如:
<package name="default" extends="struts-default">
<!-- 请求/list,调用NewsAction的execute方法 -->
<action name="list" class="org.fyw.struts.action.NewsAction" >
<result>/listNews.jsp</result>
</action>
<!-- 请求/create,调用NewsAction的create方法 -->
<action name="create" class="org.fyw.struts.action.NewsAction" method="create">
<result type="redirect">/list.action</result>
</action>
</package>
动态方法调用(DMI)
另外一种无须配置就可以直接调用Action中的非execute方法的方式,就是使用struts2的动态方法调用。语法格式:
actionName!methodName.action
例如:
<action name="news" class="org.fyw.struts.action.NewsAction">
...
</action>
当请求/news!create.action时,将调用NewsAction的create方法。在struts2中,使用动态方法调用需要注意的问题。首先DMI可能会带来安全隐患,由于通过URL可以执行action中的任意方法,恶意的用户会利用这一特性来执行一些敏感的方法,即使你不想执行。所以再确定使用DMI时,你应该确保action中方法都是普通、开放的方法。否则你应该加上安全控制。
如果同一个action的不同方法使用的是相同的配置(同样的拦截器引用、同样的result映射),那么可以使用动态方法调用;如果不同的方法调用需要不同的拦截器引用、不同的result映射,那么可以使用action元素的method属性,为同一个action配置多个别名。
默认的Action
如果你请求一个不存在的acting,那么结果将是HTTP 404错误,即页面没有发现错误。在struts2中,你可以指定一个默认的action,如果一个请求没有与其相匹配的action,那么默认的action个将被执行,配置如下:
<package name="default" extends="struts-default">
<default-action-ref name="hello" />
<action name="hello">
<result>/hello.jsp</result>
</action>
</package>
通配符映射
随着web应用程序规模增加,所需的action也会增多,从而导致了大量的action映射,使用通配符可以减少action配置的数量,使一些具有类似行为的acting或者action的方法可以使用通用的样式来配置。
通配符即*,用于匹配0个或多个字符,在配置action时,可以在action元素的name属性中使用*,类匹配任意字符,例如:
<action name="edit*" class="org.fyw.struts.action.Edit{1}Action">
<result name="failure">/failure.jsp</result>
<result>{1}.jsp</result>
</action>
我们在action元素name属性中使用了*,允许这个映射匹配所有以/edit开始的URI,例如/editNews和/editCategory,但是如果你请求/editNews/add,那么这个映射不会被匹配。
反斜杠字符被用作转义序列,因此*匹配*,\匹配反斜杠\字符。在上述配置中还有一个特殊的记号{1},这是作为占位字符使用,它将被通配符所匹配的值所替换
在action映射和acting结果中,通配符的值可以用记号{N}来访问,N是从1-9的数字,指出替换的是哪一个通配符匹配的值,整个请求URI可以用记号{0}来访问,例如:
<action name="*_*" class="org.fyw.struts.action.{1}Action" method="{2}">
<result>{0}.jsp</result>
</action>
当你访问/news_edit时,name属性中第一个配置news,第二个*匹配edit,class属性中使用的记号是{1},于是被news所替换,{2}同理。结果映射中使用的记号是{0},于是被整个URI即news_edit所替换,执行成功后,请求被导向到news_edit.jsp页面。
通配符方法设置的另一种常见方式是使用后缀通配符,例如:
<action name="news_*" class="org.fyw.struts.action.NewsAction" method="{1}">
<result>{1}.jsp</result>
</action>