taediumの日記

2008-08-07

[][] S2Struts 1.3.0 リリース

リリースしました!

ついにRCがとれてFinalです。

Bug

  • [STRUTS-76] - S2StrutsのSubmitTagやImageTagのproperty属性に値を指定しても無視される問題に対処しました。
  • [STRUTS-77] - S2StrutsContextUtilクラスのgetMethodBindingExpressionメソッドが値を返さない問題に対処しました。

ダウンロードはこちらからどうぞ。

http://s2struts.seasar.org/ja/

Maven2からのご利用はこちらを参照ください。

http://www.seasar.org/wiki/index.php?Maven2RepoRemote


ところで

1.3って1.2系と何がちがうの?という方のために簡単にまとめると、S2Struts1.3には次の特徴があります。

  • Struts 1.3に対応している
  • Seasar 2.4に対応している
  • Seasar 2.4のSMART deployに対応している

SAStrutsS2Strutsどっちを選べばいいの?という方のための簡単な指針は次のとおりです。

  • S2Struts1.2 or 1.3-RC に慣れているのであればS2Struts
  • JDK1.4で開発するならS2Struts
  • JDK5.0以上で新規に開発するのであればSAStruts
  • 素のStrutsに近い形で使いたいのであればS2Struts
    • でも、素のStrutsで結構満足していてSeasar2も使いたいということであれば連携部分を自作するのもお勧め

2008-06-16

[][] S2Strutsのお奨めパターン

S2Strutsを使うときは1.2系/1.3系のバージョンにかかわらず共通で次のパターンでいくのがわかりやすくて安全だと思います。

  • 基本的にjspとActionFormとActionとInitActionは1対1対1対1で作成
  • jspからのサブミットはformのaction属性に対応するActionへのみとする(1つのフォームを異なるActionへサブミットするs2struts:submitタグを記述しない)
  • 呼び出されたActionでは次画面の表示に必要な処理は行わない
  • 次画面の表示に必要な情報はその画面(jsp)のs2struts:initタグから呼び出すInitActionで行う

たとえば、従業員のマスタメンテで編集画面(edit.jsp)から確認画面(confirm.jsp)へ遷移するとします。

edit.jsp
  <html:form action="/edit">
    ・・・
    <s2struts:submit action="@{editAction.goConfirm}">確認</s2struts:submit>
    <s2struts:submit action="@{editAction.goPrevious}" cancel="true">戻る</s2struts:submit>
  </html:form>

編集画面(edit.jsp)では、前画面に戻りたくても次画面に進みたくてもひとつのformからはs2struts:submitタグを使って同じActionにサブミットするようにするのがいいです。ひとつのForm内の複数のs2struts:submitタグで異なるActionを呼び出すと、呼び出したActionに対応するバリデーション処理がスキップされてしまうことがあるからです(S2Struts1.2では必ずスキップされる、1.3では回避できる)。

編集画面(edit.jsp)で「確認」ボタンが押されたとします。呼び出されるActionでは次画面の表示に必要な処理は行ないません。ここではただForwardするだけにします(ただし、ActionFromに対するバリデーションは行うにようにしています)。

EditAction
public class EditAction {

    @StrutsActionForward(path = "/WEB-INF/view/confirm.jsp")
    public static final String CONFIRM = "confirm";

    @StrutsActionForward(path = "/WEB-INF/view/list.jsp")
    public static final String LIST = "list";

    public String goConfirm() {
        return CONFIRM;
    }

    public String goPrevious() {
         return LIST;
    }
}

Forwardされた先のjspでは s2struts:init タグにより画面表示に必要な情報を取得するInitActionを呼び出します。

confirm.jsp
  <html:form action="/confirm">
    <s2struts:init action="@{confirmInitAction.init}"/>
    ...
    <html:hidden property="empName" />
  ...
    <s2struts:submit action="@{confirmAction.goStore}" >更新</s2struts:submit>
    <s2struts:submit action="@{confirmAction.goPrevious}">戻る</s2struts:submit>
  </html:form>

s2struts:init タグは、html:form タグの内側に記述します。こうすることでこのjspに対応するActionFromをInitActionで扱えるようになります。html:form タグでこのjspに関連づいたActionFormのインスタンスがrequestスコープに入れられ、それが自動でInitActionにバインディングされるからです。

そのため、s2struts:init タグから呼び出されるConfirmInitActionでは、前画面のActionFrom(editForm)とこれから表示する画面のActionFrom(confirmForm)の両方が扱えます。

ConfirmInitAction
public class ConfirmInitAction {

