Strutsメモ4

2002/11/6 作成

Formに初期値を入れる

固定の初期値なら、ActionFormクラスに固定値を書けばOKです。
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サーブレットのdebugdetail の<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)
(booleanの場合はisXXX()のゲッタも可)

strutsで面白いのは、このプロパティーの書き方がいろいろできるところです。書き方は大きく3通りあります。
タイプ プロパティー言い換えると
普通 aaa getAaa()
配列 aaa[2] getAaa()[2]
ネスト aaa.bbb getAaa().getBbb()
(上のタイプの複合も可。aaa.bbb[1].ccc...)

サンプルはこんな感じ。

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の方に書きました。

次のページへ


もどる