広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年12月13日

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

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


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


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


(今、作成しているStrutsアプリケーションはStrutsIDEプラグイン
の動作確認をすることだけが目的なので、とりあえずソースの解説
無しにさっさと作って、動作の確認を行いますが、次回はこれらの
ソース・コードを解説することから始めて、本格的なStrutsアプリ
ケーションの開発の話にはいって行きます。)


では、続いて、Javaプログラムのほうのコーディングをしましょう。

┌補足─────────────────────────┐
現在のEclipseでは、開発作業中にWTP(Java EE)のサーバーが

--------------------------------------------------------
エラーが発生しました。詳細については、エラー・ログを参照してください。
Could not initialize class org.eclipse.wst.server.ui.internal.provisional.UIDecoratorManager
--------------------------------------------------------

というようなエラーを返すことがあります。
これは、

https://bugs.eclipse.org/bugs/show_bug.cgi?id=279479

を見るとわかるように、Eclipse側のバグのようです。(まだ
未解決の問題です。)

とりあえず、このエラーを避けるためには、Eclipseの起動時
に「サーバー」ビューが表示された状態にしておくといいよう
です。

そのためには、Eclipseの終了前にJava EEパースペクティブの
状態にして、いったん(「サーバー」タブをクリックすること
によって)「サーバー」ビューを表示しておいてからEclipseを
終了させます。そうすれば、次回Eclipseを起動するときには
「サーバー」ビューが表示された状態になります。

ちなみに、当記事では、他にも途中で何らかのファイルにエラー
のマーク(赤い×マーク)が付くことがありますが、これらの
エラーは最終的には無くしていくものなので、気にしないで
下さい。
└───────────────────────────┘


まず、パッケージを作成しましょう。

(1) プロジェクト・エクスプローラーのStrutsEtoTest配下の「Javaリソース:src」
を右クリックし、「新規」→「パッケージ」を選択します。

(2) 「新規Javaパッケージ」ウインドウにおいて、「名前」欄に

jp.co.flsi.lecture.struts.test

と入力し、「完了」ボタンをクリックします。



続いて、このパッケージに以下のようにActionFormクラスを作成しま
しょう。ActionFormというのは、WebページのFORMのデータを保持す
るためのクラスでしたね。

(1) プロジェクト・エクスプローラー内で先ほど作成した
jp.co.flsi.lecture.struts.test(パッケージ)を右クリックし、
「新規」→「その他」を選択します。

(2) 「新規」ウインドウにおいて、「Amateras」配下の「Struts」配下の
「Struts ActionForm」を選択し、「次へ」ボタンをクリックします。
(ちなみに、この「Amateras」配下の「Struts」はStrutsIDEプラグイン
が提供している機能です。)

(3) 「Struts ActionForm」ウインドウにおいて、「名前」欄に

EtoForm

と入力して、「完了」ボタンをクリックします。

EtoFormのエディターが開いたら、下記のように編集しましょう。

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

import org.apache.struts.validator.ValidatorForm;

public class EtoForm extends ValidatorForm {
   private String year = null;

   public void setYear(String year) {
      this.year = year;
   }

