広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2010年02月14日

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

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


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


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


次に、商品の検索結果をリストするWebページ(itemList.jsp)を作成しましょう。

では、再度struts-config.xmlのエディターに戻って下さい。
そのフロー・エディターを開いて(下のほうにある「フロー」タブをクリックすると開く)
下さい。

/itemList.jspのアイコンに警告のマーク(ビックリ・マークのはいった橙色の三角形
のマーク)が付いていましたね。

(1) この/itemList.jspのアイコンをダブル・クリックして下さい。

(2) 「Struts JSPファイル」ウインドウが開いたら、「完了」ボタンをクリックします。

(3) itemList.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 bgcolor="#77ffff" text="#fa5a00">
      <h1>商品のリスト</h1>
         <table border="1" width="100%">
           <tbody>
             <tr>
               <th>商品番号</th>
               <th>商品名</th>
               <th>価格</th>
               <th>カテゴリー</th>
               <th>イメージ</th>
               <th>選択</th>
             </tr>
            <logic:iterate id="item" name="itemList" scope="request">
               <tr>
                  <td><bean:write name="item" property="num" /></td>
                  <td><bean:write name="item" property="name" /></td>
                  <td><bean:write name="item" property="price" />円</td>
                  <td><bean:write name="item" property="catName" /></td>
                  <td><bean:write name="item" property="image" /></td>
                  <td><bean:write name="item" property="quantity" /></td>
                </tr>
            </logic:iterate>
           </tbody>
         </table>
         <br>
         <br>
   </body>
</html:html>
--------------------------------------------------------

このJSPファイルは、とりあえず動作確認のために作ったもので、まだきちんと作成
していません。

たとえば、商品の画像はまだ用意していないので、イメージ欄には画像の代わりに
文字列を返していますし、また、選択の欄には商品の在庫数を返しています。
FORMも用意していません。

今回は、この程度のWebページで早めに動作テストをしておいて、後ほど正しい
ものに修正いたします。

さて、上のJSPのソース・コードの中で、新しく出てきたタグがあるので説明して
おきましょう。

以前、vol.087のitemList.jspの中では、Javaの普通のforループのコーディングをして
いましたが、これに置き換わるものが上のソース・コードの中の<logic:iterate>という
タグです。<logic:iterate>タグはたんにforループの働きだけでなく、その前の(vol.087
のitemList.jspの中でコーディングされている)<jsp:useBean>タブに相当する機能も
同時に提供しますので、これを使うとソース・コードがかなり簡単になって、すっきり
しますね。(vol.087のitemList.jspと見比べて下さい。)

そして、この

   <logic:iterate id="item" name="itemList" scope="request">



   </logic:iterate>

で囲まれた部分がforループ、すなわち

for (Item item : itemList) {

}

の働きをします。

ここで、logic:iterateのname属性(ここでは"itemList"を指定している)には
ArrayListやVectorなどのコレクション(複数の要素を含む入れ物的なオブジェクト)
を指定します。
そうすると、その中から取り出される要素にはid属性で指定した名前(ここでは"item")
が付けられ、forループの中で参照されることになります。
また、scope属性は、その入れ物的なオブジェクトを取り出す(探し出す)スコープ
を指定するもので、ここでは"request"スコープを指定しています。
このscope属性は、jsp:useBeanタブのscope属性と同じ働きをします。(何の話か
忘れた人は、vol.078等を復習のこと)

そして、このname属性に指定した"itemList"は、その前に呼び出されているAction
(ここではItemListAction)で

     request.setAttribute("itemList", itemList);
    
という行によって、requestスコープで保管したitemListです。これは、Vector<Item>型
でしたね。つまり、Itemのインスタンスを要素として含むVectorです。

このように、<logic:iterate>タグでは、コレクションや配列などの複数の要素を含む
オブジェクトをname属性に指定しておくと、その中の要素を一つずつ順番に取り出して、
処理していくことができます。
そのとき、取り出した要素には、id属性で指定した名前(ここでは"item"という名前
を指定している)がつけられるので、その名前を使って要素にアクセスすることが
できます。

