Struts2をやってみる (16) - ModelDriven -

2013-10-04T00:00:00+00:00 Java Struts2

今までだとフォームだとかで送信されるデータをActionクラスにセッターメソッドを用意して利用するっていう方式ですけど、従来のStrutsの方式であるActionFormのような方式をModelDrivenを使う事で可能らしい。という事でやってみた

公式ドキュメント

Message.java

package sample.forms;

import java.io.Serializable;

public class Message implements Serializable {

    private static final long serialVersionUID = 1L;
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

フォームからの入力に対して値を格納するクラス(ActionForm的な)を作るだけ。まぁビュー側で特別な事するわけでもない

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
  <head>
    <meta charset="utf-8" />
    <s:head />
  </head>
  <body>
    <s:form action="say">
        <s:textfield name="message" />
        <s:submit value="OK" />
    </s:form>
  </body>
</html>

IndexAction.java

import com.opensymphony.xwork2.ModelDrivenを実装したアクションクラスを作りgetModelメソッドを実装

package sample.actions;

import java.io.PrintWriter;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import org.apache.struts2.ServletActionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import sample.forms.Message;

public class IndexAction extends ActionSupport implements ModelDriven<Message> {

    private static final long serialVersionUID = 1L;
    private static final Logger logger = LoggerFactory.getLogger(IndexAction.class);
    private Message msg = new Message();

    public String say() throws Exception {
        PrintWriter out = ServletActionContext.getResponse().getWriter();
        out.print(msg.getMessage());
        out.flush();
        out.close();

        return NONE;
    }

    @Override
    public Message getModel() {
        logger.info("getModel");
        return msg;
    }
}

終わり。あとはStruts2のフレームワーク側というかModelDrivenInterceptor辺りがそこら辺解釈してくれるらしいので

ついでにバリデーションな辺りを定義していて以下でテストしてみる

IndexActionTestCase.java

package sample.actions;

import com.opensymphony.xwork2.ActionProxy;
import org.apache.commons.lang3.StringUtils;
import org.apache.struts2.StrutsSpringTestCase;
import org.junit.Test;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
import static com.opensymphony.xwork2.Action.*;

public class IndexActionTestCase extends StrutsSpringTestCase {

    private ActionProxy currentProxy;

    @Test
    public void test_say() throws Exception {
        assertThat(execute("hoge fuga foobar"), is(NONE));
        assertThat(currentProxy, notNullValue());
        assertThat(response.getContentAsString(), is("hoge fuga foobar"));

        IndexAction action = (IndexAction)currentProxy.getAction();
        assertThat(action, notNullValue());
        assertThat(action.getModel().getMessage(), is("hoge fuga foobar"));
    }

    private String execute(String message) throws Exception {
        if (!StringUtils.isEmpty(message)) request.setParameter("message", message);

        currentProxy = getActionProxy("/say");
        return currentProxy.execute();
    }
}

という感じでアクションクラスにパラメーターと同様なセッタープロパティ的な事しなくてもModelDrivenを使う事でフォームオブジェクト的なのが定義出来る模様

jquery.fullPageを使ってみた