Hatena::ブログ(Diary)

130単位

2009-03-03

SAStruts リンク記述におけるs:linkとhtml:linkの比較

http://localhost:8080/app/subapp/action/method/1

ホスト名以降、「メインアプリ/サブアプリ/アクション/メソッド/パラメータ」とします。

SAStrutsでこのURLアクセスした場合の、<s:link>と<html:link>の挙動を比較してみます。

s:link

以下、公式リファレンスの引用です。

SAStrutsには、Strutshtml:link継承したs:linkが用意されています。 href属性を設定するときに、コンテキストルートを自動的に補完させる場合に使います。パスを/ではじめた場合は、コンテキストルートからみたパスになります。パスが/ではじまっていない場合は、JSPからみたパスになります。

Super Agile Struts - Feature Reference
JSP
<s:link href="">A</s:link>
<s:link href="link">B</s:link>
<s:link href="./">C</s:link>
<s:link href="./link">D</s:link>
<s:link href="../">E</s:link>
<s:link href="../../">F</s:link>
<s:link href="/">G</s:link>
<s:link href="/link">H</s:link>
出力html

想定される遷移先をコメントで示しています。

<a href="/app/subapp/action/">A</a>         <!-- 同じアクションのindexメソッド -->
<a href="/app/subapp/action/link">B</a>     <!-- 同じアクションのlinkメソッド -->
<a href="/app/subapp/action/./">C</a>       <!-- 同じアクションのindexメソッド -->
<a href="/app/subapp/action/./link">D</a>   <!-- 同じアクションのlinkメソッド -->
<a href="/app/subapp/action/../">E</a>      <!-- サブアプリのIndexアクション -->
<a href="/app/subapp/action/../../">F</a>   <!-- メインアプリのIndexアクション -->
<a href="/app/">G</a>                       <!-- メインアプリのIndexアクション -->
<a href="/app/link">H</a>                   <!-- メインアプリのLinkアクション -->
遷移先URL
A http://localhost:8080/app/subapp/action/
B http://localhost:8080/app/subapp/action/link
C http://localhost:8080/app/subapp/action/
D http://localhost:8080/app/subapp/action/link
E http://localhost:8080/app/subapp/
F http://localhost:8080/app/
G http://localhost:8080/app/
H http://localhost:8080/app/link

html:link

JSP
<html:link href="">A</html:link>
<html:link href="link">B</html:link>
<html:link href="./">C</html:link>
<html:link href="./link">D</html:link>
<html:link href="../">E</html:link>
<html:link href="../../">F</html:link>
<html:link href="/">G</html:link>
<html:link href="/link">H</html:link>
出力html
<a href="">A</a>        <!-- 同じアクションの同じメソッド、同じパラメータ -->
<a href="link">B</a>    <!-- 同じアクションの同じメソッド、linkパラメータ -->
<a href="./">C</a>      <!-- 同じアクションの同じメソッド、パラメータなし -->
<a href="./link">D</a>  <!-- 同じアクションの同じメソッド、linkパラメータ -->
<a href="../">E</a>     <!-- 同じアクションのindexメソッド -->
<a href="../../">F</a>  <!-- サブアプリのIndexアクション -->
<a href="/">G</a>       <!-- ドキュメントルート -->
<a href="/link">H</a>   <!-- 別のWebアプリ -->
遷移先URL
A http://localhost:8080/app/subapp/action/method/1
B http://localhost:8080/app/subapp/action/method/link
C http://localhost:8080/app/subapp/action/method/
D http://localhost:8080/app/subapp/action/method/link
E http://localhost:8080/app/subapp/action/
F http://localhost:8080/app/subapp/
G http://localhost:8080/
H http://localhost:8080/link

まとめ

基本的には、<s:link>を使うのが良いと思います。<html:link>だと、以下の場合に遷移先URLが異なってしまいます。

html:link 「/」で終わるURLの場合
http://localhost:8080/app/subapp/action/method/1/
A http://localhost:8080/app/subapp/action/method/1/
B http://localhost:8080/app/subapp/action/method/1/link
C http://localhost:8080/app/subapp/action/method/1/
D http://localhost:8080/app/subapp/action/method/1/link
E http://localhost:8080/app/subapp/action/method/
F http://localhost:8080/app/subapp/action/

<s:link>であれば、「/」で終わっていても同じURLになります。自動補完により、必ず絶対パスで出力されるためです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/deeeki/20090303/jsplinktaglib