広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年12月27日

    Java総合講座 - 初心者から達人へのパスポート
                  vol.185

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


-------------------------------------------------------
・現在、このメールマガジンは以下の2部構成になっています。
[1] 当初からのコース:毎週日曜の夜に発行
   これは現在、中級レベルになっています。
[2] 2009年11月開講コース:毎週水曜の夜に発行
   これは現在、初心者向けのレベルになっています。
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.Strutsのアプリケーション開発
========================================================


では、最後にvalidation.xmlのソースを見てみましょう。これは、Validatorプラグイン
による検証の内容を記述するためのものです。

--------------------------------------------------------
<?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>
    </global>

    <formset>

        <form name="etoForm">
            <field property="year" depends="required,integer">
                    <arg key="year" resource="false" />
            </field>
        </form>

    </formset>

</form-validation>
--------------------------------------------------------

このうち、今回編集した部分は<formset>と</formset>で囲まれた部分です。
ここには複数のフォームの検証内容を指定することができますが、今回は
etoFormというフォームしか使用していませんので、一つのフォームの
検証内容だけを指定してあります。そしてフォームの検証内容は、

        <form name="etoForm">
            <field property="year" depends="required,integer">
                    <arg key="year" resource="false" />
            </field>
        </form>

という形式で記述しています。このうち、<form name="etoForm">と
</form>で囲んでいる部分がetoFormというフォームの検証内容を記述
する部分ということになります。
もちろんname="etoForm"という属性の指定が、etoFormという名前の
フォームに関する検証内容を記述することを意味しています。

そして、そのフォーム内の各フィールドの検証内容を<field>タグで記述す
るのですが、etoFormにはyearというフィールドしかありませんので、
property="year"と指定した<field>タグしかありません。

また、この<field>タグにおけるdepends="required,integer"という指定は、
このフィールドの値が「必要である(required)」ことと「整数である
(integer)」ことを検証対象として指定しています。
したがって、yearの値が入力されなかった場合はrequiredに反するので
不正と見なし、あるいは整数以外の値が入力された場合はintegerという
指定に反するので不正と見なすことになります。
そして不正と見なされた場合は、エラー・メッセージを返すことになります。

<arg>というタグは、そのフィールドの値が不正だったときに返すメッセージ
の引数に関する情報を指定するためのものです。

ここでは、key="year"という指定があるので、引数にyearという値を渡す
ことになります。

なお、key="year"に指定したyearがメッセージにそのまま渡したい引数では
なく、そのキーをプロパティー・ファイルで調べて別の値に変換して渡した
い場合は、resource="true"という指定にしますが、今回は直接yearという値
を引数として渡したいので、resource="false"という指定にしています。

あと、全フォームを通して使用したいコンスタント(定数)などがある場合、
そのコンスタントの定義を<global>と</global>ではさみますが、これについ
ては、また後ほど説明いたします。

┌補足─────────────────────────┐
validation.xmlの詳細も含めて、Strutsを独力で学習したい人は、
Webページ

http://struts.apache.org/1.x/userGuide/

などを参照して下さい。
└───────────────────────────┘


では、そのメッセージの引数というのが実際のメッセージの中でどのように
なっているのかを確認するために、そのメッセージのファイルを見てみま
しょう。

プロジェクト・エクスプローラー内のStrutsEtoTest(プロジェクト)配下の
「Javaリソース:src」フォルダーの配下にあるMessageResources.properties
を開いてみて下さい。
ここには、Strutsのサンプルとして提供されているメッセージがはいっています。
(StrutsIDEプラグインが自動的に組み込んだものです。)

--------------------------------------------------------
# -- standard errors --
errors.header=<UL>
errors.prefix=<LI>
errors.suffix=</LI>
errors.footer=</UL>
# -- validator --
errors.invalid={0} is invalid.
errors.maxlength={0} can not be greater than {1} characters.
errors.minlength={0} can not be less than {1} characters.
errors.range={0} is not in the range {1} through {2}.
errors.required={0} is required.
errors.byte={0} must be an byte.
errors.date={0} is not a date.
errors.double={0} must be an double.
errors.float={0} must be an float.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.short={0} must be an short.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
# -- other --
errors.cancel=Operation cancelled.
errors.detail={0}
errors.general=The process did not complete. Details should follow.
errors.token=Request could not be completed. Operation is not in sequence.
# -- welcome --
welcome.title=Struts Blank Application
welcome.heading=Welcome!
welcome.message=To get started on your own application, copy the struts-blank.war to a new WAR file using the name for your application. Place it in your container's "webapp" folder (or equivalent), and let your container auto-deploy the application. Edit the skeleton configuration files as needed, restart your container, and you are on your way! (You can find the application.properties file with this message in the /WEB-INF/src/java/resources folder.)
--------------------------------------------------------

