SAStruts でファイルダウンロード
急遽、SAStruts を触らないといけないことになり、ちょっとファイルダウンロードするサンプルを書いてました。忘れそうなので、やったことメモしておきます。
とりあえず、動かすことを目的として、細かいことは無視して、以下からダウンロードできるチュートリアル sa-struts-tutorial-1.0.4-sp9.zip を参考にやりました。
・Super Agile Struts - Download
http://sastruts.seasar.org/download.html
以下順に。eclipse の Maven Project を前提にしています。
1. pom.xml に必要な設定を追記する
pom.xml に Seasar2 やら 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