    private ConfirmForm confirmForm;

    private EditForm editForm;

    public void setEditForm(EditForm editForm) {
        this.editForm = editForm;
    }

    public void setConfirmForm(ConfirmForm confirmForm) {
        this.confirmForm = confirmForm;
    }
    
    public void init() {
        // ホントはBeanUtilsとかでコピー
        confirmForm.setEmpNo(editForm.getEmpNo());
        confirmForm.setEmpName(editForm.getEmpName());
        ...
    }
}

ここでは前画面のeditFormの値をこれから表示するconfirmFormにつめているだけですが、必要であればDBから取得したデータを設定することもできます。

confirmFormに値が設定されると、confirm.jsp内でその値にアクセスすることができます。たとえば、confirm.jspで <html:hidden property="empName" /> としていますが、ConfirmInitActionのinitメソッドで設定された値が出力されます。


ちょっと簡略化して記述しているのでこのままで動かないかもしれませんが、だいたいこのパターンでいけるんじゃないかなぁと思います。

ちなみに、一般的な

#{confirmAction.goStore}

ではなく

@{confirmAction.goStore}

と書いていますが、これはJSP2.1の仕様とバッティングしないようにしているためです。「#」と書くとWTPの検証で警告がでるのでかわりに「@」にしています。S2Struts的にはどの文字で始まっているか見ていないので何でもいいんですよね。

2008-06-01

[] S2Struts-1.3.0-RC6 リリース

リリースしました。

ドキュメントとリリース作業で休みが終わったよ。。。

Bug

  • [STRUTS-51] - HotDeployでSessionスコープのFormがクリアされる問題に対処しました。
  • [STRUTS-63] - 複数の実行メソッドを持つActionにBINDING_METHODアノテーションを使用できない問題に対処しました。
  • [STRUTS-64] - S2Strutsのsubmitタグやimageタグでaction属性とindexId属性を併用すると動作しない問題に対処しました。
  • [STRUTS-65] - セッターメソッドの不要な呼び出しを行わないようにしました[Seasar-user:13276]
  • [STRUTS-72] - StrutsActionアノテーションのforward属性やinclude属性に値を設定しても無視される問題に対処しました。
  • [STRUTS-74] - S2StrutsのLinkTagでActionの式を指定した場合にActionのインデックスつきメソッドを実行できない問題に対処しました。
  • [STRUTS-75] - HotdeployClassLoaderへの参照が残りメモリリークが発生する問題に対処しました。

Improvement

  • [STRUTS-68] - サブアプリケーションのActionFormをサブアプリケーションのActionと関連付けるSubApplicationActionFormNamingRuleを作成しました[s2struts-dev:50]。
  • [STRUTS-69] - S2Strutsのsubmitタグとimageタグでrtexprvalueをtrueにしました [Seasar-user:13893]。
  • [STRUTS-71] - S2Strutsのlinkタグを使って生成したリンクをブックマーク可能としました。
  • [STRUTS-73] - StrutsActionForwardのpath属性のデフォルト値はアノテーションが指定されたフィールドの値としました。

Task

  • [STRUTS-7] - Mayaaを使用しないexampleを用意しました。
  • [STRUTS-66] - S2Struts1.2からS2Struts1.3への移行ドキュメントを1.3.0-RC6に合わせて修正しました。

ダウンロードはこちらから。

http://s2struts.seasar.org/ja/

2008-05-09

[][] S2Strutsのドキュメント

ところで、去年末から雑誌、developerWorks、JPA入門本、社内の書類、そしてまたdeveloperWorksと文章を書くタスクが続いてちょっとヘロヘロ。でも、まだ文章を書くタスクが1つ残っているんですよね。それがS2Strutsのドキュメント。S2Strutsのドキュメントは、ちょっとわかりにくかったりカバーできていない機能があったりするので、もう少し分かりやすくするつもりです。需要はそんなに多くない気はしますがやります、developerWorksの担当分も終わったことだしね。ただ、もうちょっと待ってね。

2008-03-08

[][] S2Struts 1.3.0-RC5 リリース

リリースしました!

  • Bug
    • [ STRUTS-60 ] - クラス名が定義されていないcomponent定義があると、IllegalArgumentExceptionが発生する問題に対処しました。[Seasar-user:13018]
  • 移行の注意点
    • 同梱するs2-frameworkのバージョンを2.4.23にしました。
    • 同梱するs2-extensionのバージョンを2.4.23にしました。

ダウンロードはこちらからどうぞ.

Maven2からのご利用はこちらを参照ください.