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

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

画面遷移の設定

 Strutsの画面遷移は、Struts設定ファイルの <action-mappings> 要素で行う。キーとなるのは、リクエストパスだ。

 どのようなリクエストパスが要求された場合に、どのActionFormを使い、どのActionを実行し、そしてどのパスに遷移するのかを設定する。このリクエストパスは、クライアントからのリクエストがフォームのsubmitである場合、html:formタグのaction属性の値と一致する。

 リスト8は、リクエストパス"/input"が入力要求された場合に処理される。入力値を保持するActioFormに登録名"WelcomeForm"というActionFormを使うと、study.struts.action.WelcomeAction クラスのexecute()メソッドが実行され、このexecute()メソッドから"success"という名称で登録されたActionForwardが返された場合、"/welcome.jsp"にフォワードする設定例だ。

 この設定例ではActionFormのスコープはrequestとしている。

リスト8■Strutsの画面遷移の設定
<action-mappings>
<action path="/input" name="WelcomeForm" scope="request"
type="study.struts.action.WelcomeAction" >
<forward name="success" path="/welcome.jsp" />
</action>
</action-mappings>

メッセージリソースファイルの作成

 Strutsでは、エラー時に表示するメッセージなどをメッセージリソースファイルという、外部プロパティファイルに記述する。ファイル名とデプロイ場所はStruts設定ファイルの <message-resources> 要素にparameter属性で指定するのだ(この値に拡張子.propertiesを付加してファイル作成)。

 値をドットで区切ると、パッケージツリーと同じ扱いになるので、リスト9のように設定した場合は、パッケージツリーのresourcesディレクトリに、application.propertiesというファイルを作成する。

リスト9■Struts設定ファイル、<message-resources> の設定例
<message-resources parameter="resources.application"/>

入力値の検証

 Strutsでは、クライアントからの入力値妥当性検査の仕組みとして、Validator機能が用意されている。

 検査のルールは、未入力検査、文字列長検査、書式の検査など、標準で18種類(非推奨を含めると20種類)が用意されている。標準で用意されているルールのみで要件を満たすことができなければ、ルールを自作することも可能だ。StrutsのValidatorは、すべて設定ファイルベースで検査の設定を行うのが特徴なのだ。

 設定ファイルに検査ルールを登録し、フォームとプロパティ、そしてルールそれぞれの適用を設定する。設定ファイルによる一元管理と、ルールの修正、追加などの際にアプリケーションのソースコードに手を入れる必要がないのがメリットといえる。リスト10は、WelcomeFormのuserNameというプロパティに、未入力検査のルール"required"と、最大文字列長検査のルール"maxlength"を適用した設定例だ。

リスト10■Validatorの検証適用設定ファイルの設定例
<!--"charset=ISO-2022-JP"-->
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation>
<global />
<formset>
<form name="WelcomeForm">
<field property="userName" depends="required,maxlength">
<arg0 key="inputForm.userName" />
<arg1 key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>64</var-value>
</var>
</field>
</form>
</formset>
</form-validation>

画面■未入力の場合の実行例

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

  • web.xmlの作成

 JSFもまた、Strutsと同様にクライアントからのリクエストはひとつのServletで処理するアーキテクチャを採用している。web.xmlにjavax.faces.webapp.FacesServletをFaces ServletというServlet名で登録し、URLパターン /faces/* を設定するのが一般的だ。FacesServletも、StrutsのActionServletと同様にコンテナ起動時に初期化されるよう、<load-on-startup> 要素を設定する。

リスト11■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 Faces Servlet Configuration -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<!-- Standard Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>

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

</welcome-file-list>

<!-- JSF Tag Library Descriptors -->
<taglib>
<taglib-uri>/tags/jsf-html</taglib-uri>
<taglib-location>/WEB-INF/tld/html_basic.tld</taglib-location>
</taglib>

<taglib>
<taglib-uri>/tags/jsf-core</taglib-uri>
<taglib-location>/WEB-INF/tld/jsf_core.tld</taglib-location>
</taglib>

</web-app>

 リスト11の作成例では、そのほかにfiterの登録、設定とウェルカムファイルリストの登録、カスタムタグのための <taglib> 要素の設定が行われている。

BackingBeanの作成

 JSFでは、クライアントで入力された値はUIコンポーネントで保持し、BackingBeanと呼ばれるJavaBeansに値がコピーされる。リクエストパラメータは基本的に文字列型だが、BackingBean のプロパティを数値型や日付型等で作成した場合、コピーされる時に数値型や日付型など、任意の型へ変換させることができる。

 BackingBeanの作成方法は、通常のJavaBeansと変わらない。リスト12は、userName という java.lang.String 型のプロパティを持ったBackingBeanの実装例だ。

リスト12■BackingBeanの実装例
package study.jsf.bean;

import java.io.Serializable;

public class WelcomeBean implements Serializable {

private String userName;

public String getUserName() {
return userName;
}

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

}

 作成したら、faces-config.xml の <managed-bean> 要素に名前を付けて登録する。JSFでは、このBeanのスコープもここで設定する。リスト13は、WelcomeBean という名前で登録した実装例だ。スコープはrequestとしている。

リスト13■BackingBeanの登録例
<managed-bean>
<managed-bean-name>WelcomeBean</managed-bean-name>
<managed-bean-class>study.jsf.bean.WelcomeBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