コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

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

で問題なし(あたりまえ)。
結論がないですが、そんな感じです。