   public String getYear() {
      return year;
   }

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

ここで、スーパークラス(extendsの右側に指定するクラス)の指定を
ActionFormからValidatorFormに書き換えていることに注意して下さい。
(結局、ActionFormを使わなくなったので、上の(2)で「Struts ActionForm」
を選択した意味がなくなってしまいましたが、通常は(2)の作業をする
ものだと覚えておいて下さい。)

このValidatorFormはActionFormのサブクラスであり、Validatorプラグイン
と呼ばれる、FORMの入力データの検証(validation)を行う機能を提供す
るクラスです。
この検証機能を後ほど利用しますので、覚えておいて下さい。



では、続いて、次のように干支(えと)を算出するためのクラスを作成し
ましょう。

(1) プロジェクト・エクスプローラー内で先ほど作成した
jp.co.flsi.lecture.struts.test(パッケージ)を右クリックし、
「新規」→「クラス」を選択します。

(2) 「新規Javaクラス」ウインドウにおいて、「名前」欄に

EtoBean

と入力して、「完了」ボタンをクリックします。

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では、この干支を算出するロジックはサーブレットの中に直接組み込んで
いましたが、それはEclipseとWTPの動作確認だけが目的だったために、簡略化して
作ったためです。

今回は、この干支を算出するロジックをMVCのうちのモデル・オブジェクトと
して、ちゃんと独立させた訳です。


┌補足─────────────────────────┐
この干支を算出するクラスは、我々が日常使っている干支算出
のパターンをクラスにしたものです。
つまり、現実世界の干支というオブジェクトをモデル化したもの
です。(ただし、干支(正確に言うと十二支)の本来の意味を
モデル化したのではなく、「その年の干支が何であるか」という
問題を解決するときに使う干支の算出概念をモデル化したもの
です。)
このようなモデル・オブジェクトは様々なアプリケーションで
再利用できる可能性が高い(つまり汎用性がある)ため、サー
ブレットの中に直接ロジックを組み込むのではなく、独立した
クラスにすべきなのです。

ちなみに、こういったStrutsのアプリケーションから呼び出さ
れるクラスも煎じ詰めればサーブレットから呼び出されるクラ
スなので、JavaBeansのBean(JavaBeansのルールに従って作ら
れたクラス)にしておく必要があります。
上のEtoBeanもBeanになっています。

なお、ついでに言えば、こういったクラス(Bean)はパッケー
ジもActionFormやActionクラスなどとは別にすることによって、
独立したJARファイルにまとめやすくしておくべきです。
(当記事では、同じパッケージ内にActionFormやActionクラス
も作成していますがこれは話を簡潔にするためです。本来は、
パッケージを別にするのが望ましいのです。)

そして、こういったクラス(Bean)をJARファイルにまとめて
おけば他のアプリケーションでも簡単に再利用できるように
なります。

ところで、このように複数のアプリケーションから利用される
クラス(Bean)に変更があったときに、面倒がおこることが
あります。

たとえば、消費税の計算をするBeanがあったとして、消費税率
がある日から改訂されるためにそのBeanを修正したとします。
すると、そのBeanを利用していたすべてのアプリケーションは、
その改訂日に合わせてBeanを組み込み直す必要があります。
この作業は面倒だし、間違いをおかして業務に支障をきたして
しまう恐れもあります。

そこで登場するのがEJB(Enterprise JavaBeans)です。
その消費税の計算をするBeanをEJBのBeanとして作成しておけば
Beanに修正がはいった場合でも、それを利用しているアプリケー
ション側は何も作業しなくて済みます。
さらには、EJBのBeanは利用するアプリケーションとはネット
ワーク上の別の場所にあってもかまわず、しかもその場所を自由
に移動することもできます。
このEJBを使ったアプリケーション開発についても、後ほどお話
いたします。
└───────────────────────────┘



続いて、次のようにActionクラスを作成しましょう。ActionはWebアプリケー
ションの処理の流れをコントロールするためのクラスでしたね。(vol.178
と同様に、干支を算出するロジックをActionクラスの中に直接組み込むこと
も可能ですが、上に挙げたような理由により、干支を算出するロジックは
単独のBeanとして独立させ、Actionクラスは処理の流れをコントロールす
る仕事だけに専念すべきです。)

(1) プロジェクト・エクスプローラー内で先ほど作成した
jp.co.flsi.lecture.struts.test(パッケージ)を右クリックし、
「新規」→「その他」を選択します。

(2) 「新規」ウインドウにおいて、「Amateras」配下の「Struts」配下の
「Struts Action」を選択し、「次へ」ボタンをクリックします。

(3) 「Struts Action」ウインドウにおいて、「名前」欄に

ProcessEtoAction

と入力して、「完了」ボタンをクリックします。

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");
   }

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



続いて、干支の算出結果を表示するためのJSPを以下のようにしてresult.jsp
というファイル名で作成しましょう。

(1) プロジェクト・エクスプローラーのStrutsEtoTest配下のWebContentを
右クリックし、「新規」→「その他」を選択します。

(2) 「新規」ウインドウにおいて、「Amateras」配下の「Struts」配下の
「Struts JSPファイル」を選択し、「次へ」ボタンをクリックします。

(3) 「Struts JSPファイル」ウインドウにおいて、「ファイル名」欄を

result.jsp

に変更して、「完了」ボタンをクリックします。


(4) これで、テンプレートの内容が組み込まれた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>
--------------------------------------------------------

これは、vol.178のeto.jspと同様の内容のWebページになります。



これらの処理の流れをstruts-config.xmlに登録する必要がありますので、
以下のようにして、登録しましょう。

(1) プロジェクト・エクスプローラーのStrutsEtoTest配下のWebContent配下の
WEB-INF配下のstruts-config.xmlをダブル・クリックします。

(2) struts-config.xmlのエディター(フロー・エディターと呼ばれるグラフィカルな
エディターになっている)が開いたら、その左側に並んでいるアイコンのうち、
「アクション」をクリックし、右側の白い領域の中でクリックします。

(3) そこにアイコンが貼り付いて、「/action1」という文字列が付いている
と思いますが、この文字列を2回クリック(ダブル・クリックではない。1回目
のクリックで選択、2回目のクリックで文字列の変更の意味になる)します。

(4) その文字列を

/eto

に書き換えて下さい。
その後、Enterキーを押すか、または、何もないところをクリックすること
によって、文字列の編集モードから抜けます。

(5) 同様に、アイコンのうち、「ページ」をクリックし、右側の白い領域
の中でクリックします。

(6) 貼り付いたアイコンには、「/page1.jsp」という文字列(これはファイル名
になっている)が付いていると思いますが、この文字列を先ほどと同様にして

/result.jsp

に書き換えて下さい。