これらのうち、errors.required=で始まる行が、先ほどのvalidation.xmlで指定
したrequiredに対するエラー・メッセージで、errors.integer=で始まる行が
integerに対するエラー・メッセージです。

たとえば、requiredに対する不正に関しては

{0} is required.

というエラー・メッセージが返されることになりますが、このうち{0}という
部分が引数であり、validation.xmlの中のkey="year"で指定したyearという
値がこの{0}の部分に置き換えられ、結果的には

year is required.

というメッセージが返されることになります。

なお、このMessageResources.propertiesの中には{0}の他に{1}や{2}などの
複数の引数を持つメッセージもありますが、複数の引数に対するvalidation.xml
の指定の仕方については、また後述します。


ここで、最後に、エラー・メッセージに赤色をつけて、目立つようにする
という修正を行っておきましょう。やり方はいろいろありますが、今回は
安直なやり方として、このMessageResources.propertiesの中の

errors.required={0} is required.

の行を下記のように編集して下さい。

errors.required=<font color="red">{0} is required.</font>

つまり、文字を赤色にするようにHTMLのfontタグを追加するわけです。
また、

errors.integer={0} must be an integer.

の行についても同様の編集を行ってみて下さい。

編集が終わりましたらファイルを保管し、アプリケーションをテストして
みて下さい。
なお、Eclipseのプロジェクト・エクスプローラー内のStrutsEtoTest
を右クリックし、「実行」→「サーバーで実行」を選択し「完了」ボタン
をクリックすると、Tomcatのサーバーの起動からWebブラウザーの起動まで
自動的に行ってくれます。

テストしてみると、ちゃんとエラー・メッセージが赤色になることが分かり
ますね。


ただし、このやり方はあくまで安直なやり方であり、好ましいやり方では
ありません。たとえば、Validatorプラグインにはクライアント側(Webブラ
ウザー側)でも入力データの検証を行う機能があるのですが、この機能を
使った場合に不都合が生じます。

実際にやってみましょう。

index.jspを下記のように修正してみて下さい。

--------------------------------------------------------
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-nested" prefix="nested" %>

<html:html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      <title>干支(十二支)</title>
   </head>
   <body>
      <h1>干支(十二支)を調べる</h1>
      <html:javascript formName="etoForm" />
      <html:form method="POST" action="/eto" onsubmit="return validateEtoForm(this)">
         <br>
         干支を調べたい年: <br>
         <html:text property="year" size="5" />
         <br>
         <html:errors />
         <html:submit property="submit" value="送信" />
      </html:form>
   </body>
</html:html>

--------------------------------------------------------

ここで変更したのは、

      <html:javascript formName="etoForm" />

という行を追加したことと、

      <html:form method="POST" action="/eto">

の行にonsubmit="return validateEtoForm(this)"という属性を追加したことです。

これだけで、クライアント側でも入力データの検証が(JavaScriptによって)行わ
れるようになるのです。自分でJavaScriptのプログラムをコーディングしなくて
済むので随分と楽ができますね。

では、このファイルを保管した後、テストしてみて下さい。

確かに入力データを空にしたり、整数以外の文字列を入力すると、Webブラウザー側で
直接、エラー・メッセージを(「Webページからのメッセージ」ウインドウで)表示し
てくれますね。

しかし、このエラー・メッセージには、先ほど追加したHTMLのfontタグがそのまま
文字列として表示されてしまい、不都合であることがわかります。
そこで、こういったfontタグのようにメッセージを修飾(飾り立て)したいタグを入れる
場所は別に用意されています。それがMessageResources.propertiesの先頭の
ほうにあるerrors.header、errors.prefix、errors.suffix、errors.footerというプロパ
ティーですが、これらの使い方はまた後ほどお話いたします。


ところで、これまでメッセージを英語のまま使ってきましたが、メッセージ
を英語ではなく日本語にしたいときはどうしたらよいかというと、日本語の
メッセージを直接このプロパティー・ファイルに書き込んでは駄目で、以前
(vol.145で)お話したように、事前にnative2asciiを使って日本語の文字
からUnicodeエスケープに変換しておいてやる必要があります。
こういった日本語化の話は、また後ほどお話いたします。


以上で、ソースの内容は一通り理解できたことと思います。



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


では、これから、少し本格的なアプリケーションを作成して、Strutsを詳しく
学んでいきましょう。



◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆ ◆


(次回に続く)


では、今日はここまでにします。



================================================
◆ 02.演習問題
================================================

これまではTomcatのVersion 5.5を使ってきましたが、それは、LinuxのPCの
ほうにTomcatのVersion 5.5をインストールしてあるためです。(後ほど
作成するStrutsのアプリケーションをLinuxのPCのTomcatで実行します。)

しかし、今回までに作成した干支を算出するStrutsのアプリケーション
はTomcatのVersion 6でも実行可能です。そのことをEclipse上で確認
してみて下さい。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2009 Future Lifestyle Inc. 不許無断複製