SAStrutsを勉強してみる (1) - First Step -

2012-10-02T00:00:00+00:00 Java SAStruts

タイトル通りです。とりあえず使ってみる

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>

が必要な模様

SAStrutsを勉強してみる (2) - ActionForm - Chrome Extension開発を勉強してみる (20) - chrome.experimental.identity -