!!!SAStruts
!!!基本形
{{ref sastruts_test.zip}}
!!!HelloWorld
!!ルートパッケージ名の設定
WEB-INF/classes/convention.dicon
の
"hogehoge"
でルートパッケージ名を設定
!!プログラムの配置
以下{{word 赤字,red}}のファイル名、パス名を合わせることでアクション、フォーム、ビューが結びつく。
!アクションクラス
WEB-INF/src/ルートパッケージ/action/{{word HelloWorld,red}}Action.java
!フォームクラス
WEB-INF/src/ルートパッケージ/form/{{word HelloWorld,red}}Form.java
!ビュー
WEB-INF/view/{{word helloWorld,red}}/hoge.jsp
※helloWorld の最初の1文字が小文字になることに注意!
!!ソース
!アクションクラス
{{code Java,
package hogehoge.action;
import java.util.*;
import javax.annotation.Resource;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import hogehoge.form.HelloWorldForm;
public class HelloWorldAction {
public Integer result;
@ActionForm
@Resource
protected HelloWorldForm helloWorldForm;
@Execute(validator = false)
public String index() {
return "hoge.jsp";
}
}
}}
!フォームクラス
{{code Java,
package hogehoge.form;
import org.seasar.struts.annotation.IntegerType;
import org.seasar.struts.annotation.Required;
import java.util.*;
import org.seasar.framework.beans.util.BeanMap;
public class HelloWorldForm {
@Required
public String hello;
}
}}
!ビュー
helloWorld/hoge.jsp
{{code Java,
<%@page pageEncoding="UTF-8"%>
HelloWorld
HelloWorld
= ${f:h(hello)}
}}
!注意
IllegalAutoBindingPropertyRuntimeException
が出る場合は、クラス名とバインドする変数の名前があっていないことがある。
HelloWorldForm helloWorldForm;
のように、クラス名の最初の1文字を小文字にした変数名を使う。
!!!デプロイの種類と設定
デプロイの設定は
env.txt
で行う。
デフォルトは、ct。
,種類,動作,用途
,ct,リクエストのたびに、必要なコンポーネント「だけ」再デプロイ,結合テスト
,ut,warm deploy。アプリの変更をhotには認識せず、且つアプリ起動時に全デプロイも行わない。,単体テスト
,it,cool deploy。アプリ起動時に全デプロイを完了する,本番
,env.txtなし,it と同じ。,itと同じ
!!!ログ
http://www.nurs.or.jp/~sug/soft/log4j/log4j2.htm
http://sastruts.seasar.org/fileReference.html
WEB-INF/classes/log4j.properties ファイルでログの出力を決める。
log4j.category.org.seasar=DEBUG, C
log4j.additivity.org.seasar=false
log4j.category.tutorial=DEBUG, C
log4j.additivity.tutorial=false
テスト用は DEBUG になっている。
リリース時は、
warn
が無難かな。
!!!本番と開発環境
本番と開発環境で以下の設定が違うはずなので気をつける
,設定,開発環境,本番環境
,デプロイの種類,ct、ut, it
,ログ,DEBUG, WARN
,DB接続先,テスト環境,本番環境
!!!tomcat起動時に一回だけ処理をする
http://treeapps.hatenablog.com/entry/20110831/p1
http://blog.mikuriya.biz/archives/171
app.diconに実行するクラスを追記する
{{code Java,
public class InitService {
public void init(){
}
}
}}
引数が欲しい場合は
"/home/hoge/sample/property/sys.properties"
{{code Java,
public class InitService {
public void init(String propertyFile){
}
}
}}
!!!ファイルをダウンロードさせる
!!パターン1
http://piyopiyocs.blog115.fc2.com/blog-entry-231.html
{{code Java,
public String download() {
try {
ResponseUtil.download(new String(
"サンプル.txt".getBytes("Shift_JIS"),
"ISO-8859-1"), "こんにちは".getBytes("Shift_JIS"));
} catch (IOException e) {
throw new IORuntimeException(e);
}
return null;
}
}}
!!パターン2
http://d.hatena.ne.jp/ooharak/20080911/1221144337
ResponseUtil.download(String,InputStream[,length])を使う
{{code Java,
@Execute(validator = false)
public String download() {
File file = new File("c:/temp/large.txt");
try {
ResponseUtil.download("hello.txt",
new BufferedInputStream(
new FileInputStream(file)), (int)file.length);
//ダウンロード中のエラーは
} catch (IORuntimeException ire) {
//あえて無視
} catch (IOException e) {
throw new IORuntimeException(e);
}
return null;
}
}}
!!パターン3
http://piyopiyocs.blog115.fc2.com/blog-entry-231.html
{{code Java,
/** HTTPレスポンス */
@Resource
protected HttpServletResponse response;
(省略)
/**
* CSVファイル出力
*
*/
private void ouputCsv(){
try{
//---------------------------
// HTTPヘッダ出力
//---------------------------
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition",
"attachment; filename="hoge.csv");
//---------------------------
// CSV出力
//---------------------------
PrintWriter out = new PrintWriter(
new OutputStreamWriter(response.getOutputStream(),
"Shift_JIS"));
for(i=0; i < 100000; i++) {
out.println("a,b,c," + i);
}
out.close();
} catch (IOException e) {
throw new IORuntimeException(e);
}
}}
{{category2 プログラミング言語,Servlet & Struts}}