ラベル struts2 の投稿を表示しています。 すべての投稿を表示
ラベル struts2 の投稿を表示しています。 すべての投稿を表示

2011/04/19

Struts2 ConventionとTilesのJSP検索パス

環境: Struts 2.2.1.1, Tiles 2.2.2

Struts2 ConventionとTilesを一緒に使うときの話。

Conventionが.jsp を検索するパスはデフォルトで /WEB-INF/content (constant: struts.convention.result.path) だが、Tilesは Context Root から検索する。Tilesの方はソースを追ってみた限りでは、templateに共通のプリフィックスを付加するような処理はなく、templateの値がそのままdispatchされるようだ。

できる限り設定の追加は避けたいので、Tiles のパスを長々と書くことにした。

tiles.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">

<tiles-definitions>

<definition name="/main.tiles" template="/WEB-INF/content/main.jsp">
<put-attribute name="body" value="/WEB-INF/content/body.jsp" />
<put-attribute name="footer" value="/WEB-INF/content/footer.jsp" />
</definition>

</tiles-definitions>



template attribute の /WEB-INF/conent を書かずに済む方法があれば、すっきりするのだが。

2011/04/16

Struts2 Convention Pluginとsubmitタグ

環境: struts2-2.2.2.1

今ではdeprecatedなCodebehind Pluginではできたのだが、Struts2 Convention Pluginはsubmitタグのmethod attributeを見てくれない。

Actionクラスのexecute()以外に実行したいメソッドがある場合は、@Actionで指定するポリシーのようだ。リクエストパラメータでメソッドの区別をするのではなく、URLで区別するということだ。
理由は知らないけど、Codebehindではsubmitの値次第で、意図しないpublicメソッドが呼べてしまうしね。
@Actionならば、指定したメソッドだけが呼び出し対象になる。

それでConvention Pluginでは次のとおり。
submitのactionを指定して、その値を@Actionの引数に対応させる。
submitが1つのときはformのactionに指定しても良い。
ただし複数のsubmitが存在する場合は、submitのactionを使ってそれぞれ異なるURLを指定する。

.jsp

<s:form> 
<s:submit action="hoge" value="Hoge">
<s:form>


Action Class

@Action("hoge") 
public String hoge() {
...
}