Struts関連

JavaのWebアプリ開発

一般記事

Tips

  • テーブルの一部の列を入力欄にして、各行につけたボタンでsubmitしたいとき
    • JSP側。html:text のindexedをfalseにするのがポイント
      <c:forEach var="m" items="${mapItems}" begin="0"
      	end="${dispMax - 1}" step="1">
      	<s:form target="_blank" >
      	<tr>
      		<td class="data01">${f:h(m.referenceId)}</td>
      		<td class="data01">${f:h(m.orderNo)}</td>
      		<td class="data01">${f:h(m.orderDateYmd)}</td>
      		<td class="data01">
      		<html:text name="m" property="passengerName" indexed="false" value="${m.passengerName}" />
      		</td>
      		<td class="data01">
      		<html:text name="m" property="messageBox" indexed="false" value="${m.messageBox}" />
      		</td>
      		<td class="data01">${f:h(m.issuedStatus)}</td>
      		<td class="data01">${f:h(m.childCd)}</td>
      		<td class="data01">
      			<html:hidden property="id" value="${m.referenceId}"/>
      			<input type="submit" name="detail" value="詳細表示"/>
      		</td>
      	</tr>
      	</s:form>
      </c:forEach>
    • フォームクラス側
      public String issued_status; //発行ステータス
      public String ken_syubetsu;
      public String child_code;
    • Action側はdetailメソッドが呼ばれたときにフォームの変数にアクセスできる
  • validateでエラーになったときに遷移する先(input属性で指定するjsp)を場合にによって切り替えたいとき
    • inputにはjspだけでなくurlを指定しても良いので、Actionに切替用の実行メソッドを用意し、それをinputに指定する。その上でそのメソッドの中で遷移先を切り替えればよい
  • セッションのDtoでIllegalArgumentExceptionになる場合、serializableを実装して ないクラスをメンバに持っていないかチェック
    2009-05-18 19:04:05,156 [http-8080-2]
    org.apache.struts.action.RequestProcessor
    ERROR - パス /index に対するアクションのインスタンスがありません
    Caused by: java.lang.IllegalArgumentException:
  • サーバの処理結果をポップアップメッセージで出すには
    • jsp側でこのようにしておく
      <body onload="${f:h(onLoadScript)}">
    • Action側でonLoadScriptのプロパティを用意し、そこにjavascriptを書く。
    • (例)
      this.onLoadSctipt = "alert('更新処理が正常に終了しました')";
    • onLoadScriptプロパティは必要ならセッションスコープにする。
    • jspをリロードする
    • ただしこの方法だと戻るボタンなどでそのページに戻ってきたときもalert()が動いてしまうのだが
  • リクエストのヘッダ情報を参照
    HttpServletRequest req = RequestUtil.getRequest();
    Enumeration<String> e = req.getHeaderNames();
    while(  e.hasMoreElements() ) {
       String s = e.nextElement();
       System.out.println(s + "=" +req.getHeader(s) );
    }
  • 画像のバイナリイメージをHTTPレスポンスとして出力
    package test.action;
    
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.net.URL;
    
    import javax.imageio.ImageIO;
    import javax.imageio.ImageWriter;
    import javax.imageio.stream.ImageOutputStream;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import org.seasar.struts.annotation.Execute;
    import org.seasar.struts.util.ResponseUtil;
    
    public class OutImgAction {
    
      public String id;
    
      //
      // 画像をhttpレスポンスのボディとして出力してみるテスト
      //
      // 呼ぶときは↓こんなふうにします
      // http://localhost:8080/test/outImg/output/1
      //
      @Execute(validator=false, urlPattern = "output/{id}")
      public String output() {
        try {
          URL url = getClass().getResource("../../data/sample.png");
          BufferedImage im = ImageIO.read(url.openStream());
    
          HttpServletResponse response = ResponseUtil.getResponse();
          response.setContentType("image/jpeg");
          ServletOutputStream sos = response.getOutputStream();
          ImageOutputStream ios = ImageIO.createImageOutputStream(sos);
          ImageWriter iw = (ImageWriter)ImageIO.
                          getImageWritersByFormatName("jpeg").next();
          iw.setOutput(ios);
    
              //IDを表示してみる
          Graphics2D g = im.createGraphics();
          g.setColor(Color.BLACK);
          g.drawString("id="+id, 20, 20);
          g.dispose();
    
          iw.write(im);
    
         ios.close();
         sos.close();
    
        } catch (IOException e) {
          e.printStackTrace();
        }
    
        return null;
      }
    
      @Execute(validator = false)
        public String index() {
        return "/";
        }
    }
    • 注意点:ServletOutputStreamを明示的にclose()してやらないと以下のような例外になるので注意
      java.lang.IllegalStateException: レスポンスをコミットした後でフォワードできません
  • 開発時に気をつけること
    • プロパティ以外でgetXXXXというメソッド名にしない
    • セッションスコープにした変数にSerializableをimplementsしてない変数があるとSIllegalArgumentException
  • サーバ再起動不要のSMART deployとバリデーション
    • SMART deployはDIコンテナである「Seasar」のバージョン2.4から実装されたデプロイ機能で、DI(依存性の注入)の技術が生かされています。
    • デプロイ方法には「HOT」「COOL」「WARM」の3種類があります。
    • 開発時には便利なHOT deployですが、若干パフォーマンスが悪くなります。本番運用のときはソースコードを変える必要はないので、要らない機能となってしまいます。そこでリリース時には、COOL deployで動作させます。
    • WARM deployは必要なとき必要なクラスを読み込むもので、HOT deployとCOOL deployの中間のような機能です。例えば、JUnitなどのテスティングフレームワークでテストをするときにはソースコードの変更はありません。しかし、単体テストではすべての機能を動作させるわけではないので、COOL Deployのときのようにプロジェクト全体のすべてのDI設定を行う必要はないはずです。
    • すべての設定を行うと、当然それだけ起動が遅くなるので、必要ない部分を読み込みたくないときは、単体テストで必要な最小限の設定を読み込み、オブジェクトが生成できればいいわけです。そうしたときに使用するのがWARM deployです。
  • SAStrutsタグ
    • <s:form>タグ
    • <s:form>タグは、Strutsのカスタムタグの1つ<html:form>タグに代わるものです。<html:form>タグでは、Actionパスの再計算が行われないため、相対パスなどで記述すると同じページにアクセスするたびに、URLがずれてしまう問題がありました。
    • SAStrutsで用意されている<s:form>タグではaction属性を設定したリンクのURLを 基準として、パスが「/」で始まっている場合、コンテキストルートから見た絶対パスになります。パスが「/」で始まっていない場合、JSPファイルから見た相対パスが計算されて設定されます。
    • この自動計算により、リクエストのパスが「/dept」であっても「/dept/list」で あっても、相対パスで入力してあっても出力URLがずれたりすることがなくなります。
    • <s:link>タグ
    • <s:link>タグは先ほど紹介した<s:form>タグのリンク版です。Strutsの<html:link>タグに代わるものです。href属性を設定するときに<s:form>と同様のパスの計算が行われ同様に出力URLがずれることがなくなります。
    • <s:submit>タグ
    • <s:submit>タグはStrutsの<html:submit>タグに代わるものです。
    • <s:submit>タグを使用すると、簡単にクライアントバリデーションが設定できます。clientValidate属性にtrueを設定するとクライアントバリデーションができます。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-10 (火) 22:36:32 (4196d)