[Seasar-user:2586] [S2Struts] アクション自動登録のURIについて
Jun Futagawa
jfut
2005年 9月 19日 (月) 12:25:31 JST
ふたがわです。
S2StrutsV1.2.0-EA2の無設定Struts大変気に入りました。
ソース眺めてて思ったんですが、アクション登録時のURIが/hoge のように
すべて / 直下に登録されるようになっているため、下記のような場合
名前がぶつかってしまって良くないかなと思いました。
org.example.foo.HogeAction
-> /hoge (/hoge.do)
org.example.bar.HogeAction
-> /hoge (/hoge.do)
そこで、下記のようにパッケージ名のルートを設定で指定してルート以下の
パッケージ名もURIに含めるようにしていただけると嬉しいです。
* struts-config.xml
<plug-in className="org.seasar.struts.plugin.AutoStrutsConfigRegisterPlugIn">
<set-property property="enableJar" value="false"/>
<set-property property="docRoot" value="/pages"/>
<set-property property="packageRoot" value="org.example"/>
</plug-in>
org.example.foo.HogeAction
-> /foo/hoge (/foo/hoge.do)
org.example.bar.HogeAction
-> /bar/hoge (/bar/hoge.do)
せっかくなのでS2StrutsExample-V1.2.0-EA2のActionに対応できるように考えると、
次のような書き方ができると便利なのかなと思います。
<set-property property="packageRoot" value="org.seasar.struts.examples.*.(action)"/>
「*」の文字列をURIに含める
「()」内の文字列がある場合は、それをURIに含めない
上記に当てはまらない文字列はすべてURIに含める
下記修正例ですが、getActionPathが力ずくで賢くないので、
もっとスマートなやり方があると思います。。。
* org.seasar.struts.config.AutoStrutsConfigRuleImpl
* org.seasar.struts.config.AutoStrutsConfigRule
* org.seasar.struts.plugin.AutoStrutsConfigRegisterPlugIn
packageRoot用のsetter/getter追加
* org.seasar.struts.config.rule.ZeroConfigActionRuleImpl.java
public String getPath(Class actionClass, ModuleConfig config) {
return CommonNamingRule.getActionPath(configRule.getPackageRoot(), actionClass.getName());
}
* org.seasar.struts.config.rule.CommonNamingRule.java
public static String getActionPath(String regex, String path) {
if (StringUtil.isEmpty(path))
return null;
if (! StringUtil.isEmpty(regex)) {
regex = regex.replaceAll("\\(", "(?:").replaceAll("\\)", ".)?");
regex = regex.replaceAll("\\.", "\\\\.").replaceAll("\\*", "(.*?)");
regex += "(.*?)$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(path);
if (matcher.find()) {
StringBuffer buffer = new StringBuffer();
for (int i = 1; i < matcher.groupCount() + 1; i++) {
buffer.append(decapitalizeName(matcher.group(i))).append(".");
}
buffer.deleteCharAt(buffer.length() - 1);
path = buffer.toString();
}
}
path = "." + decapitalizeName(path);
path = path.replaceAll("\\.{2}?", ".").replaceAll("\\.", "/");
return path.replaceFirst("Action$", "");
}
* testGetActionPath()
assertEquals("/validate/validate", CommonNamingRule.getActionPath(
"org.seasar.struts.examples.*.(action)",
"org.seasar.struts.examples.validate.ValidateAction"));
assertEquals("/employee/employeeSearch", CommonNamingRule.getActionPath(
"org.seasar.struts.examples.*.(action)",
"org.seasar.struts.examples.employee.action.EmployeeSearchAction"));
assertEquals("/add/add", CommonNamingRule.getActionPath(
"org.seasar.struts.examples.*.(action)",
"org.seasar.struts.examples.add.AddAction"));
ご検討よろしくお願いいたします。
--
ふたがわ
Seasar-user メーリングリストの案内