広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年12月20日

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

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


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


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


では、今回は、StrutsEtoTestプロジェクトの各ソース・コードを
簡単に解説していきます。



では、まず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:form method="POST" action="/eto">
         <br>
         干支を調べたい年: <br>
         <html:text property="year" size="5" />
         <br>
         <html:errors />
         <html:submit property="submit" value="送信" />
      </html:form>
   </body>
</html:html>
--------------------------------------------------------

まず、1行目の

<%@ page contentType="text/html; charset=UTF-8" %>

については、既に(vol.086で)学んでいますね。

次の2〜5行目の

<%@ 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" %>

は、このJSPのページでどのようなタグ・ライブラリー(下の補足を参照)
を使用するのかを定義する文(正確にはディレクティブ(directive
= 命令))です。
そして、uri=にはそのタグ・ライブラリーのありか(場所)を指定し、
prefix=にはそのタグ・ライブラリーを参照するためのプリフィックス
(prefix = 接頭辞)を指定します。

┌補足─────────────────────────┐
JSPにはカスタム・タグ(custom tag)と呼ばれる、ユーザーが
独自のタグを定義できる機能があり、これらはタグ・ライブラ
リー(tag library)と呼ばれる入れ物(拡張子が.tldのファイ
ル)の中にまとめて定義されます。
Strutsではこの仕組みを利用して独自のタグ・ライブラリーを
提供しており、2〜5行目のようにbean、logic、html、nestedと
いうプリフィックスで参照されるようになっています。
└───────────────────────────┘

このプリフィックスは具体的には、7行目や14行目のように<html:・・・>
という形式で使用されます。
今回はhtmlというプリフィックスしか参照していないので4行目だけ
しか必要ないのですが、2〜5行目はStrutsIDEプラグインが自動的に
挿入した行であるし、そのまま残しておいても害はないので、その
ままにしています。

ここでちょっと注意しておきますが、このtaglibディレクティブの
uri=の指定はその場所をずばり表しているわけではありません。
例えば、この/tags/struts-beanという指定が実際にはどこにあるのか、
というと、/tags/struts-beanという場所にあるのではなく、実際は
web.xmlの中に/tags/struts-beanの実際のありかを記述しています。
そして、web.xmlの中では、実際のありかは/WEB-INF/struts-bean.tld
として記述してあります。(StrutsIDEプラグインが自動的に記述
しています。)
Eclipseのプロジェクト・エクスプローラー内のStrutsEtoTestプロジェ
クト内のWebContentフォルダー内のWEB-INFフォルダーの中を見て調べ
てみて下さい。

┌補足─────────────────────────┐
JSP特有のタグの構文の詳細については、Webページ

http://java.sun.com/products/jsp/tags/12/syntaxref12.html

などで調べることができます。
└───────────────────────────┘


あと残りのソース・コードは <html: で始まるタグだけがStruts独自のタグで、
他は普通のHTMLの文になっています。

このうち、7行目と23行目

<html:html>

</html:html>

はHTMLの

<HTML>

</HTML>

に相当します。(実際にサーバーからWebブラウザーへWebページが返される
ときにこのHTML文に変換されてから返されます。)

17行目の

<html:text property="year" size="5" />

は年の数字を入力させるためのテキスト・フィールドで、HTMLでは

<input type="text" name="year" size="5" value="">

というコードに相当します。(実際にサーバーからWebブラウザーへWebページ
が返されるときにこのHTML文に変換されてから返されるのです。)

ところで、このJSPファイルは、vol.178のindex.htmlと同じく、干支を調べた
い年を入力させ、サーブレットを呼び出すためのものですが、vol.178とは違い、
年の数字を直接入力させる形式にしていることに注意して下さい。この場合、
ユーザーがどんな値を入力するかわかりませんので、数字以外の文字を入力
した場合などに対するチェック(検証)が必要になるわけです。
そのために、前回お話したValidatorプラグインを使用しているわけです(詳しく
は後述)。

