自從ror熱潮席卷web開發界以來,慣例優于配置的快速開發理念便深入人心。
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的更高版本中卻未能獲通過,這不能不說是個遺憾。