具体的には、

   <logic:iterate id="item" name="itemList" scope="request">
      <tr>
         <td><bean:write name="item" property="num" /></td>
         <td><bean:write name="item" property="name" /></td>
         <td><bean:write name="item" property="price" />円</td>
         <td><bean:write name="item" property="catName" /></td>
         <td><bean:write name="item" property="image" /></td>
         <td><bean:write name="item" property="quantity" /></td>
       </tr>
   </logic:iterate>

のように、<bean:write>タグなどを使って、アクセスします。

ここで、bean:writeタグのname属性には、先ほどlogic:iterateタグのid属性で
指定した名前を指定します。
bean:writeタグについては、既に(vol.184で)説明しましたが、そのproperty属性
に指定した(beanの)プロパティーの値を取り出すことができます。
ここでは、"num"と"name"と"price"と"catName"と"image"と"quantity"が指定
されていますから、それぞれgetNum()、getName()、getPrice()、getCatNum()、
getImage()、getQuantity()メソッドが呼び出されて値が取り出されることになり
ます。



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


それでは、ここまで作成してきたファイルの動作をテストしたいのですが、
struts-config.xmlに登録されているファイルでまだ未作成のものが残って
いる状態なので、このままだと問題を起してしまいます。

そこで、残りのファイルについても、とりあえず雛型だけは作成しておきましょう。


では、ここで再度struts-config.xmlのエディターに戻って下さい。
そのフロー・エディターを開いて(下のほうにある「フロー」タブをクリックすると開く)
下さい。

/cartのアイコンに警告のマークが付いていましたね。

(1) この/cartのアイコンをダブル・クリックして下さい。

(2) 「Struts Action」ウインドウが開きますので、「完了」ボタンをクリックして
下さい。

すると、CartAction.javaのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。


再度struts-config.xmlのフロー・エディターに戻って下さい。

/cart.jspのアイコンに警告のマークが付いていましたね。

(1) この/cart.jspのアイコンをダブル・クリックして下さい。

(2) 「Struts JSPファイル」ウインドウが開きますので、「完了」ボタンをクリック
して下さい。

すると、cart.jspのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。


再度struts-config.xmlのフロー・エディターに戻って下さい。

/orderprocessのアイコンに警告のマークが付いていましたね。

(1) この/orderprocessのアイコンをダブル・クリックして下さい。

(2) 「Struts Action」ウインドウが開きますので、「完了」ボタンをクリックして
下さい。

すると、OrderProcessAction.javaのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。


再度struts-config.xmlのフロー・エディターに戻って下さい。

/order.jspのアイコンに警告のマークが付いていましたね。

(1) この/order.jspのアイコンをダブル・クリックして下さい。

(2) 「Struts JSPファイル」ウインドウが開きますので、「完了」ボタンをクリック
して下さい。

すると、order.jspのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。


再度struts-config.xmlのフロー・エディターに戻って下さい。

/confirmorderのアイコンに警告のマークが付いていましたね。

(1) この/confirmorderのアイコンをダブル・クリックして下さい。

(2) 「Struts Action」ウインドウが開きますので、「完了」ボタンをクリックして
下さい。

すると、ConfirmOrderAction.javaのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。


再度struts-config.xmlのフロー・エディターに戻って下さい。

/confirmOrder.jspのアイコンに警告のマークが付いていましたね。

(1) この/confirmOrder.jspのアイコンをダブル・クリックして下さい。

(2) 「Struts JSPファイル」ウインドウが開きますので、「完了」ボタンをクリック
して下さい。

すると、confirmOrder.jspのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。


再度struts-config.xmlのフロー・エディターに戻って下さい。

/completeorderのアイコンに警告のマークが付いていましたね。

(1) この/completeorderのアイコンをダブル・クリックして下さい。

(2) 「Struts Action」ウインドウが開きますので、「完了」ボタンをクリックして
下さい。

すると、CompleteOrderAction.javaのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。


再度struts-config.xmlのフロー・エディターに戻って下さい。

/completeOrder.jspのアイコンに警告のマークが付いていましたね。

(1) この/completeOrder.jspのアイコンをダブル・クリックして下さい。

(2) 「Struts JSPファイル」ウインドウが開きますので、「完了」ボタンをクリック
して下さい。

すると、completeOrder.jspのエディターが開きますね。
こここでは、まだ編集はしませんので、そのまま閉じておきましょう。



