→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を設定するとクライアントバリデーションができます。