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