2002/11/6 作成
public class EchoForm extends ActionForm{ private String message = "初期値だよー"; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
変動する値なら、Formを使う画面の前にアクションを通して、 そこでFormを埋めると値を設定できます。
Actionでsession(request)に埋めて
public ActionForward perform( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { EchoForm echoForm = new EchoForm(); echoForm.setMessage("設定する値だよー"); request.getSession().setAttribute("hoge",echoForm); return mapping.findForward("hoge"); }
JSPの<html:form>でname属性で指定。type属性も必要。
<html:form action="echo" name="hoge" type="echo.EchoForm" > <html:text property="message"/> <html:submit/> </html:form>
requestに埋めた場合には<html:form>側でscope="request"しないといけないようです。
name、typeが必要、requestスコープにしないといけない、 というのは、上のサンプルの場合です。 struts-config.xmlのactionの設定に指定すればnameは不要です。 スコープもそこで指定したscopeが適用されます。
かっこよくする場合は、Actionで同じ型のFormクラスでなく、 同じプロパティーを持つBeanもいいようです(別にクラス作るのが手間か?)。
フィールド個別設定もいいみたい。
<html:text property="message" name="hoge" />
超めんどくさがりやはこれでもいいかも(イヤ、ダメか)
<html:text property="message" value="<%=something%>" />
起動時にどどどどーと出てくるStrutsのログを消したい。
1.0.2の場合、 web.xmlのstrtusのactionサーブレットのdebugとdetail の<param-value>を0にすると消えます。
1.1の場合、commons-loggingを使うようですが、
何をどこに置いたらいいのかイマイチ不明。
そのうち調べよう。
プロパティーについて
<bean:write>というタグがあります。
<bean:write name="hoge" />
これはオブジェクトスコープ(requestとかsessionとか)から hogeという名前のオブジェクトを取得し、表示します。
<bean:write name="hoge" property="message"/>
これはオブジェクトスコープから
hogeという名前のオブジェクトを取得し、そのmessageプロパティーを表示します。
プロパティーっていうのが最初ナニデスカソレワって感じだったんですが、
簡単に言うと、hoge.getなんとか()メソッドを呼んだ結果を表示するってことです。この何とかの部分がここではMessageになります。
JavaBeansのゲッタ、セッタの名前規則に従うメソッドが呼び出されるわけです。
例:
プロパティー(名) | ゲッタ | セッタ |
---|---|---|
String message | String getMessage() | void setMessage(String) |
int aiueo | int getAiueo() | void setAiueo(int) |
strutsで面白いのは、このプロパティーの書き方がいろいろできるところです。書き方は大きく3通りあります。
タイプ | プロパティー | 言い換えると |
---|---|---|
普通 | aaa | getAaa() |
配列 | aaa[2] | getAaa()[2] |
ネスト | aaa.bbb | getAaa().getBbb() |
サンプルはこんな感じ。
hoge.HogeBean
package hoge; public class HogeBean { private String message; private String[] array; private HogeBean child; //セッタとゲッタは省略(書いてないけど必要) //... }
propertytest.jsp
<%@ page contentType="text/html; charset=Shift_JIS"%> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ page import="hoge.HogeBean" %> <% HogeBean bean = new HogeBean(); bean.setMessage("hello"); bean.setArray(new String[]{"index0","index1","index2"}); bean.setChild(bean); request.setAttribute("hoge", bean); %> <html><body> <h2>beanタグでプロパティーのテスト</h2> <p><bean:write name="hoge" property="message" /> <p><bean:write name="hoge" property="array[1]" /> <p><bean:write name="hoge" property="child.message" /> </body></html>
このname、properyという属性はstrutsタグライブラリでちょくちょく
でてくる属性なので、理解しとくとうれしいでしょう。
あとscope属性は指定しない場合は、page、request、session、application
と全部探してくれます。
Strutsユーティリティクラスを使う
org.apache.struts.utilパッケージには有用なパッケージがあり、 カスタムタグを自作したり、その他のいろいろな場面で利用することができます。
そのうちいくつかのクラスは現在Jakarata Commonsに移動され、 コンパイルするとdeplicated(推奨されない)警告が出ます。 警告を出さないようにするには importをorg.apache.struts〜でなく、 org.apeche.commons〜にするとよいです。
実際に使ってみた感想はCommonsの方に書きました。