struts2中对action name支持通配符配置,所以使其方便的实现零配置成为可能。
实现零配置后的开发会是怎样,开发员不用配置struts.xml,也不用在action代码中写annotation,是真正干净的零配置。以下的代码是我们希望达到的效果。
action示例
package net.jacker.ww.sys;
public class UserAction extends BaseAction {
public String execute() throws Exception {
return "default";
// default表示使用缺省页面,路径名和action所在包和类名相关,为 /sys/User.jsp
}
public String roles(){
return view("/sys/UserRoles"); // 指定展示页面为 /sys/UserRoles.jsp
}
public String xxxx(){
return redirect("/sys/User.do"); // 重定向,url为 /sys/User.do
}
}
以上action的三个方法无需配置,将可以分别用以下链接进行访问:
http://localhost:8080/sys/User.do
http://localhost:8080/sys/User!roles.do
http://localhost:8080/sys/User!xxxx.do(将重定向到User.do)
下面我们来看看以上零配置是如何做到的。
首先,我们需要在struts.xml中做如下的配置。
<struts>
<constant name="struts.enable.SlashesInActionNames" value="true" /> <!-- action名可以有'/'字符 -->
<constant name="struts.action.extension" value="do"/> <!-- .do为访问扩展名 -->
<package name="default" extends="struts-default">
<!-- 通配符配置,匹配所有的URL对action的访问 -->
<action name="*/*!*" class="net.jacker.ww.{1}.{2}Action" method="{3}">
<result name="default" type="dispatcher">/{1}/{2}.jsp</result>
<result name="view" type="dispatcher">${viewpath}.jsp</result>
<result name="redirect" type="redirect">${viewpath}</result>
</action>
<action name="*/*" class="net.jacker.ww.{1}.{2}Action">
<result name="default" type="dispatcher">/{1}/{2}.jsp</result>
<result name="view" type="dispatcher">${viewpath}.jsp</result>
<result name="redirect" type="redirect">${viewpath}</result>
</action>
</package>
</struts>
然后是写一个Action基类,BaseAction.java
package net.jacker.ww;
import com.opensymphony.xwork2.Action;
public abstract class BaseAction implements Action{
String viewpath; //该属性会在struts.xml中用到
public String view(String vpath){
viewpath = vpath;
return "view";
}
public String redirect(String vpath){
viewpath = vpath;
return "redirect";
}
public String getViewpath() {
return viewpath;
}
}
做好以上的基础工作,你的action类只要继承BaseAction,符合XxxAction的命名规则,放到对应的包下,页面也放到对应的路径,就可以无需配置而访问了。
如果要替换view层也很简单,只要对struts.xml做简单修改,比如:
<result name="default" type="dispatcher">/{1}/{2}.jsp</result>
改为
<result name="default" type="velocity">/{1}/{2}.vtl</result>
修改后的struts将统一使用velocity模板取代jsp作为页面展示层。
注意:
实测后发现,以上零配置的做法只在struts2.0.11版本中可以使用,在struts2.0.XX的更高版本中却未能获通过,这不能不说是个遗憾。