#topicpath
----
#contents


*** スコープからとれても、<%=hoge%>できるわけじゃない
なんだかわかってる人には当たり前のことなのかもしれませんが、いかんせん初心者なもんで、書き留めておきます。
 <logic:present name="hoge" >
   <bean:write name="hoge"/> 
 </logic:present>
 <%=hoge%>
の最後の行は、コンパイルエラーになります。<bean:define .../>したときは大丈夫なわけですが、これはdefineタグが変数定義までやってるんでしょうね。ソースを見ると
 pageContext.setAttribute(id, value, inScope);
ってやってますね。((たしかタグハンドラのスクリプティング変数の定義..とかいうやつ))

*** アクションマッピングのattributeの意味
通常、FormBeanはアクションマッピングのname属性の値でスコープに格納されます。
たとえば
 <action name="inputForm" path="/execute"....
とすると、
 session.getAttribute("inputForm");や
 <bean:write name="inputForm"/>
ができるようになります。どうもデフォルトの格納スコープはセッションみたいです。((ホントか?環境依存?また、指定できるのはrequest , sessionのどちらかです))~
んでFormBeanを、このactionタグのname属性とは別の値でスコープに格納したいときに、attribute属性を使います。
 <action name="inputForm" path="/execute"  attribute="otherForm"....
とすると、<bean:write name="otherForm"/>で値を取得できます。


***プロパティは保持される
 <html:text property="userid" />
は画面が切り替わってもパラメータが保持されてますよね。~
パラメータの操作(setAttribute)などをしなくても、入力値が保持されるんですね。

***bean:write
 <bean:write name="username"/>
はxxxx.getAttribute("username") して取得したインスタンスのtoString()を画面に書き出すみたいです。((よく、html:textで指定したプロパティをwriteしようとしてエラーを出しました。ややこしいですが、writeはコンテキストにセットされた属性、html:textはparameterですね))

***logic:present
 <logic:present name="username">
   <bean:write name="username"/>
 </logic:present>
というようにlogic:presentで囲まないとusernameがコンテキストにないときにエラーになってしまいます。ようするにxxx.getAttribute("username");がnullかどうかをチェックするためのイディオムです。

***bean:define
 <bean:define id="user_name" name="username"/>
 <bean:write name="user_name"/>
 <%=user_name%>
とすると、
 user_name = xxx.getAttribute("username");
といったことが行われます。つまり、スコープからインスタンスを(name属性の名称で)取り出し、(idで指定した文字列の)変数を定義します。


 <bean:define id="user_name" value="username"/>
とすると、user_nameという変数に"username"という「文字列」が格納されます。


***bean:size
 <bean:size id="count" name="username" />
 <bean:write name="count"/>
 <%=count%>
とすると、
 int count = xxx.getAttribute(username).size();
みたいなことが行われます。つまり、スコープからインスタンスを取り出し、それがCollectionの場合に要素数を返します。((bean:sizeはスコープからデータを取り出すだけでなく、idで指定した文字列で変数とPageContextに値をセットします。))



***クエリを追加する
 <html:link action="/execute" paramId="userid" paramName="userID">検索</html:link>
ってやると、
 execute.do?userid=[userIDの値]
となる。userIDってのはxxx.getAttribute("userID");のこと(確か)。


***logic:empty
 <logic:empty name="userid">
は..。なんだっけ?





*** ApplicationResources.properties にアクセスする
 <bean:message key="app.title"/>


*** タグをxhtmlに対応する
デフォルトでは、Strutsのタグはxhmlに対応していない(閉じタグとか)。
 <html:html xhtml="true">
とすることで、xhtml形式のタグを出力します。


*** 初期アクセスのパラメタエラーを回避する
たとえば何かを検索する画面(JSP)で、最初にその画面を開いたときは検索パラメータがのってませんよね。検索パラメータを画面に表示している場合、最初のアクセスだけエラーにならないようなロジックが必要になりそうですが、こんな回避法がありました。何のことはない、パラメタチェックを入れているだけですが、こんな感じでやるとキレイになりますね。
 こちらは検索側の記述
 <html:form action="/search">
   <html:text property="input" />
   <html:submit>送信</html:submit>
 </html:form>

 こちらが表示側の記述
 <logic:present name="input">
  入力値: <bean:write name="input" />
 </logic:present>
ちなみに、下のinputはrequest.getParameter("input");ではなく、xxxx.getAttribute("input")((xxxxはrequestとか、sessionとかいろいろ));であることに注意。

----
この記事は
#vote(おもしろかった[1],そうでもない[0])


-メモ書きなので、つたない内容です。ご了承下さい。コメントがありましたらお願いします。 -- [[きの]] &new{2004-01-08 (木) 18:33:31};

#comment
#navi(Java/Struts)

SIZE(10){現在のアクセス:&counter;}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS