アクションクラスとPOJO

Struts1系と比較しStruts2.1の利点として、最も良く取り上げられるのが、Struts2.1のアクションクラスがPOJOであるという点です。

Struts1系のアクションクラスはStrutsが提供するActionクラスを継承しなければならず、アクションメソッドであるexecute()は、戻りにActionForward、パラメータにはActionMapping、HttpServletRequestなどのクラスやインタフェースをパラメータにしなければなりませんでした(リスト2)。

リスト2: Struts1系のアクションメソッド

public ActionForward execute(ActionMapping mapping,
                            ActionForm form, HttpServletRequest request, HttpServletResponse response)

それと比較し、Struts2.1のアクションクラスは何も継承せずにPOJOとして作成することが可能です。アクションメソッドであるexecute()も非常にシンプルです(リスト3)。また、後述しますがexecute以外の名称をアクションメソッドに使うことができます。

リスト3: HelloActionクラス

public class HelloAction {
   public String getMessage() {
        return "Hello!";
    }
   public String execute() throws Exception {     <--------- アクションメソッド
        return "success";
    }
}

アクションクラスの違いはPOJOかどうかだけではありません。Struts1系がリクエストに対しマルチスレッドで動作するのに対し、Struts2.1では、リクエストごとにアクションクラスを生成します。また、Struts2.1はプル型アーキテクチャを採用しているため、JSPからアクションクラスのgetterメソッドを利用して、データを取得することができます(リスト4)。

リスト4: hello.jsp

……
<%@ taglib prefix="s" uri="/struts-tags" %>
……
<html>
<head><title>Hello</title></head>
<body>
<s:property value="message"/>   <-------- HelloActionのgetMessage()からデータを取得

</body>
</html>

しかし、Struts2.1でもPOJOでアクションクラスが作成できるのはサンプルプログラムのような、比較的簡単なものに限られます。実際のシステム開発で、エラー処理などのメッセージ処理をおこなう必要がある場合などには、アクションクラスはxwork2が提供するActionSupportクラスを継承するのが普通だと考えて良いでしょう。