- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2023-06-15T08:56:36+00:00","","")
#topicpath
----
#contents
*** ApplicationResources.properties にアクセスする
<bean:message key="app.title"/>
*** 同じアクションクラスで処理を切り替える [#m0e48464]
<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") で切り替える
*** 同じアクションクラスで、遷移先を切り替える [#u6758a9b]
処理がほとんど同じで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>
てやればよい。。
*** タグを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とかいろいろ));であることに注意。
**リンクタグでの、パラメータ指定方法
<%
Map map=new HashMap();
map.put("data1","value1");
map.put("data2","value2");
map.put("data3","value3");
map.put("data4","value4");
request.setAttribute("map",map);
%>
<html:link page="/execute.do" name="map">aaaa</html:link>
みたく、mapを指定すると、パラメータとなる。(nameでBeanを指定、propertyでmapを指定してもよい。)
***actionタグのparameterにアクセスする。 [#pe7e315c]
struts-config.xml に
<action path="/setting" type="kino.SettingAction" parameter="hoge" />
としたときのparameterの値にActionクラスからアクセスする方法。
String parameter=mapping.getParameter(); <- mappingはActionMapping
***スタイルシートの指定方法 [#m0abb5e7]
ディレクトリ構成が[contextroot]/css/stylesheet.cssってなってる時。
<link href="<html:rewrite page='/css/stylesheet.css'/>" rel="stylesheet" type="text/css"/>
がキレイですね。モジュール化している場合は使えませんが((無難に<%=request.getContextPath()+"/css....."%>ってやりましょう ))。
***サンプル
struts-config.xml
<form-beans>
<form-bean name="testForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="name" type="java.lang.String" />
<form-property name="word" type="java.lang.String" />
</form-bean>
</form-beans>
<action-mappings>
<action name="testForm" path="/test" scope="request"
type="kino.action.TestAction">
<forward name="success" path="/WEB-INF/jsp/Test.jsp">
</forward>
</action>
</action-mappings>
につき
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<html:html>
<HEAD>
<%@ page
language="java"
contentType="text/html; charset=SHIFT_JIS"
pageEncoding="SHIFT_JIS"
%>
<META http-equiv="Content-Type" content="text/html; charset=SHIFT_JIS">
<META name="GENERATOR" content="IBM WebSphere Studio">
<TITLE>Test.jsp</TITLE>
</HEAD>
<BODY>
<html:form action="/test">
<html:text property="name" />
<br />
<html:text property="word" />
<html:submit>送信</html:submit>
</html:form>
<logic:present name="name">
<bean:write name="name" />
よりよいのは 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を参照するのがよいですね。
***リクエストパラメータから、変数を定義 [#ce206d66]
あるスコープから変数を定義するのは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%>できるわけじゃない [#mda423ce]
なんだかわかってる人には当たり前のことなのかもしれませんが、いかんせん初心者なもんで、書き留めておきます。
<logic:present name="hoge" >
<bean:write name="hoge"/>
</logic:present>
<br />
<logic:present name="word">
<bean:write name="word" />
<%=hoge%>
の最後の行は、コンパイルエラーになります。<bean:define .../>したときは大丈夫なわけですが、これはdefineタグが変数定義までやってるんでしょうね。ソースを見ると
pageContext.setAttribute(id, value, inScope);
ってやってますね。((たしかタグハンドラのスクリプティング変数の定義..とかいうやつ))
*** アクションマッピングのattributeの意味 [#f157aba7]
通常、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"/>で値を取得できます。
***プロパティは保持される [#dfbd1279]
<html:text property="userid" />
は画面が切り替わってもパラメータが保持されてますよね。~
パラメータの操作(setAttribute)などをしなくても、入力値が保持されるんですね。
***bean:write [#x89fdcd7]
<bean:write name="username"/>
はxxxx.getAttribute("username") して取得したインスタンスのtoString()を画面に書き出すみたいです。((よく、html:textで指定したプロパティをwriteしようとしてエラーを出しました。ややこしいですが、writeはコンテキストにセットされた属性、html:textはparameterですね))
***logic:present [#f6a5ee5f]
<logic:present name="username">
<bean:write name="username"/>
</logic:present>
</BODY>
</html:html>
というようにlogic:presentで囲まないとusernameがコンテキストにないときにエラーになってしまいます。ようするにxxx.getAttribute("username");がnullかどうかをチェックするためのイディオムです。
***bean:define [#c984ae33]
<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 [#hfe587f3]
<bean:size id="count" name="username" />
<bean:write name="count"/>
<%=count%>
とすると、
int count = xxx.getAttribute(username).size();
みたいなことが行われます。つまり、スコープからインスタンスを取り出し、それがCollectionの場合に要素数を返します。((bean:sizeはスコープからデータを取り出すだけでなく、idで指定した文字列で変数とPageContextに値をセットします。))
***クエリを追加する [#zd1596f4]
<html:link action="/execute" paramId="userid" paramName="userID">検索</html:link>
ってやると、
execute.do?userid=[userIDの値]
となる。userIDってのはxxx.getAttribute("userID");のこと(確か)。
***logic:empty [#j38bca9a]
<logic:empty name="userid">
は..。なんだっけ?
*** ApplicationResources.properties にアクセスする [#i6325302]
<bean:message key="app.title"/>
*** <bean:write>タグのignore属性 [#de148b25]
<bean:write>タグのignore属性をtrueにしている場合、メッセージがない場合は何も表示されない。
*** タグをxhtmlに対応する [#z9f1ed96]
デフォルトでは、Strutsのタグはxhmlに対応していない(閉じタグとか)。
<html:html xhtml="true">
とすることで、xhtml形式のタグを出力します。ってtiles使うとincludeされる側がそうならない気がするんですけど。。
*** 初期アクセスのパラメタエラーを回避する [#n4b4f5f2]
たとえば何かを検索する画面(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(おもしろかった,そうでもない)
#vote(おもしろかった[87],そうでもない[17])
-メモ書きなので、つたない内容です。ご了承下さい。コメントがありましたらお願いします。 -- [[きの]] &new{2004-01-08 (木) 18:33:31};
#comment
#navi(Java/Struts)
#topicpath
SIZE(10){現在のアクセス:&counter;}