Struts2をやってみる (16) - ModelDriven -
今までだとフォームだとかで送信されるデータを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を使う事でフォームオブジェクト的なのが定義出来る模様