JSPのアクションタグを作る機能を利用して、Strutsでタグが色々用意されている。
|
Strutsのアクションタグの詳細(どのような属性があるか)についてはStrutsのJavadocに載っている。
例えば<html:form>タグ
の場合、FormTagクラスのJavadocを見ればよい。
<%@ taglib uri="/tags/struts-html" prefix="html" %>
通常のHTMLのタグを扱う為に拡張されたアクションタグが定義されている。
例えばStrutsのアクションタグの「<html:link>
」はHTMLの「<a>
」、「<html:form>
」は「<form>
」、「<html:html>
」は「<html>
」といった具合。→比較
全く同じに見えるのに何故わざわざこんなものが用意されているかというと、Javaから利用する際にオプション(HTMLタグの属性)をStrutsが自動的に入れてくれるから。
→html:linkの例
→html:formの例
HTTPセッションを使うにはURLリライティングを行う必要があるが、JSPそのままでは、プログラマーが各リンクに毎回encodeURL()をかぶせてやる必要がある。
これに対し、Strutsの「html:link
」を使うことにより、自動的にencodeURL()を呼んでくれるようになる。
JSPそのままの例.jsp:
<html>
<body>
<a href='<%= response.encodeURL("/sample/test.jsp") %>'>リンク</a>
</body>
</html>
↓
Strutsを使う例.jsp:
<%@ taglib uri="/tags/struts-html" prefix="html" %> <html:html> <body> <html:link href="/sample/test.jsp">リンク</html:link> </body> </html:html>
HTMLのform要素に該当するタグ。[2009-02-20]
action属性(サブミット時のURI)は必須。
これは、jspからHTMLを生成する際にstruts-config.xml内のactionの指定を探しに行って、フォーム名などをHTMLファイル上に展開する。
したがって、先にstruts-config.xmlにアクションを記述しておく必要があるし、フォームビーンの定義も必須。
条件分岐や繰り返し(ループ)処理を行うアクションタグ。
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
→logic:iterateのサンプル(実験) [2009-10-10]
logic:iterateでscopeをrequestにすれば、
ループされるデータは、idで指定した名前でpageContextのPAGE_SCOPEに入る。
indexIdで指定したインデックスも その名前でpageContextのPAGE_SCOPEに入る。(なお、インデックスはInteger型)
test.jsp:
<logic:iterate name="mainForm" property="charactor" scope="request"
id="charactor"
indexId="index1">
<p>
<%= ((Integer)pageContext.getAttribute("index1",PageContext.PAGE_SCOPE)).intValue() %>
…ちなみに、意味は <bean:write name="index1"/> と いっしょ。<br>
<!-- キャラクター名を取ってくるメソッドを定義 -->
<%! public String getCharactorName(PageContext pageContext){
jp.hishidama.SubForm sub=(jp.hishidama.SubForm)pageContext.getAttribute("charactor",PageContext.PAGE_SCOPE);
return "「" + sub.getName() +"」です";
}
%>
<!-- 定義したメソッドの使い方 -->
キャラクター名は<%= getCharactorName(pageContext) %>
</p>
</logic:iterate>
pageContext.getAttribute(名前,PageContext.PAGE_SCOPE)
は
pageContext.findAttribute(名前)
でも代用できるが、スコープが分かっているならgetAttribute()の方が実行は早いだろうね、きっと。
※Strutsなら、JSP式やらJSP宣言を使うよりは、Strutsのカスタムタグ(bean:writeとか)を使用して値を取得すべき。