首先我们来看下struts2定义action的三种方式:xml配置、@Action注解、自动扫描action类。
- xml配置
<package name="user-package" namespace="/user" extends="struts" >
<action name="index" class="com.action.UserAction" method="index">
<result name="success" >/WEB-INF/content/user/index.jsp</result>
</action>
</package>
- @Action注解
@Action("index")
public String index(){
return SUCCESS;
}
- 自动扫描Action类
#禁止扫描action的class
struts.convention.action.disableScanning=false
#Action后缀
struts.convention.action.suffix=Action
#用于配置包名后缀。默认为action、actions、struts
struts.convention.package.locators=action
#设置即使没有@Action注释,依然创建Action映射
struts.convention.action.mapAllMatches=true
对于xml配置@Action注解都定义了action的名称,而自动扫描Action类方式创建action时默认是使用ActionNameBuilder的实现类SEOActionNameBuilder来生成actionName,在struts2-convention-plugin的struts-plugin.xml配置如下:
<bean type="org.apache.struts2.convention.ActionNameBuilder" name="convention" class="org.apache.struts2.convention.SEOActionNameBuilder"/>
<constant name="struts.convention.actionNameBuilder" value="convention"/>
在SEOActionNameBuilder中主要通过以下三个配置来生成actionName
- struts.convention.action.name.lowercase是否转换成小写,默认为true
- struts.convention.action.name.separator分隔符,默认为中划线-
- struts.convention.action.suffix 后缀,默认为Action
UserAction-->user
UserAccountAction-->user-account
UserACcountAction-->user-account
UserAcCountAction-->user-ac-count
修改配置为
struts.convention.action.name.lowercase=false
struts.convention.action.name.separator=
则生成的actionName如下:
UserAction-->User
UserAccountAction-->UserAccount
UserACcountAction-->UserACcount
UserAcCountAction-->UserAcCount
根据我们平常的编码习惯,变量名习惯使用类名,第一个字母小写,如果我们想生成以下的actionName
UserAction-->user
UserAccountAction-->userAccount
UserACcountAction-->userACcount
UserAcCountAction-->userAcCount
第一步:自定义ActionNameBuilder实现类<span style="font-size:14px;">public class SimpleActionNameBuilder implements org.apache.struts2.convention.ActionNameBuilder{
private String suffixRegex;
private static final String BLANK = "";
@Inject
public SimpleActionNameBuilder(@Inject(value="struts.convention.action.suffix") String actionSuffix){
suffixRegex = actionSuffix+"$";
}
public String build(String className) {
String actionName = className.replaceAll(suffixRegex, BLANK);
actionName = actionName.substring(0, 1).toLowerCase()+actionName.substring(1, actionName.length());
return actionName;
}
}</span>
第二步:配置ActionNameBuilder
<bean type="org.apache.struts2.convention.ActionNameBuilder" name="simpleActionNameBuilder" class="com.test.support.struts2.SimpleActionNameBuilder"/>
<constant name="struts.convention.actionNameBuilder" value="simpleActionNameBuilder"/>