(7) 同様に、アイコンのうち、「進む」をクリックし、先ほど貼り付けた「/eto」
のアイコンをクリックし、続いて、先ほど貼り付けた「/result.jsp」のアイコン
をクリックします。そうすると、2つのアイコンの間に矢印の線が引かれますね。
このままだと、この矢印線を引くモードのままになっているので、いったん「選択」
というアイコンをクリックすることによってモードを解除しておいて下さい。

(8) 先ほどの矢印線に「forward1」というような文字列が付いていると思いますが、
これも同様にして

success

に書き換えて下さい。

StrutsIDEには、このようにビジュアルにstruts-config.xmlを編集する機能が
あるのですが、これには簡単な機能しかなく、細かいことはソース・コードを
直接編集する必要があります。というわけで、後は下記のように操作して編集
しましょう。

(9) このstruts-config.xmlのエディターの下のほうに「ソース」というタブが
あるので、それをクリックします。

(10) ソース・コードが表示され、下記のような内容になっていると思います。

--------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
  <data-sources>
  </data-sources>
  <form-beans>
  </form-beans>
  <global-exceptions>
  </global-exceptions>
  <global-forwards>
  </global-forwards>
  <action-mappings>
    <action path="/eto">
      <forward name="success" path="/result.jsp"/>
    </action>
  </action-mappings>
  <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
  <message-resources parameter="MessageResources"/>
  <plug-in className="org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
    <set-property property="moduleAware" value="true"/>
  </plug-in>
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
  </plug-in>
</struts-config>
--------------------------------------------------------

これを、下記のように編集して下さい。

--------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
  <data-sources>
  </data-sources>
  <form-beans>
    <form-bean name="etoForm" type="jp.co.flsi.lecture.struts.test.EtoForm" />
  </form-beans>
  <global-exceptions>
  </global-exceptions>
  <global-forwards>
  </global-forwards>
  <action-mappings>
    <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>
  </action-mappings>
  <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
  <message-resources parameter="MessageResources"/>
  <plug-in className="org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
    <set-property property="moduleAware" value="true"/>
  </plug-in>
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
  </plug-in>
</struts-config>
--------------------------------------------------------


あと、同じWEB-INF配下にあるvalidation.xmlというファイルがエラーに
なっている(赤い×のマークが付いている)かも知れませんが、これは
サンプルのコードが邪魔になってエラーを起しているのであり、これは
これからちゃんと編集し直しますので、気にしないで下さい。

というわけで、このvalidation.xmlを下記のように編集して下さい。

--------------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.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>
--------------------------------------------------------

これは、先ほどお話したValidatorプラグインを使って入力データ(year)
のチェックを行っている(データが入力されているか、また、データが
整数であるか、をチェックしている)のですが、詳しいことは次回解説し
ます。



コーディングは以上で終わりです。編集したファイルはすべて保管しておいて
下さい。



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


では、このプロジェクトをEclipseのTomcatサーバーで実行できるように設定
しておきましょう。

(1) 「サーバー」ビューの中にある「ローカル・ホストのTomcat v5.5サーバー」を
右クリックし、「Add and Remove」を選択します。

(2) 「Add and Remove」ウインドウにおいて、StrutsEtoTest(先ほど作成した
プロジェクト名)を選択し、「追加」ボタンをクリックします。
続いて「完了」ボタンをクリックします。

これで、「ローカル・ホストのTomcat v5.5サーバー」の配下にStrutsEtoTestが
入りました。(「ローカル・ホストのTomcat v5.5サーバー」の左側の+マークを
クリックすればその下にStrutsEtoTestが表示されます。)

これで、このTomcatサーバーでStrutsEtoTestのWebアプリケーションを実行できる
ようになります。



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


では、このWebアプリケーション(Strutsのアプリケーション)を実行して
みましょう。

(1) 「サーバー」ビューの中の「ローカル・ホストのTomcat v5.5サーバー」を
右クリックし、「開始」を選択します。しばらくして、

ローカル・ホストのTomcat v5.5サーバー[始動済み,同期済み]

というように、後ろに「始動済み」の表示が出たら、Tomcatの起動が完了しています。

(2) Webブラウザー(Internet Explorer)を起動してURL

http://localhost:8080/StrutsEtoTest/index.jsp

を入力しましょう。

(3) 適当に「干支を調べたい年」を入力して「送信」ボタンをクリックすると、
正しい干支が返ってきますね。めでたし、めでたし。

しかし、「干支を調べたい年」に数字以外の文字列を入力する(例えば、etoと
入力する)と、エラー・メッセージ

year must be an integer.

が返ってきますね。あるいは、何も入力しないで「送信」ボタンをクリックした
場合には、エラー・メッセージ

year is required.

が返ってきますね。これらの仕組みについても次回解説します。



では、最後にTomcatのサーバーを停止しておきましょう。
「サーバー」ビューの中の「ローカル・ホストのTomcat v5.5サーバー」を右クリック
し、「停止」を選択します。

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. 不許無断複製