Top / Struts / TIPS集

同じアクションクラスで処理を切り替える

<action path="/showSetting" forward="/setting.do?action=show" />
<action path="/editSetting" forward="/setting.do?action=edit" />
<action path="/setting" type="kino.actions.SettingAction" >
  <forward name="show.success" path=".tiles.showSetting" />
  <forward name="edit.success" path=".tiles.editSetting" />
</action>

てやって、request.getParameter("action") で切り替える

同じアクションクラスで、遷移先を切り替える

処理がほとんど同じでURLをきりかえるだけなら

<action path="/showSetting" type="kino.actions.SettingAction" >
  <forward name="success" path=".tiles.showSetting" />
</action>
<action path="/editSetting" type="kino.actions.SettingAction" >
  <forward name="success" path=".tiles.editSetting" />
</action>

てやればよい。。

actionタグのparameterにアクセスする。

struts-config.xml に

<action path="/setting" type="kino.SettingAction" parameter="hoge" />

としたときのparameterの値にActionクラスからアクセスする方法。

String parameter=mapping.getParameter(); <- mappingはActionMapping

スタイルシートの指定方法

ディレクトリ構成が[contextroot]/css/stylesheet.cssってなってる時。

<link href="<html:rewrite page='/css/stylesheet.css'/>" rel="stylesheet" type="text/css"/>

がキレイですね。モジュール化している場合は使えませんが*1

よりよいのは struts-config.xml に

<global-forwards>
  <forward name="stylesheet" path="/theme/Master.css"/>
</global-forwards>

と書いて、jspに

<link href="<html:rewrite forward='stylesheet' />" rel="stylesheet" type="text/css"/>

とglobal-fowardを参照するのがよいですね。

リクエストパラメータから、変数を定義

あるスコープから変数を定義するのはbean:defineでできますが、パラメータからは変数定義の仕方を知りませんでした。ようするに

hoge=request.getParameter("HOGE");

をしたいのですが、ようやくわかりました。

<bean:parameter id="hoge" name="trackbackUrl"/>

<%  String hoge=(String)request.getParameter("trackbackUrl"); %>

は同じ意味ですね。当然<%=hoge%>もできます。trackbackUrlってパラメータがなかったときにエラーになってしまうので、それがいやな場合デフォルト値を指定します。

<bean:parameter id="hoge" name="trackbackUrl" value=""/>

スコープからとれても、<%=hoge%>できるわけじゃない

なんだかわかってる人には当たり前のことなのかもしれませんが、いかんせん初心者なもんで、書き留めておきます。

<logic:present name="hoge" >
  <bean:write name="hoge"/> 
</logic:present>
<%=hoge%>

の最後の行は、コンパイルエラーになります。<bean:define .../>したときは大丈夫なわけですが、これはdefineタグが変数定義までやってるんでしょうね。ソースを見ると

pageContext.setAttribute(id, value, inScope);

ってやってますね。*2

アクションマッピングのattributeの意味

通常、FormBean?はアクションマッピングのname属性の値でスコープに格納されます。 たとえば

<action name="inputForm" path="/execute"....

とすると、

session.getAttribute("inputForm");や
<bean:write name="inputForm"/>

ができるようになります。どうもデフォルトの格納スコープはセッションみたいです。*3
んで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()を画面に書き出すみたいです。*4

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の場合に要素数を返します。*5

クエリを追加する

<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"/>

<bean:write>タグのignore属性

<bean:write>タグのignore属性をtrueにしている場合、メッセージがない場合は何も表示されない。

タグをxhtmlに対応する

デフォルトでは、Strutsのタグはxhmlに対応していない(閉じタグとか)。

<html:html xhtml="true">

とすることで、xhtml形式のタグを出力します。ってtiles使うとincludeされる側がそうならない気がするんですけど。。

初期アクセスのパラメタエラーを回避する

たとえば何かを検索する画面(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")*6;であることに注意。


この記事は

選択肢 投票
おもしろかった 87  
そうでもない 17  
  • メモ書きなので、つたない内容です。ご了承下さい。コメントがありましたらお願いします。 -- きの? 2004-01-08 (木) 18:33:31

Top / Struts / TIPS集

現在のアクセス:76477


*1 無難に<%=request.getContextPath?()+"/css....."%>ってやりましょう
*2 たしかタグハンドラのスクリプティング変数の定義..とかいうやつ
*3 ホントか?環境依存?また、指定できるのはrequest , sessionのどちらかです
*4 よく、html:textで指定したプロパティをwriteしようとしてエラーを出しました。ややこしいですが、writeはコンテキストにセットされた属性、html:textはparameterですね
*5 bean:sizeはスコープからデータを取り出すだけでなく、idで指定した文字列で変数とPageContext?に値をセットします。
*6 xxxxはrequestとか、sessionとかいろいろ

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-06-15 (木) 17:56:36 (542d)