便利なコードパーツ集!

やまろうのプログラミングTips

Java

Struts1で掲示板作る!再利用しやすいActionを作ろう

投稿日:2016年12月6日 更新日:

スポンサーリンク



2003年

今回はActionクラスに焦点を当てていきます。Actionクラスの役割は
リクエストを受け取り業務ロジックを実行することです。

掲示板アプリケーションでは、以下の機能があります。
・以前投稿されたメッセージを表示する。 → リロード押下時
・メッセージを投稿する。 → 送信押下時

リロード押下時には以下のようなことを行います。
1.ファイルから保存されてるメッセージを読み込む。
2.読み込んだ内容をrequestの属性に設定する。
3.画面に表示する。

送信押下時には以下のようなことを行います。
1.requestから投稿者名とメッセージを取得する。
2.取得した投稿者名とメッセージをファイルに保存する。
3.ファイルから保存されてるメッセージを読み込む。
4.読み込んだ内容をrequestの属性に設定する。
5.画面に表示する。

ということで、上記のような処理を行うActionクラスを作る必要があります。
なので、リロード押下時に動作するActionと送信押下時に動作するActionを
作ればいいのです。

しかし、
「おやおやー、リロード押下時の1・2番と送信押下時の3・4番って同じこと
してないかぁ?」

「重複した処理は一箇所にまとめるべきだから、どうしよっかなー、
ヘルパークラスを作ろうかなぁ?でも、もっと良い方法があるような気が…。」

あるんです!いい方法が!Strutsならではの解決方法があります。
それは以下のような方法です。
1.リロード押下時の処理を行うActionを作成(LoadMessageAction.java)。
2.送信押下時の1・2を行うActionを作成(SaveMessageAction)。
3.リロード押下時にはLoadMessageActionが呼び出されるように
struts-config.xmlに設定を記述。
4.送信押下時にはSaveMessageActionが呼び出されてその後にLoadMessageActionが
呼び出されるようにstruts-config.xmlに設定を記述。

2番で送信押下時の1・2のみを行うActionを作成するのがポイントです。
そして、4番でSaveMessageActionが呼び出されてその後にJSPに遷移するのでは
なく、次のActionに遷移させています。しかもこのような遷移情報を
直接ソースコードに書くのではなく外部ファイル(struts-config.xml)によって
設定できる所がStrutsの良い所なのです。Strutsのみならず多くのフレームワーク
にはこのような機能が備わっています。

具体的に、struts-config.xmlを以下のように書きます。
[struts-config.xml(抜粋)]

<action-mappings>
<action path="/loadMessage"
type="jp.gr.java_conf.yamarou.app.forum.LoadMessageAction">
<forward name="success" path="/message.jsp"/>
</action>
<action path="/sendMessage"
type="jp.gr.java_conf.yamarou.app.forum.SaveMessageAction"
name="forumForm"
input="/message.jsp">
<forward name="success" path="/loadMessage.do"/> (1)
</action>

(1)でpath="/loadMessage.do"としている所が上記の4番
「SaveMessageActionが呼び出されてその後にLoadMessageActionが呼び出される設定」
です。

このようにStrutsでは外部ファイルによって
「A_Actionが動いてB_Actionが動いてC_Actionが動いてD_Actionが動いてE_JSPに遷移」
といった事が自由自在に行えます。画面遷移のみならず、ワークフローまで
外部ファイルによってコントロール出来ます。なので、Actionクラスは多くの処理で
使いまわせるような設計をすべきだと思います。また、複数のActionに重複した
コードが存在したら、その部分を新たなActionクラスに切り出して、そのクラスと
処理を繋ぐようstruts-config.xmlで、設定すれば良いわけです。

ActionとActionを繋いでいって一つの処理を作っているので、
「Chain of Actionパターン」
と名付けて見ました。Strutsを使ったアプリケーションの中にも共通した
パターンが存在するのでそれらをカタログしていこうと思っています。

それではActionクラスのソースを見てみましょう。

package jp.gr.java_conf.yamarou.app.forum;

import javax.servlet.http.*;
import org.apache.struts.action.*;

/**
* 掲示板メッセージを読み込み、リクエストに設定するActionです。
* @author yamarou
*/
public class LoadMessageAction extends Action {
/**
* 掲示板メッセージを読み込み、リクエストに設定する。
* @param mapping このActionが呼び出されたURLの関連情報
* @param form 送信されたフォームがあれば内容が格納される
* @param request リクエスト
* @param response レスポンス
* @return 遷移情報
*/
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
ForumDAO dao = new ForumDAO(); //(1)
ForumMessageVO[] messages = dao.getForumMessages(); //(2)
request.setAttribute("messages", messages); //(3)
return mapping.findForward("success"); //(4)
}
}

(1)でForumDAOというクラスを生成しています。ForumDAOは
掲示板メッセージの読み込み、書き込みを行うクラスです。詳細は
次回解説します。(2)で掲示板メッセージを読み込み、(3)でリクエストに設定して
います。(4)はStrutsお決まりのパターンです。

package jp.gr.java_conf.yamarou.app.forum;

import javax.servlet.http.*;
import org.apache.struts.action.*;

/**
* 送信された名前、メッセージを保存するActionです。
* @author yamarou
*/
public class SaveMessageAction extends Action {
/**
* 送信された名前、メッセージを保存する。
* @param mapping このActionが呼び出されたURLの関連情報
* @param form 送信されたフォームがあれば内容が格納される
* @param request リクエスト
* @param response レスポンス
* @return 遷移情報
*/
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
String name = request.getParameter("name");
String message = request.getParameter("message");
ForumDAO dao = new ForumDAO();
dao.save(name, message); //(5)
return mapping.findForward("success");
}
}

(5)で送信された名前、メッセージを保存しています。

いかがだったでしょうか?Actionを繋げていって処理を構成していくという
素晴らしく柔軟性に富んだ機能をStrutsは備えています。そして、Actionを繋げて
いくことを「Chain of Actionパターン」としてカタログしました。

掲示板アプリケーションが完成したら、ソースコード、クラスファイル、JSP、
その他設定ファイル等をまとめてwarファイルにして、ホームページから
ダウンロード出来るようにしたいと思います。実際に動かしてみるのが
一番良く分かりますからね!

次回はActionが処理を委譲していたForumDAOというクラスを紹介します。
それと絡めてJ2EEパターンのDAO(Data Access Object)パターンを
取り上げていきたいと思います。

んじゃ
やまろう

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2020 AllRights Reserved Powered by AFFINGER4.