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:linkhref="">A</s:link>
<s:linkhref="link">B</s:link>
<s:linkhref="./">C</s:link>
<s:linkhref="./link">D</s:link>
<s:linkhref="../">E</s:link>
<s:linkhref="http://www.cnblogs.com/">F</s:link>
<s:linkhref="/">G</s:link>
<s:linkhref="/link">H</s:link>
出力html

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

<ahref="/app/subapp/action/">A</a>         <!-- 同じアクションのindexメソッド -->
<ahref="/app/subapp/action/link">B</a>     <!-- 同じアクションのlinkメソッド -->
<ahref="/app/subapp/action/./">C</a>       <!-- 同じアクションのindexメソッド -->
<ahref="/app/subapp/action/./link">D</a>   <!-- 同じアクションのlinkメソッド -->
<ahref="/app/subapp/action/../">E</a>      <!-- サブアプリのIndexアクション -->
<ahref="/app/subapp/action/http://www.cnblogs.com/">F</a>   <!-- メインアプリのIndexアクション -->
<ahref="/app/">G</a>                       <!-- メインアプリのIndexアクション -->
<ahref="/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:linkhref="">A</html:link>
<html:linkhref="link">B</html:link>
<html:linkhref="./">C</html:link>
<html:linkhref="./link">D</html:link>
<html:linkhref="../">E</html:link>
<html:linkhref="http://www.cnblogs.com/">F</html:link>
<html:linkhref="/">G</html:link>
<html:linkhref="/link">H</html:link>
出力html
<ahref="">A</a>        <!-- 同じアクションの同じメソッド、同じパラメータ -->
<ahref="link">B</a>    <!-- 同じアクションの同じメソッド、linkパラメータ -->
<ahref="./">C</a>      <!-- 同じアクションの同じメソッド、パラメータなし -->
<ahref="./link">D</a>  <!-- 同じアクションの同じメソッド、linkパラメータ -->
<ahref="../">E</a>     <!-- 同じアクションのindexメソッド -->
<ahref="http://www.cnblogs.com/">F</a>  <!-- サブアプリのIndexアクション -->
<ahref="/">G</a>       <!-- ドキュメントルート -->
<ahref="/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になります。自動補完により、必ず絶対パスで出力されるためです。

原文地址:https://www.cnblogs.com/aggavara/p/2708713.html