SAStruts でファイルダウンロード

急遽、SAStruts を触らないといけないことになり、ちょっとファイルダウンロードするサンプルを書いてました。忘れそうなので、やったことメモしておきます。

とりあえず、動かすことを目的として、細かいことは無視して、以下からダウンロードできるチュートリアル sa-struts-tutorial-1.0.4-sp9.zip を参考にやりました。

Super Agile Struts - Download
http://sastruts.seasar.org/download.html

以下順に。eclipseMaven Project を前提にしています。

1. pom.xml に必要な設定を追記する


pom.xmlSeasar2 やら SAStruts やらを使うのに必要な設定を行ないます。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>Seasar2App</groupId>
  <artifactId>Seasar2App</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
    </plugins>
  </build>
  <repositories>
     <repository>
      <id>maven.seasar.org</id>
      <name>The Seasar Foundation Maven Repository</name>
      <url>http://maven.seasar.org/maven2</url>
      <snapshots>
        <enabled>false</enabled>
      </snapshots>
    </repository>
    <repository>
      <id>maven-snapshot.seasar.org</id>
      <name>The Seasar Foundation Maven Snapshot Repository</name>
      <url>http://maven.seasar.org/maven2-snapshot</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </snapshots>
    </repository>
  </repositories>
  <dependencies>
  <dependency>
    <groupId>org.seasar.container</groupId>
    <artifactId>s2-framework</artifactId>
    <version>2.4.48</version>
  </dependency>
  <dependency>
    <groupId>org.seasar.container</groupId>
    <artifactId>s2-extension</artifactId>
    <version>2.4.48</version>
  </dependency>
  <dependency>
    <groupId>org.seasar.container</groupId>
    <artifactId>s2-tiger</artifactId>
    <version>2.4.48</version>
  </dependency>
  <dependency>
    <groupId>org.seasar.sastruts</groupId>
    <artifactId>sa-struts</artifactId>
    <version>1.0.4-sp9</version>
  </dependency>
  <dependency>
    <groupId>jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.1.2</version>
  </dependency>
  <dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>jta</artifactId>
    <version>1.1</version>
  </dependency>
  <dependency>
    <groupId>javax.ejb</groupId>
    <artifactId>ejb-api</artifactId>
    <version>3.0</version>
  </dependency>
  </dependencies>
</project>


Maven リポジトリ
http://maven.seasar.org/


2. sa-struts-tutorial-1.0.4-sp9.zip 内から設定ファイル等をコピーする


※1のファイルを WEB-INF 配下に、※2のファイルを src/main/resource 配下にコピーする。
※1

struts-config.xml
validator-rules.xml
web.xml

※2

app.dicon
convention.dicon
creator.dicon
customizer.dicon
jdbc.dicon
log4j.properties
s2container.dicon


何箇所か修正を。

■ web.xml から以下の箇所を削除

    <jsp-config>
    	<jsp-property-group>
    		<url-pattern>*.jsp</url-pattern>
    		<el-ignored>false</el-ignored>
    		<page-encoding>UTF-8</page-encoding>
    		<scripting-invalid>false</scripting-invalid>
    		<include-prelude>/WEB-INF/view/common/common.jsp</include-prelude>
    	</jsp-property-group>
    </jsp-config>

■ convention.dicon でルートパッケージを root に変更

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
	"http://www.seasar.org/dtd/components24.dtd">
<components>
	<component class="org.seasar.framework.convention.impl.NamingConventionImpl">
		<initMethod name="addRootPackageName">
			<arg>"root"</arg>
		</initMethod>
	</component>
	<component class="org.seasar.framework.convention.impl.PersistenceConventionImpl"/>
</components>

ルートパッケージについては、以下に情報があります。

Super Agile Struts - Feature Reference
http://sastruts.seasar.org/featureReference.html#Project

今回のサンプルだったら不要なファイル、設定はあると思いますが、ひとまず動かすこと目的なので、上記の通りコピーで。


3. Action クラスの作成


root.action パッケージに Action クラス DownloadAction.java を作成します。

package root.action;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ResponseUtil;

public class DownloadAction {
	@Resource
	protected HttpServletResponse response;

	@Execute(validator = false)
	public String index() {
		return "index.jsp";
	}

	@Execute(validator = false)
	public String download() {
		// ファイル名 test.txt、データ test なファイルをダウンロードする
		ResponseUtil.download(new String("test.txt"), "test".getBytes());
		return null;
	}
}

設定ファイルを記述しなくていいように、どの URL でどの Action が呼ばれるのかってのが決まっているみたいですね。DownloadAction だと http://*****/*****/download/ とかで呼ばれることになります。以下のドキュメントにそのあたりの情報があります。

Super Agile Struts - Feature Reference
http://sastruts.seasar.org/featureReference.html#Action

実行メソッドには @Execute をつける必要があるみたいです。どの実行メソッドを呼び出すかってのは「/download/*****」の ***** 部分で指定するみたいです。何も指定がない場合は index() が呼ばれると。

Super Agile Struts - Feature Reference
http://sastruts.seasar.org/featureReference.html#ExecuteMethod


4. index.jsp を作成する


ファイルダウンロードする場合は特に必要ないのですが、いちおう作っておきます。DownloadAction 内の index.jsp は /download/index.jsp とみなされるとのことなので、WEB-INF/view/download/ 配下に index.jsp を作成します。

内容は簡単な感じで。

<%@page pageEncoding="UTF-8"%>
<html>
<body>
<h1>Download index.jsp</h1>
</body>
</html>

WEB-INF/view/ なのは、web.xml に以下の設定があるからです。

    <context-param>
        <param-name>sastruts.VIEW_PREFIX</param-name>
        <param-value>/WEB-INF/view</param-value>
    </context-param>

Super Agile Struts - Feature Reference
http://sastruts.seasar.org/featureReference.html#ExecuteMethod


上記で作業完了です。AP サーバ起動して「http://*****/*****/download/」で「Download index.jsp」が表示、「http://*****/*****/download/download」で test.txt がダウンロードされたでしょうか。

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Update 25
Apache Tomcat 7.0.59
Seasar 2.4.48
SAStruts 1.0.4-sp9