!!!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}}