cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

JSPやStrutsに関する覚書

HttpServletRequest#setAttribute("message", "value")された状態でjspそれぞれの表示の仕方

<%-- Strutsのタグで表示 --%>
<bean:write name="message"/>

<%-- JSTLのタグで表示 --%>
<c:out value="${message}" />

<%-- ELで表示 --%>
${f:h(message)}

web.xmlの構成要素

    • {論理名}
    • {本体の場所}
      • {引数名}
      • {引数値}
    • {論理名}
    • /*
    • {いつフィルタが実行されるか。REQUESTかFORWARDかINCLUDEかERROR}
    • {論理名}
    • {本体の場所}

Struts暗黙ルール

Strutsタグライブラリ html:編

<html:hidden name="Bean" property="Property" />
  • nameアトリビュート省略時はそのフォームに関連付けられているActionFormが使用される
    • 事前のActionFormを使いたければ、(同じActionFormを使い回ししているのでなければ) name="事前のActionFormの論理名" という具合に指定しなければいけない
    • 事前のActionFormに渡された値をそのまま使いたい場合のほうが多いので(入力確認画面など)この指定を行うことは多い
  • valueアトリビュートを省略していると valueはpropertyの値になるが、追加するとvalueはそれになる
    • そうすると普通のとほとんど変わらないのでわざわざStrutsでやることかと思う
    • つまり通常はvalueを略して使う
<html:form action="uri"></html:form>

↓展開時、そのフォームに紐づけられたActionFormが指定されたnameアトリビュートが追加される

<form name="FooActionForm" method="post" action="/uri.do"></form>

nameを省略したときに参照されるBeanはそれが含まれるフォームのものなことに注意。
たとえばで指定されたパスの属するフォームアクション。

Strutsタグライブラリ bean:編

requestスコープにtestという名前のパラメータが渡されているとき

<bean:parameter id="TEST" name="test" /> //リクエストパラメータから"test"というパラメータを取得し、"TEST"という変数に格納

<%= TEST %>
<bean:write name="TEST" />
両者ともTESTの中身を表示

すなわち、にnameアトリビュートだけ指定した場合は<%= %>と結果は同じになる。

  • request parameterにだけ入れられた値*1で直接表示させることはできず、事前にでbean化させないと不可能だと思われる。

ページのパーツを複数ページで使いまわす時、特定のページだけにある動作を設定するのに役立つ。

<bean:define id="main" value="1"/>

↑これをページ冒頭に書いておく

<logic:notPresent name="main">
  〜 mainページだけでの動作 〜
</logic:notPresent>

みたいにするんだけど、これって本来のtilesの使い方じゃないと思う(本来はデザイン用)。

Strutsタグライブラリ logic:編

Beanを詰めたListを渡して

<logic:iterate id="Bean" name="Beanを詰めたリスト" >
<bean:write name="Bean" property="user" />
</logic:iterate>

という使い方が基本。他のやり方はよく知らない。
collectionというアトリビュートがあるようだが、これは<%= %>と組み合わせて使うのが前提?こんなふうに

<% int[] intArray = new int[] {1, 2}; %>
<logic:iterate id="int" collection='<%= intArray %>'>
<bean:write name="int" />
</logic:iterate> 

何かエラーが出るときにはたいていname属性を使う場面でうっかりcollection属性を使っていることが多い。

たいていはname属性(Bean)とvalue属性の比較
Beanの中身と比較するときにnameとpropertyを使う

Strutsタグライブラリ 全般編

Strutsタグライブラリは重ねて入れ子にすることができない!?

<input type="button" name="exe1" value="<bean:write name="modeStr" />実行" onclick="execute()" />

↑これは可能

<html:button property="exe2" value="<bean:write name="modeStr" />実行" onclick="execute()" />

↑これはエラー "等号記号が必要です"(の内側にを展開させたかったが)

カスタムタグの属性の値にカスタムタグを書くことは出来ません。
気持ちは分かりますけれどね

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9785&forum=12

*1:ActionFormに入っていない(AttributeでなくParameterにだけ)