POJO de Action!

さて、S2Strutsのドキュメントを読むとActionクラスを継承しないPOJOクラスをActionとして扱えるような事が書かれている。
じゃ試してみようかと思ったけどネタが浮かばない。う〜ん、何かいいネタがないかな〜。
名セリフ集でもやるか・・・

  • ボタンを押すと名セリフが表示される。
  • セリフの内容は予め登録してあるもののなかからランダムで選ばれる。

こんな感じのモノでも作ってみましょう。

まず、Actionのインターフェースを決めるのだが、一つ制約がある。

  • アクションメソッドの戻り値は、Stringとして、forward名を返すようにして下さい。

それをふまえてインターフェースを書く。↓redrisefirm.seasar.s2struts.action.MaximAction.java

public interface MaximAction {
  public String getMaxim();
}

また

  • struts-configには、インターフェースをactionタグのtype属性に指定して下さい。

とあるが、Actionを継承してないため、XDocletで自動生成されないのでファイルマージ機能を使う。WEB-INFの直下にstruts-actions.xmlを作成し以下の内容を書いておく。↓/WEB-INF/struts-actions.xml

<action path="/maxim" type="redrisefirm.seasar.s2struts.action.MaximAction" name="maxim" >
  <forward name="maxim" path="/jsp/maxim.jsp" redirect="false" />
</action>

次に実装クラスも必要なようなのでインターフェースを継承したクラスを書く。とりあえずは簡単なのでいいので、名言はクラス内部に直接埋め込んでおく。↓redrisefirm.seasar.s2struts.action.MaximActionImpl.java;

public class MaximActionImpl implements MaximAction {

  public static final String FORWARD = "maxim";

  public static final String[] MAXIM_ARRAY = {
    "どうする、コクピットだけを狙えるのか?",
    "ええい!連邦のモビルスーツは化け物か!",
    "左舷!弾幕薄いぞ!なにやってんの!",
    "やらせはせん、この俺がいる限りやらせはせんぞぉぉぉ!",
    "あの壺は、いいものだ!",
    "坊やだからさ・・・" };

  private String todayMaxim = null;

  public MaximActionImpl() {
    super();
  }

  public String getMaxim() {
    Random random = new Random();
    setTodayMaxim(MAXIM_ARRAY[random.nextInt(MAXIM_ARRAY.length)]);
    return FORWARD;
  }

  public static final String todayMaxim_EXPORT = BindingUtil.SESSION;

  public String getTodayMaxim() {
    return todayMaxim;
  }

  public void setTodayMaxim(String todayMaxim) {
    this.todayMaxim = todayMaxim;
  }
}

んで、この実装を登録するためのdiconを書いて、app.diconにincludeしておく。↓action.dicon

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
	"http://www.seasar.org/dtd/components21.dtd">
<components>
	<component class="redrisefirm.seasar.s2struts.action.MaximActionImpl" instance="singleton"/>
</components>

ActionFormクラスはサラっと作り流す。↓redrisefirm.seasar.s2struts.actionForm.MaximActionForm.java

/**
 * @struts.form
 * name="maxim"
 */
public class MaximActionForm extends ActionForm {
  public MaximActionForm() {super();}
}

次に、表示用のjspをざっくりと書いて、↓maxim.jsp

<%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J"%>
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean" %>
<html:html>
<head>
<title>本日の名言</title>
</head>
<body>
<marquee><font size=+10><bean:write name="todayMaxim"/></font></marquee><br/>
<input type="button" value="もう一言!" onclick="window.location.reload();"></input>
</body>
</html:html>

Antタスクを実行してstruts-config.xmlを更新してから、Tomcatを起動、ブラウザから

にアクセスしてみる。
するとアクセスするたびに違うセリフが出る。なるほどこうやればActionをPOJOで扱えるのね。