SAStrutsを勉強してみる (1) - First Step -
タイトル通りです。とりあえず使ってみる
pom.xml
```xml<?xml version="1.0" ?>
<modelVersion>4.0.0</modelVersion>
<groupId>net.kinjouj.sastruts</groupId>
<artifactId>kinjouj_sastruts</artifactId>
<version>1.0</version>
<name>kinjouj_sasatruts</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.26</version>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>maven.seasar.org</id>
<name>The Seasar Foundation Maven2 Repository</name>
<url>http://maven.seasar.org/maven2</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.seasar.sastruts</groupId>
<artifactId>sa-struts</artifactId>
<version>1.0.4-sp9</version>
</dependency>
</dependencies>
```
でコンパイル依存性とかmaven-jetty-pluginを使う設定だけなんだけど、構成的に以下みたいにする
. ├── pom.xml └── src └── main ├── java │ └── sample │ ├── action │ ├── IndexAction.java │ │ │ ├── resources │ ├── app.dicon │ ├── application.properties │ ├── application_ja.properties │ ├── convention.dicon │ ├── creator.dicon │ ├── customizer.dicon │ ├── env.txt │ ├── env_ut.txt │ ├── jdbc.dicon │ ├── log4j.properties │ ├── s2container.dicon │ └── s2jdbc.dicon └── webapp └── WEB-INF ├── classes ├── lib │ ├── geronimo-ejb_3.0_spec-1.0.jar │ └── geronimo-jta_1.1_spec-1.0.jar ├── struts-config.xml ├── validator-rules.xml ├── views │ ├── common.jsp │ ├── index.jsp └── web.xml
でこの内設定及び作成する必要のあるのは、IndexAction.java・index.jsp・common.jspくらい。あとはsastruts-blank.warとかから取ってくるか、archtypeとか使う方法とか。そこら辺は公式ドキュメントに書いてるのでパス
common.jsp
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<%@taglib prefix="html" uri="http://struts.apache.org/tags-html"%>
<%@taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
<%@taglib prefix="tiles" uri="http://jakarta.apache.org/struts/tags-tiles"%>
<%@taglib prefix="s" uri="http://sastruts.seasar.org"%>
<%@taglib prefix="f" uri="http://sastruts.seasar.org/functions"%>
これはweb.xmlでVIEW_PREFIXな所に置く。今回は/WEB-INF/viewsに設定しているのでそこに配置
IndexAction.java
package sample.action;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.annotation.IntegerType;
import org.seasar.struts.annotation.Required;
public class IndexAction {
@Required
@IntegerType
public String numString;
public int result;
@Execute(validator = false)
public String index() {
numString = null;
return "index.jsp";
}
@Execute(input = "index.jsp")
public String submit() {
int num = Integer.parseInt(numString);
result = (int)Math.pow(num, 2);
return "index.jsp";
}
}
単純/でindex.jspをレンダリングして、そこからサブミットされた際にsubmitメソッドが発生するように(メソッド名はなんでも良い)し、そこでフォームからの値を検証して2乗してindex.jspで結果を表示するっていう感じ
index.jsp
<%@ page pageEncoding="utf-8" %>
<html>
<body>
<s:form>
<%-- IndexActionのnumStringを参照するテキストボックスを作成 --%>
<html:text property="numString" />
<%-- ボタンを表示。アクション先にsubmitメソッドが発生 --%>
<input type="submit" name="submit" value="send" />
${result}
</s:form>
<html:errors />
</body>
</html>
っていう感じで、mvn jetty:runでサーバーを起動しテキストボックスに何も入力しないか整数型じゃないデータを入力してサブミットするとエラーメッセージが表示される。
余談
で、ここでPOSTメソッドでsubmitメソッドを実行したあとはindex.jspにフォーワーディングしているのでリロードすると再送信うんにゃらのダイアログが出る。そこでバリデーション及び結果をフォワーディングせずにリダイレクトして、エラーメッセージ及び結果をセッションにつっこんでリロードしてもダイアログ出ないようにするにはIndexAction.javaを
package sample.action;
import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.annotation.IntegerType;
import org.seasar.struts.annotation.Required;
import org.seasar.struts.enums.SaveType;
public class IndexAction {
@Required
@IntegerType
public String numString;
// S2Containerによって注入される?
@Resource
private HttpSession session;
public int result;
@Execute(validator = false)
public String index() {
Object resultString = session.getAttribute("result");
if (resultString != null) {
// セッションにあれば削除しておく
session.removeAttribute("result");
result = Integer.parseInt((String)resultString);
}
numString = null;
return "index.jsp";
}
@Execute(
input = "/?redirect=true", // 検証元のビューページにリダイレクト
redirect = true, // 結果先をフォワードじゃなくてリダイレクト
saveErrors = SaveType.SESSION // エラーメッセージはセッションに格納
)
public String submit() {
int num = Integer.parseInt(numString);
session.setAttribute("result", String.valueOf((int)Math.pow(num, 2)));
return "/";
}
}
結果もセッションに格納しているけど、indexメソッドでセッションに値の有無をチェックしてあればpublicフィールドにぶちこんでビューから参照できるようにするみたいな感じで
追記
mvn war:war
してTomcatとかにデプロイする際には上のpom.xmlの依存性が欠如している模様
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
が必要な模様