あと、雛型として提供されているvalidation.xmlファイルがエラーを含んだまま
になっているはずなので、修正しておきましょう。

(1) プロジェクト・エクスプローラー内のStrutsShop配下のWebContent配下の
WEB-INF配下のvalidation.xmlをダブル・クリックして開いて下さい。

(2) エラーになっている部分を削除して、下記のような内容に編集して
おきましょう。

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

<!--
     This is a minimal Validator form file with a couple of examples.
-->

    <global>

        <!-- An example global constant
        <constant>
            <constant-name>postalCode</constant-name>
            <constant-value>^\d{5}\d*$</constant-value>
        </constant>
        end example-->

    </global>

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



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


以上で必要なファイルはほとんど編集しましたが、データベース・アクセスに必要な
設定作業がまだ残っています。
それは、vol.139でお話したweb.xmlファイルやserver.xmlファイルへの設定作業です。


各ファイルへの記述内容については、以前(vol.139参照)既にお話して
いますので、今回は解説なしで設定作業だけを行います。


まず、web.xmlファイルへの設定を以下の手順で行いましょう。

(1) Eclipseのプロジェクト・エクスプローラーの中のStrutsShop配下の
WebContent配下のWEB-INF配下のweb.xmlをダブルクリックしてエディター
を開いて下さい。

(2) 最後の

</web-app>

という行の上に

--------------------------------------------------------
   <resource-ref>
     <description>
       Struts Shop Database
     </description>
     <res-ref-name>
       jdbc/STRUSHOP
     </res-ref-name>
     <res-type>
       javax.sql.DataSource
     </res-type>
     <res-auth>
       Container
     </res-auth>
   </resource-ref>
--------------------------------------------------------

というコードを挿入して下さい。(挿入位置を間違えないように
注意して下さい。位置を間違えると、WTPがエラーを返します
(赤いバッテンと赤い下線がつく)のでわかります。)

すると、web.xml全体としては下記のような内容になるはずです。

--------------------------------------------------------
<?xml version="1.0" encoding="Shift_JIS"?>

<!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>
  <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>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

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

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

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

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

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

  <!--
  <taglib>
    <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
    <taglib-location>/WEB-INF/c.tld</taglib-location>
  </taglib>

  <taglib>
    <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
    <taglib-location>/WEB-INF/fmt.tld</taglib-location>
  </taglib>

  <taglib>
    <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
    <taglib-location>/WEB-INF/sql.tld</taglib-location>
  </taglib>

  <taglib>
    <taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
    <taglib-location>/WEB-INF/x.tld</taglib-location>
  </taglib>
  -->

   <resource-ref>
     <description>
       Struts Shop Database
     </description>
     <res-ref-name>
       jdbc/STRUSHOP
     </res-ref-name>
     <res-type>
       javax.sql.DataSource
     </res-type>
     <res-auth>
       Container
     </res-auth>
   </resource-ref>

</web-app>
--------------------------------------------------------



次に、server.xmlファイルへの設定を以下の手順で行いましょう。

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

(2) 「Add and Remove」ウインドウにおいて、左側にあるStrutsShopを選択し、
「追加」ボタンをクリックします。
続いて「完了」ボタンをクリックします。

(3) Eclipseのプロジェクト・エクスプローラーの中のServersの配下の
「ローカル・ホストのTomcat v5.5サーバー-config」の配下のWEB-INF配下の
server.xmlをダブルクリックしてエディターを開いて下さい。

(4) server.xmlファイルの中の下のほうにある

   </Host>

の前に

<Context docBase="StrutsShop" path="/StrutsShop" reloadable="true" source="org.eclipse.jst.j2ee.server:StrutsShop"/>

というタグができているはずです。
これを、下記のような内容を書き換えます。(この同じ行に他の<Context ....>タグが
連なっているはずなので、ヘンな位置で区切らないように注意しながら、
</Host>の前で改行して、うまく挿入して下さい。)

--------------------------------------------------------
<Context docBase="StrutsShop" path="/StrutsShop" reloadable="true" source="org.eclipse.jst.j2ee.server:StrutsShop">
  <Resource name="jdbc/STRUSHOP" auth="Container"
    type="javax.sql.DataSource"
    driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://127.0.0.1:3306/STRUSHOP"
    username="root"
    password="rootpass"
    maxActive="10"
    maxIdle="30"
    maxWait="10000"
    defaultAutoCommit="false" />
