StrutsとJSFは共存、統合どちらへ(5/8 ページ)

» 2005年01月19日 09時15分 公開
[阿島哲夫(カサレアル),ITmedia]

Strutsアプリケーションの処理の流れ

図1■Strutsアプリケーションの処理の流れ

1. クライアントからのリクエストをActionServletが受け取る。

2. Struts設定ファイルの設定に従ってリクエストパスに関連付いたActionFormがインスタンス化され、リクエストデータがActionFormにセットされる。

3. 入力値検証が設定されている場合は検証が行われる。

4. Struts設定ファイルの設定に従ってリクエストパスに関連付いたActionクラスのexecute()メソッドが呼び出される。

5. Struts設定ファイルの設定に従って画面遷移が行われる。

JSFアプリケーションの処理の流れ

図2■JSFアプリケーションの処理の流れ

1. クライアントからのリクエストをFacesServletが受け取る。

2. 元の画面に対応したUIコンポーネントにリクエストデータがセットされる。

3. 入力値検証が設定されている場合は検証が行われる。

4. UIコンポーネントが保持しているデータがBackingBeanにコピーされる。

5. イベント(ボタンが押されたなど)処理。イベントに関連付いたメソッドが呼び出される。

6. faces-config.xmlの設定に従って、次の画面のUIコンポーネントが用意され、画面を生成、画面遷移が行われる。

Strutsアプリケーションの作成

  • web.xmlの作成

 web.xmlにServletを登録、設定する。Strutsでは、アプリケーション中に唯一存在するServletとしてorg.apache.struts.action.ActionServletを使用する。

 クライアントからのリクエストはすべてこのActionServletが受け取る。web.xmlにActionServletをactionというServlet名で登録し、URLパターンに*.doを設定するのが一般的だ。このように設定することによって、URLの末尾が.doで終わるリクエストはすべてActionServletに処理される。ActionServletの初期化パラメータ"config"には、Struts設定ファイルのパスとファイル名を指定する。また、コンテナ起動時にアプリケーションの初期化が行われるように <load-on-startup> 要素を設定する。StrutsではJSPページでカスタムタグを使うので、 <taglib> 要素の設定も必要だ。

 リスト2の作成例では、そのほかにfiterの登録、設定とウェルカムファイルリストの登録が行われている。

リスト2■web.xmlの作成例
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Windows-31J</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Standard Action Servlet Configuration (with debugging) -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>

<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<!-- The Usual Welcome File List -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

<!-- Struts Tag Library Descriptors -->
<taglib>
<taglib-uri>/tags/struts-bean</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>
</taglib>

<taglib>
<taglib-uri>/tags/struts-html</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
</taglib>

<taglib>
<taglib-uri>/tags/struts-logic</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>
</taglib>

<taglib>
<taglib-uri>/tags/struts-nested</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location>
</taglib>

<taglib>
<taglib-uri>/tags/struts-tiles</taglib-uri>
<taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>
</taglib>

</web-app>

ActionFormの作成

 Strutsでは、クライアントから入力された値を保持するコンポーネントとして、org.apache.struts.action.ActionFormのサブクラスを作成する。リスト3は、userNameという名前で送信される入力値を保持するためのActionFormの実装例だ。JSPページで実装されたフォーム要素のproperty属性の値と同名のプロパティと、アクセッサメソッドを実装する。

リスト3■ActionFormの実装例
package study.struts.form;

import org.apache.struts.action.ActionForm;

public class WelcomeForm extends ActionForm {

private String userName;

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

}

 作成したら、Struts設定ファイル(struts-config.xml)の要素に名前を付けて登録する。リスト4は、作成した study.struts.form.WelcomeForm クラスを WelcomeForm という名前で登録した例だ。

リスト4■ActionFormの登録例
<form-beans>
<form-bean name="WelcomeForm" type="study.struts.form.WelcomeForm" />
</form-beans>

Actionクラスの作成

 Strutsでは、ビジネスロジックを呼び出すためのコントローラコンポーネントとして、org.apache.struts.action.Actionのサブクラスを作成し、execute()メソッドをオーバーライドして実装する。リスト5は、Actionクラスの実装例だ。このサンプルでは特に行うべきビジネスロジックはないので、execute()メソッドの処理は"success"という名前で登録されたActionForwardオブジェクトを取得し、returnするのみとなっている。

リスト5■Actionの実装例
package study.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class WelcomeAction extends Action {

public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// ビジネスロジックを呼び出す処理をここに記述
return mapping.findForward("success");
}

}

画面の作成

 Strutsでは、カスタムタグを用いてJSPページを作成する。Strutsが標準で提供するタグライブラリを使うのが基本だ。

 リスト6リスト7は、Strutsのカスタムタグを使ったJSPページの実装例だ。画面には送信用のフォームがあり、テキストボックスひとつと送信ボタンひとつだけのシンプルなフォームである。フォーム要素を中心にStrutsのカスタムタグが使われているのが分かるだろう。html:text タグがテキストボックスに相当するタグであり、property属性の値が送信されるパラメータ名となる。ここでは、フォーム送信すると入力した値がActionFormの同名プロパティに格納される。html:submitタグはsubmitボタンに相当するものだ。

リスト6■入力画面(Struts)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ taglib uri="/tags/struts-html" prefix="html" %> <html>
<head>
<title>Strutsのサンプル</title>
</head>
<body>
<html:form action="/input" >
<center>
<br />
<h3>お名前は?</h3>
<html:text property="userName" size="30" />
<br /><br />
<html:submit> 送信 </html:submit>
</html:form>
</center>
</body>
</html>

 リスト7は、入力された値を表示する画面実装例だ。bean:writeタグが画面出力を行うタグである。

 ここでは、WelcomeFormというBeanのuserNameというプロパティの値を出力する、という処理が実装されている。html:linkタグはハイパーリンクを生成するタグだ。

 この実装例では、forward属性によって、inputpageという名前で登録されたActionForwardを呼び出す処理が実装されている。html:linkタグでforward属性を使用するにはStruts設定ファイルの <global-forwards> 要素の設定が必要だ。

リスト7■ようこそ画面(Struts)
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<html>
<head>
<title>ようこそ!Strutsの世界へ!</title>
</head>
<body>
<center>
<br />
<h3>ようこそ!<bean:write name="WelcomeForm" property="userName" />さん!</h3>
<br /><br />
<html:link forward="inputpage"> 戻る </html:link>
</center>
</body>
</html>

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