SAStruts/JSP

JSPも参考に

設計

設計としてはView側のJSPはActionにくっついているものであり、他のActionから呼んで再利用するようなものではない。

SAStrutsのJSP

基本的に普通にJSPだったりStrutsのタグライブラリなのだがSAStruts用のtagや便利なELの関数もあるのでこれもあわせて

値をHTMLエスケープして出力する

hメソッドを使うことによって実体参照に置き換えて出力してくれる。

${f:h(hoge)}

エラーメッセージを出力する

バリデータでエラーが出た場合に押し返された場合そのメッセージを出力することができる

<html:errors />

リンクを貼る

基本的には通常のJSPの

<html:link>hoge</html:link>

タグを踏襲しているのだが、パスの指定が若干コンテキストパスを考慮したものになっていて便利になっている。

ここでは

http://localhost:8080/sample01/hoge/

にアクセスして表示されているJSPに対して記述しています。

httpからフルで書く

JSP

<s:link href="http://www.yahoo.co.jp/">hoge</s:link>

生成されるHTML

<a href="http://www.yahoo.co.jp/">hoge</a>

単に書く

JSP

<s:link href="piyo">piyo</s:link>

現在hogeActionにいるならば・・・生成されるHTMLは

<a href="/sample01/hoge/piyo">piyo</a>

ドメインのルートからのactionを含めたパスが自動付加される

頭にスラッシュつける

JSP

<s:link href="/fuga">fuga</s:link>

生成されるHTML

<a href="/sample01/fuga">fuga</a>

actionの階層を無視して別のactionを呼び出す際に使えそう

さかのぼってみる

JSP

<s:link href="../moge">moge</s:link>

生成されるHTML

<a href="/sample01/hoge/../moge">moge</a>

つまりに

http://localhost:8080/sample01/moge

アクセスするような動き

コンテキストを意識したURLを得る

ELの関数を使ってlinkタグで設定されるURLのみを得ることができる。

${f:url('hoge')}

注意する点とすれば、この関数はhttpから始まるようなフルのURLには通用しないということ

ということで画像を貼る時は

<img src="${f:url('/img/hoge.png')}" alt="ほげ" />

こんな感じ

foreachでコレクションをループする

action側で

public List<HogeDto> hogeDtoList;

としていたならば

<c:forEach var="hoge" items="hogeDtoList">
    ${ hoge.piyo }
</c:forEach>

ではなぜか1周だけループするという謎の挙動になる

↑ではなくて、こう書く

<c:forEach var="hoge" items="${ hogeDtoList }">
    ${ hoge.piyo }
</c:forEach>

各種入力フォームの設置

テキストボックスを設置する

基本。自明の場合は name 指定はいらないが、つけないとエラーも出ず値だけなくなった状態になることがあるので、name に form を必ず指定したほうがいいだろう。

<html:text property="hoge" name="piyoForm" />

taglibのタグは柔軟性が無く、JSのライブラリ等が使う独自属性を付与することができないので

<input name="hoge" value="${ piyoForm.hoge }" />

でもいいだろう

チェックボックスを設置する

これは別にSAStrutsとはなんの関係もないんだけど、ここにのせとく

JSP自体にはこのように書く

<html:multibox property="hoges" name="piyoForm" value="aaa" />

SAStrutsで入力フォームを作るときはサーバから画面を再現する入れ物と、画面からサーバへ値を送る入れ物を同じにしておく。 今回ならばpiyoForm。値受取り用のSAStrutsのFormクラスを画面出力用にも使うということ。

property属性に指定しているhogesはPiyoFormクラスのpublicメンバでString配列に設定。これはStringの配列じゃないとだめっぽい propertyとかnameとかvalueとか使うタグによって意味がかなり変わるのでこういうのやめてほしい・・・まあいいけど。

これでhogesが中身空っぽだったとすると

<input type="checkbox" name="hoges" value="aaa" />

というHTMLに展開される。

ここでこのチェックボックスにチェックを入れてサーバーに送信すると、piyoForm.hogesの配列に「aaa」という値が格納される。あとは勝手に取り出して煮る。

逆にpiyoForm.hoges配列に「aaa」という値を突っ込んでJSPを描画するとmultibox側がhoges配列の中身を全部調べてくれて、 自分に指定されているvalueと同じ物があれば自動的にcheckedの状態にしてくれる。

これで受けとりとその逆の再現が相互にできるようになっている。

セレクトボックスを作る

セレクトボックスはこのように作る

<html:select property="piyo" value="${ hogeForm.piyo }" >
    <c:forEach var="po" items="${ piyoOptions }">
        <html:option value="${ po.val }">${ po.name }</html:option>
    </c:forEach>
</html:select>

piyoOptionsの各要素が選択肢用の値と表示用の名前を持っているとする。

po.val の値と hogeForm.piyo の値が一致するとその選択肢が選択状態(selected)になる。

このような複数選択肢系は Action 側から Enum を持ち込んで、それを使うことで Java 側と統一が取れるのでそのような Enum を Action の 内部に作っておくといいだろう。

セレクトボックスを作る(マルチセレクト)

基本はセレクトボックスと同じだが

<html:select property="piyo" value="${ hogeForm.piyo }" multiple="multiple">

このようにmultiple属性をつける

複数選択した場合formにはList<String>としてマッピングされる。

ラジオボタンを作る

<html:radio property="hoge" value="v1" />
<html:radio property="hoge" value="v2" />

このように記述すると

<input type="radio" value="v1" name="hoge">
<input type="radio" value="v2" name="hoge">

のようなHTMLが生成される

PiyoFormに hoge プロパティが存在しその値がvalue値と一致しているとチェックが入る

押すボタンによって呼び出すActionメソッドを切り替えるボタン

<form name="hogeActionForm" method="POST" action="/sample01/hoge/">
    <input type="text" name="name" value="">
    <input type="submit" value="Submit" name="piyo">
    <input type="submit" value="Submit" name="fuga">
    <button type="submit" formaction="piyo">submit</button>
    <button type="submit" formaction="fuga">submit</button>
</form>

input submit の name 属性値で指定するActionメソッドを起動できる。 button タグの場合はformaction(html5の仕様)属性を入れるとブラウザ側がそのアドレスへリクエストしてくれるのでこれが使える。

タグ

sastruts/jsp.txt · 最終更新: 2017-08-23 10:10 by ore
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0