urlPatternの続きなり
なんとなく見えました。
rc6のブランクプロジェクトから、以下のファイルを作成して検証してみました。
まず、searchIp.jsp
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <title></title> </head> <body> <html:errors/> <s:form action="/ip"> <c:if test="${ipMasterItems != null}"> <table border="1"> <thead> <tr> <th>IP</th> <th>FQDN</th> <th><a href="reg">新規作成</a></th> </tr> </thead> <tbody> <c:forEach var="e" varStatus="s" items="${ipMasterItems}"> <tr> <td>${f:h(e.ip)}</td> <td>${f:h(e.fqdn)}</td> <td><a href="edit/${s.index}">編集</a></td> </tr> </c:forEach> </tbody> </table> </c:if> </s:form> </body> </html>
編集アンカーが問題の個所。
で、対応するAction。IpAction.java
package sample.action; import java.util.ArrayList; import java.util.List; import org.seasar.struts.annotation.Execute; import sample.entity.IpMaster; public class IpAction { public String index; public String ip; public String fqdn; public List<IpMaster> ipMasterItems; @Execute(validator = false) public String index() { System.out.println("!!index!!" + index); ipMasterItems = new ArrayList<IpMaster>(); for (int i = 0; i < 5; i++) { IpMaster ipMaster = new IpMaster(); ipMaster.ip = "ip" + i; ipMaster.fqdn = "fqdn" + i; ipMasterItems.add(ipMaster); } return "ipSearch.jsp"; } @Execute(validator = false, urlPattern = "edit/{index}") public String edit() { System.out.println("!!edit!!" + index); // 意味なし ip = "ip"; fqdn = "fqdn"; return "ipEdit.jsp"; } }
このまま、「コンテキストルート/ip」にアクセスし、適当な編集アンカーを押すとアドレスは「/edit/1」のようになるが、「ipSearch.jsp」に遷移しコンソールには、
!!index!!1
と表示される。
ここまでやって少しわかって、
@Execute(validator = false) public String index() { System.out.println("!!index!!" + index);
を
@Execute(validator = false, urlPattern = "index") public String index2() { System.out.println("!!index!!" + index);
として、urlPatternにindexを指定して、メソッド名をindex2にすると期待通りに動いた。
メソッドindexとフィールドindexが重複しているのがいけない?
Java言語的にはどうだったけ?と思ったのでテストしてみた。
package test.action; public class Abc { public static void main(String[] args) { Abc abc = new Abc(); System.out.println("test()= " + abc.test()); System.out.println("test= " + abc.test); } public String test() { return "method"; } public String test = "field"; }
結果は、
test()= method test= field
で問題なし(あたりまえ)。
結論がないですが、そんな感じです。