同じアクションクラスで処理を切り替える †<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 <action name="inputForm" path="/execute" attribute="otherForm".... とすると、<bean:write name="otherForm"/>で値を取得できます。 プロパティは保持される †<html:text property="userid" /> は画面が切り替わってもパラメータが保持されてますよね。 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;であることに注意。 この記事は
現在のアクセス:76477 |