Struts2をやってみる (1)

2013-09-15T00:00:00+00:00 Java Struts2

まぁStruts1.xがEOLっていう事で代わりとなりえるだろうフレームワークを調査中で。でまぁStruts2とかもあるんじゃないかっていう事で色々勉強をしてみる事に

セットアップ

まぁ本来どうやるのかは微妙ですけど。gradleでプロジェクト管理してEclipseで開発したり、jettyで動かしてみたりしたいのでbuild.gradleを書く

apply plugin: "java"
apply plugin: "war"
apply plugin: "jetty"
apply plugin: "eclipse"

ext {
    targetDir = "target"
}

buildDir = targetDir

repositories {
    mavenCentral()
}

dependencies {
    compile "org.apache.struts:struts2-core:2.3.15.1"
}

sourceSets {
    main {
        output.classesDir = "${buildDir}/classes"
        output.resourcesDir = "${buildDir}/classes"
    }

    test {
        output.classesDir = "${buildDir}/classes"
    }
}

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.findAll { entry ->
            entry.kind == "output"
        }*.path = "/${project.name}/${targetDir}/classes"
    }
}

jettyとかで動かしたい時は

gradle jettyRun

まぁ構造とかは

├── build.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── sample
    │   │       └── action
    │   │           └── IndexAction.java
    │   ├── resources
    │   │   └── struts.xml
    │   └── webapp
    │       └── WEB-INF
    │           ├── jsp
    │           │   └── index.jsp
    │           └── web.xml
    └── test
        ├── java
        └── resources

んな感じ。で上記で書く必要のあるファイルを書いていく

src/main/resources/struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>

    <!-- package name属性に指定するのはユニークな値であればなんでも良いっぽい -->
    <!-- namespaceでプレフィックス的なが指定出来る模様 -->

    <package name="sample" extends="struts-default" namespace="/sample">
        <action name="index" class="sample.action.IndexAction">
            <result>/WEB-INF/jsp/index.jsp</result>
        </action>
    </package>
</struts>

Struts2にはZero Configuration的な機構なあれもあるらしいけどそこまでやってないので(ry

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

特に言う事無いと思うので

んまぁこれでStruts2が動く環境を構築したのでJavaソース及びJSPを書いていく

要件

名前入力してサブミットしたら表示するただそれだけ

src/main/webapp/WEB-INF/jsp/index.jsp

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

    <s:if test="name != null">
    <p>say: <s:property value="name" /></p>
    <p>say: ${name}</p>
    </s:if>
  </body>
</html>

src/main/java/sample/action/IndexAction.java

package sample.action;

import com.opensymphony.xwork2.ActionSupport;

public class IndexAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private String name = null;

    public String execute() {
        return SUCCESS;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

デフォルトだとexecuteだと思いますが、struts.xmlにて

<action name="index" class="sample.action.IndexAction" method="execute">
</action>

っていう感じで指定出来る模様。検証してないけど...

JSP側からはActionのgetterメソッドをOGNL式として評価して利用できる模様。

んでコンパイルしてサーバー起動。テキストボックスがあるのでそこに適当に入力してサブミット

っていう感じになる。んまぁファーストステップ的な所はこんな所で

Struts2をやってみる (2) - Actionのテスト - testem+mocha+coverjsでコードカバレッジ