SAStrutsのチュートリアル1 index.jsp

まずは、index.jspですが、
src/main/webapp/WEB-INF/view/index.jspにあります。

見どころ1(f:url)

<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />


href=”${f:url(‘/css/sa.css’)}”


となっていますが、これはhref="/sa-struts-tutorial/css/sa.css"と展開されます。
相対パスで悩んだり、コンテキストパスを取得するために苦労しなくて済みますね。
(というわけで、コンテキストパスからのパスを指定したいような場合には役に立ちそうです)
ちょいと前のバージョンだと

<link rel="stylesheet" type="text/css" href="<%= request.getContextPath() %>/css/sa.css")}">

のようにパスを取得していました。

見どころ2(Actionの決定ルール)

各リンクは
普通のリンクタグで、

<a href="add/">足し算</a>

のように指定しています。このあたりに、SAStrutsのパス解析のルールが潜んでいます。


ちなみにフルパスとすると
http://host/sa-struts-tutorial/add/
となります。
SAStrutsのパス解析については以下の手順
アプリケーションコンテキスト(sa-struts-tutorial)以降のパスを抽出 ⇒ /add/
最後の「/」をActionに変換(「/」で終わらない場合はAction付与(*1))⇒ /addAction
最後の「/」の後ろの1字を大文字に変換⇒ /AddAction
「/」を「.」に変換⇒ .AddAction
ルートパッケージ(*2).actionを頭につける⇒ ルートパッケージ.action.AddAction


このルールによって、
tutorial.action.AddActionというActionが対応付けられます。


*1 さらに階層を掘り、/add/diff/に紐づく、action.add.DiffActionなどを作成した場合で、
かつ、AddAction#diffメソッドもあるような場合、パス解析の際に、頭から解析していくため、
AddActionがコンポーネントから取得され、そこでdiffメソッドが見つかってしまうので、上記と異なる動作をします。
明示的に、/add/diff/indexと指定する必要があります。

*2 convention.diconに設定した(している値)

見どころ3(index.jspの代わりとActionの内容)

http://localhost:8080/sa-struts-tutorial/
にアクセスして、開いたページは、直下のindex.jspでもないし、上記ルールのActionも存在しないけど・・・
ルートパッケージ.action.IndexAction
が呼ばれるようになっています。(index.jspがあればそっちが呼ばれる)
では、tutorial.action.IndexActionを見てみます。

package tutorial.action;
import org.seasar.struts.annotation.Execute;
public class IndexAction {
  @Execute(validator = false)
  public String index() {
  return "index.jsp";
  }
}

Actionを継承もしていないし、executeメソッドも存在しません。(さらに重要なのは、シングルトンじゃないという点ですが、今は気にしない)


@Executeが付いているメソッドが、実行されるメソッドになります。(*3)
シグネチャとしては、引数なしで、返り値がStringである必要があります。
返り値は、遷移先のjspになります(そもそもStrutsはソース内に遷移先を書かないというFwなのですが・・・まぁこれで設定ファイルとおさらばできるならめっけもんです)


*3 実行メソッドは、getXxx/setXxxにしない方がよい。S2本体がアクセサとして判断してアクセスしてしまうため。


また、このjspのパスですが、
/から始まる場合は、コンテキストからのパスと解釈され、
/から始まらない場合、Actionからの相対パスとなります


/context/add/というパスのActionの返り値がindex.jspだった場合、/context/add/index.jspと解釈されるし、
/index.jspだった場合、/context/index.jspとなる。


としてますが、実際のjspの配置先は、WEB-INF/viewです。あれ?というわけで、web.xml

  <context-param>
    <param-name>sastruts.VIEW_PREFIX</param-name>
    <param-value>/WEB-INF/view</param-value>
  </context-param>	

という設定があったりするわけですね。