</Context>
--------------------------------------------------------



(なお、編集したファイルを保管(保存)することについては、現在いちいち断って
いませんが、編集が終わったファイルは各自、自主的に保管して下さい。)


┌補足─────────────────────────┐
上記の設定方法は、接続プール(connection pool)をTomcatに
管理させるやり方ですが、Strutsを使用している場合には、
接続プール(connection pool)をStrutsに管理させるやり方も
あり、そのほうが、設定も若干簡単になります。この方法につ
いては、また後ほどお話いたします。
└───────────────────────────┘



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


ところで、上記の設定では、MySQLのドライバーを使用している訳ですが、
MySQLのドライバーのJARファイルをまだPleiades内のTomcatに組み込んで
いませんでした。

というわけで、C:\MySQL_Driverフォルダーに入っている
mysql-connector-java-5.0.8-bin.jarを

C:\pleiades\tomcat5.5\common\lib

にコピーして下さい。
(common\libフォルダーにコピーする意義について忘れた人はvol.172を参照のこと。)


同様に、C:\JavaWorkSpaceフォルダーに入っているlog4j-1.2.15.jarも、まだ
Tomcatのクラスパスに組み込んでいませんでしたので、ここで

C:\pleiades\tomcat5.5\common\lib

にコピーして下さい。
(混乱する人がいるので補足しておきますが、以前(vol.189で)StrutsShopプロ
ジェクトのクラスパスに登録したのはコンパイルのためのクラスパスであり、
実行時に参照されるクラスパス(Tomcatサーバー上でアプリケーションが実行され
るので、Tomcatのクラスパス)とは異なります。「ビルド・パス」という呼び方
がされるのはコンパイル時(すなわちbuildする時)に参照されるクラスパスだから
です。)



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


それから、Log4jのプロパティー・ファイルもまだ作成していませんでした。
これは、下記のフォルダー

C:\pleiades\tomcat5.5\common\classes

の中に作成します。つまり、

C:\pleiades\tomcat5.5\common\classes\log4j.properties

というファイルを作成します。このファイルの中身は下記のように
編集しておきましょう。

--------------------------------------------------------
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=*%-5p [%d] %c.%M: %m%n

# The following log is only for jp.co.flsi.lecture.struts.db package.
log4j.logger.jp.co.flsi.lecture.struts.db=DEBUG, B1
log4j.appender.B1=org.apache.log4j.FileAppender
log4j.appender.B1.file=logs/debugout.log
log4j.appender.B1.layout=org.apache.log4j.PatternLayout
log4j.appender.B1.layout.ConversionPattern=*%-5p [%d] %c.%M: %m%n
--------------------------------------------------------


なお、デフォルトでは、Eclipseのコンソール上にログが出力されます。



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


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

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

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

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

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

http://localhost:8080/StrutsShop/itemSelect.jsp

を入力しましょう。

┌補足─────────────────────────┐
ちなみに、もしプロジェクト・エクスプローラー内のStrutsShop
を右クリックし、「実行」→「サーバーで実行」を選択する
という方法で実行しようとすると、Webブラウザーが自動的に起動
した後、エラー(404)を返してきます。
(404は「要求された(Webページなどの)リソースが見つから
ない」というエラーです。)

これは、今回のアプリケーションでは、index.htmlやindex.jsp
(これらはURLに明示しないときのデフォルトのWebページ)を
用意していないからです。
└───────────────────────────┘


(3) 「キーワード」欄と「カテゴリー」欄にそれぞれ

001
食品

を入力して「商品検索」ボタンをクリックしましょう。
すると、ちゃんと、製品001のデータが返ってきますね。

あと、「キーワード」欄と「カテゴリー」欄にいろいろと考えられる
値を入力して試してみて下さい。

ちなみに、どちらも空っぽにして「商品検索」ボタンをクリックすると、
全商品のリストが返ってきますね。


Eclipseのコンソールに書かれたログも一緒に見てみて下さい。

Webページに入力したデータや返ってくるデータがちゃんとログにも記録されて
いますね。


では、最後に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) 2010 Future Lifestyle Inc. 不許無断複製