そして、このValidatorプラグインによる検証の結果、入力データに問題があった
場合には、エラーのメッセージが返ってきますが、そのエラー・メッセージの
出力先が、19行目の

<html:errors />

というコードを指定した場所になります。これはvol.107でも出てきましたね。
前回は色づけなどをせずに表示していたので、あまりエラーという感じがしな
かったかもしれませんので、あとで色付けなどの装飾を行ってみましょう。


┌補足─────────────────────────┐
Strutsのタグ・ライブラリーの詳細については、Webページ

http://struts.apache.org/1.x/struts-taglib/

などで調べることができます。
└───────────────────────────┘


20行目の

<html:submit property="submit" value="送信" />

は、HTMLでは

<input type="submit" name="submit" value="送信">

というコードに相当します。つまり、実際にサーバー側でこのHTML文に変換されて
からWebブラウザーに返されることになります。

そして、14行目の

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

はHTMLでは、

<form name="etoForm" method="POST" action="/StrutsEtoTest/eto.do">

というコードに相当します。実際にサーバー側でこのようなHTML文への変換
が行われるわけですが、このとき、vol.105などでもお話したように、etoの
うしろに.doがつけられることに注意してください。
(ちなみに、/eto.doの前に/StrutsEtoTestがついていることからわかるように、
WTPのデフォルトではプロジェクト名(ここではStrutsEtoTest)がコンテキスト・
ルート(Context root = Context path = ドキュメント・ルート)として扱われ
ます。これは、vol.101などでお話したように、Tomcatのディレクトリーでは、
webappsディレクトリーの配下のディレクトリー名に相当します。)

.doがついていることによって、ActionServletが呼び出され、ActionServletは
struts-config.xmlの中をみて、呼び出すActionクラスを探すのでしたね。

そこで、前回は、struts-config.xmlの中(14〜17行目)に

    <action path="/eto" type="jp.co.flsi.lecture.struts.test.ProcessEtoAction"
     name="etoForm" scope="request" input="/index.jsp" validate="true">
      <forward name="success" path="/result.jsp"/>
    </action>

というコードを書き込みました。
これは、vol.105でもお話したように、「/etoというパスがURLに指定されていたら
jp.co.flsi.lecture.struts.test.ProcessEtoActionというActionクラスを呼び出し
(そのexecuteというメソッドを実行し)、その結果forwardに"success"という
文字列が設定されたら、/result.jspというJSPファイルを結果のWebページとして
Webブラウザーに返しなさい。」ということを指定しています。
また、

input="/index.jsp" validate="true"

という指定があることにより、(name=で指定された)etoFormのデータに対して、
(validate="true"という指定があるので)データの検証(妥当性チェック)を行い、
その検証の結果に問題(不正)があった場合は(input=で指定された)/index.jspに
遷移することになる、ということもvol.105でもお話した通りです。

そして、etoFormについては、struts-config.xmlの中(7行目)に

    <form-bean name="etoForm" type="jp.co.flsi.lecture.struts.test.EtoForm" />

と書いておきましたから、jp.co.flsi.lecture.struts.test.EtoFormというクラス
(FORMのデータを保有するクラスなのでFormビーンと呼ぶ)をetoFormに割り振って
あるわけです。


こうしておくと、ActionServletはindex.jspのFORMのデータをEtoFormに渡し、
Validatorプラグインによる検証(後述)を実行し、検証結果に問題があれば
index.jspのWebページをWebブラウザーに返します。あるいは検証結果に問題が
なければProcessEtoActionを呼び出し、その結果forwardに"success"が設定
されたら(今回は必ず"success"が設定されるようにしている)/result.jspの
WebページをWebブラウザーに返すということになります。



EtoFormのソース・コードについては説明するまでもないと思います。ただ
yearのsetterメソッドとgetterメソッドがあるだけです。
ただし、ValidatorFormのサブクラスになっていることに注意して下さい。
こうしておくと、このFormビーンに取り込まれたデータに対して自動的に
検証(詳しくは後で説明)が行われます。



