http://localhost:8080/app/subapp/action/method/1
ホスト名以降、「メインアプリ/サブアプリ/アクション/メソッド/パラメータ」とします。
SAStrutsでこのURLにアクセスした場合の、<s:link>と<html:link>の挙動を比較してみます。
s:link
以下、公式リファレンスの引用です。
SAStrutsには、Strutsのhtml: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になります。自動補完により、必ず絶対パスで出力されるためです。