→Struts関連

→JavaのWebアプリ開発

#contents


*一般記事 [#c1af4409]
-[[StrutsのXML地獄から開発者を解放するSAStruts@IT>http://www.atmarkit.co.jp/fjava/rensai4/saweb02/saweb02_1.html]]

-[[SAStruts>http://sastruts.seasar.org/]]
-http://wiki.paulownia.jp/java/sastruts
-[[SAStruts入門>http://snowhiro.web.fc2.com/sastruts/]]
-[[SAStrutsPlugin>http://sastruts.seasar.org/sastrutsplugin.html]]

-[[SASTruts チートシート>http://seasar-users.jp/cheatsheet/sastruts]]


*Tips [#od10ebbb]
-SAStrutsで任意の場所でロールバックしたいとき
--http://ml.seasar.org/archives/seasar-user/2008-October/016152.html
 @Resource
 public UserTransaction userTransaction;
 ...
 userTransaction.setRollbackOnly();

-テーブルの一部の列を入力欄にして、各行につけたボタンで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に指定する。その上でそのメソッドの中で遷移先を切り替えればよい

-[[SAStrutsの入力チェックの順序>http://d.hatena.ne.jp/koroharo/20090514/1242269946]]

-セッションの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: レスポンスをコミットした後でフォワードできません



-[[AJAXでXMLを取得>http://code.nanigac.com/source/wiki/view_title/597/Ajax%E3%81%A7XML%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86]]

-[[SAStruts関連@codeなにがし>http://code.nanigac.com/source/wiki/view/597]]

--[[SAStrutsに関して読んでおきたい資料集>http://code.nanigac.com/source/wiki/view_title/597/SAStruts%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E8%B3%87%E6%96%99%E9%9B%86]]

--[[DoltengでHello project>http://code.nanigac.com/source/wiki/view_title/597/Dolteng%E3%81%A7%E3%80%8CHello%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%80%8D%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%97%E3%82%87%E3%81%86]]
---Apache+Tomcat連携設定の説明アリ

--[[開発時に気をつけること>http://code.nanigac.com/source/wiki/view_title/597/%E9%96%8B%E7%99%BA%E6%99%82%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8%E9%9B%86]]
---プロパティ以外でgetXXXXというメソッド名にしない
---セッションスコープにした変数にSerializableをimplementsしてない変数があるとSIllegalArgumentException


-[[サーバ再起動不要のSMART deployとバリデーション>http://www.atmarkit.co.jp/fjava/rensai4/saweb03/saweb03_1.html]]
--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です。

-[[JSPでActionに指定したrolesを使う>http://d.hatena.ne.jp/cypher256/20080429/p2]]

-[[SAStrutsでログイン確認インターセプタを使う>http://d.hatena.ne.jp/idesaku/20081226/1230263190]]

-[[SAStrutsタグ>http://www.atmarkit.co.jp/fjava/rensai4/saweb04/saweb04_1.html]]
--<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