では、続いてProcessEtoActionのソース・コードを見てみましょう。
(下に再提示します。)

--------------------------------------------------------
package jp.co.flsi.lecture.struts.test;

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

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 ProcessEtoAction extends Action {
   public ActionForward execute(ActionMapping mapping, ActionForm form,
         HttpServletRequest request, HttpServletResponse response) {
      EtoForm etoForm = (EtoForm) form;
      EtoBean etoBean = new EtoBean();
      etoBean.calcEto(Integer.parseInt(etoForm.getYear()));
      HttpSession session = request.getSession();
      session.setAttribute("etoBean", etoBean);
      return mapping.findForward("success");
   }

}
--------------------------------------------------------

これもほとんど説明の必要がないと思いますが、execute()メソッドの引数の
うち、ActionForm formという引数には、先ほどのstruts-config.xmlの中で
name="etoForm"という形式で指定したetoForm(すなわちEtoFormクラスの
オブジェクト)が渡されることになります。(ActionServletがstruts-config.xml
の記述に従ってこのProcessEtoActionのexecute()メソッドを呼び出し、その
ときに必要な引数の引渡しを行っている。)

したがって、このformという引数にはEtoFormのオブジェクトが入るわけですが、
EtoFormのメソッドを呼び出す(上のソース・コードではgetYear()メソッドを
呼び出している)ためにはEtoForm型にキャストしてやる必要があります。
というわけで、

EtoForm etoForm = (EtoForm) form;

という行があるわけです。



では、続いてEtoBeanのソース・コードを見てみましょう。

--------------------------------------------------------
package jp.co.flsi.lecture.struts.test;

public class EtoBean {
   private String eto = "不明";

   public void setEto(String eto) {
      this.eto = eto;
   }

   public String getEto() {
      return eto;
   }

   public void calcEto(int year) {
      int diff = (year - 1995) % 12;
      if (diff < 0) diff += 12;
      switch (diff) {
      case 0:
         eto = "亥";
         break;
      case 1:
         eto = "子";
         break;
      case 2:
         eto = "丑";
         break;
      case 3:
         eto = "寅";
         break;
      case 4:
         eto = "卯";
         break;
      case 5:
         eto = "辰";
         break;
      case 6:
         eto = "巳";
         break;
      case 7:
         eto = "午";
         break;
      case 8:
         eto = "未";
         break;
      case 9:
         eto = "申";
         break;
      case 10:
         eto = "酉";
         break;
      case 11:
         eto = "戌";
         break;
      default:
         break;
      }
   }
}
--------------------------------------------------------

これも特に説明の必要はないと思いますが、ただ、vol.178のときのロジックに
対して、
if (diff < 0) diff += 12;
というコードが追加されている点が異なることに注意して下さい。

これは、vol.178の場合と違って、今回のアプリケーションでは入力される年
の数字が何ら制限されていないため、1995よりも小さい場合もあるからです。

なお、演算子「%」の働きがよくわからないという人は、vol.027を復習して
下さい。

あと、このビーン(このEtoBeanはJavaBeansのルールに従って作成してあるBean)
のプロパティーとしてetoを用意してある(etoのgetterメソッドを用意してある)
ことも覚えておいて下さい。これはあとで参照します。



続いてresult.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>
      <br>
      干支は:
      <bean:write name="etoBean" property="eto"/>
   </body>
</html:html>
--------------------------------------------------------

ここで16行目の

<bean:write name="etoBean" property="eto"/>

というコードは、

<jsp:useBean class="jp.co.flsi.lecture.struts.test.EtoBean" id="etoBean" scope="session" />
<%= etoBean.getEto() %>

に相当します。このように、JSPの普通のコードでは、etoBeanのプロパティーeto
の値を取得するためのコードが長ったらしくなりますが、Strutsのタグを使うと
簡単に書けるのです。また普通のJSPのコードと違ってscope=の指定は必要なく、
requestでもsessionでも自動的に識別してくれますので簡単です。



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



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


(次回に続く)


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



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      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. 不許無断複製