広告

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2011年03月09日

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

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


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


========================================================
◆ 01.Strutsのアプリケーション開発(プロジェクト:StrutsShop)
        --- Tiles ---
========================================================

ところで、現実の世界で使用するアプリケーションの場合は、こういった注文
を管理するシステムに誰もがアクセスできてしまっては困りますね。
こういったシステムへのアクセスには、ユーザー名とパスワードを入力させる
などの方法で、アクセス権限を持った人かどうかをチェックする必要があります。

しかし、ユーザー名とパスワードを入力させてチェックする方法は、
既にvol.201などで紹介済みですので、ここでは割愛します。
余裕のある人は、自由課題として自力で実装してみて下さい。



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

では続いて、配達状況を変更できるようにするためのコーディングを行って
おきましょう。

配達状況はhtml:selectタグを使ってリストから選択する形式にしたいと思い
ます。

html:selectタグを使った例は、vol.192でも出てきましたが、これはカテゴリー
の文字列データがデータベースに一元化して管理されている場合のやり方だった
ので今回は使えません。
今回は配達状況の文字列データをJSP内に直接書き込むやり方になりますので、
vol.197で出てきたhtml:selectタグの使い方と同様になります。
ただし、vol.197のときとは異なり、html:selectタグにはvalue属性は指定
しません。valueの値はデータベースから取得するので、html:selectタグ
に明示してはいけないのです。

では、orderDetail.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" %>

<table border="1" width="100%">
<tr>
  <td>
    <html:form method="POST" action="/orderstatuschange">
    <table border="0" width="100%">
    <tr>
      <td align="center">
       <b>注文の詳細</b>
      </td>
    </tr>
    <tr>
      <td>
        <br>
        <center>
          <table>
          <tr>
            <td>注文番号:</td>
            <td><bean:write name="ORDERSET" property="orderNumber"/></td>
          </tr>
          <tr>
            <td>注文日:</td>
            <td><bean:write name="ORDERSET" property="orderDate"/></td>
          </tr>
          <tr>
            <td>顧客番号:</td>
            <td><bean:write name="ORDERSET" property="userId"/></td>
          </tr>
          <tr>
            <td>支払い方法:</td>
            <td><bean:write name="ORDERSET" property="payMethodName"/></td>
          </tr>
          <tr>
            <td>支払い状況:</td>
            <td>
              <html:radio property="payment" value="true"/>支払い済み
              <html:radio property="payment" value="false"/>未払い
            </td>
          </tr>
          <tr>
            <td>配送状況:</td>
            <td>
               <html:select property="delivery" size="3">
                 <html:option value="0">未配達</html:option>
                 <html:option value="1">配達済み</html:option>
                 <html:option value="2">配達中</html:option>
               </html:select>
            </td>
          </tr>
          </table>
        </center>
      </td>
    </tr>
    </table>
    <center><html:submit property="submit" value="状況を変更する" /></center>
    </html:form>
  </td>
</tr>
</table>
--------------------------------------------------------

この中の

               <html:select property="delivery" size="3">
                 <html:option value="0">未配達</html:option>
                 <html:option value="1">配達済み</html:option>
                 <html:option value="2">配達中</html:option>
               </html:select>

の部分によって、配送状況の文字列データがリスト表示されるわけですが、
このWebページを表示したときには、データベースから読み取った配送状況の値
に応じて、これら「未配達」「配達済み」「配達中」のどれかの行を選択状態
にしておかなければなりません。

そのためには、OrderDetailFormの中で、データベースから読み取った値を
deliveryプロパティーに渡してやっておく必要があります。



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

というわけで、OrderDetailForm(jp.co.flsi.lecture.struts.tilesパッケージ
の中のOrderDetailForm.javaファイル)を下記のように編集しましょう。

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

import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import jp.co.flsi.lecture.struts.ItemSelectForm;
import jp.co.flsi.lecture.struts.db.Order;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class OrderDetailForm extends ActionForm {
   private static Logger logger = Logger.getLogger(ItemSelectForm.class);
   private boolean payment = false;
   private short delivery = 0;

   public void reset(ActionMapping mapping, HttpServletRequest request) {
      logger.info("Start ...............");
      try {
         request.setCharacterEncoding("UTF-8");
         HttpSession session = request.getSession();
         Order order = (Order)session.getAttribute("ORDERSET");
         if (order != null) {
            setPayment(order.isPayment());
            setDelivery(order.getDelivery());
         }
      } catch (UnsupportedEncodingException e) {
         logger.error(e, e);
      }
      finally {
         logger.info("End ...............");
      }
   }

   public void setPayment(boolean payment) {
      this.payment = payment;
   }

   public boolean isPayment() {
      return payment;
   }

   public void setDelivery(short delivery) {
      this.delivery = delivery;
   }

   public short getDelivery() {
      return delivery;
   }

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

このソース・コードによって、sessionオブジェクトの中から取り出されたorderの
deliveryプロパティーの値が、FORMのdeliveryプロパティーに設定されることに
なります。この値に応じて、先ほどのorderDetail.jspのhtml:optionタグのうち
該当するvalue値のものが選択状態になります。たとえば、deliveryプロパティー
の値が0であれば「未配達」が選択状態になります。



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

次に、orderDetail.jspのWebページにおいて、配送状況を変更(配送状況のリスト
の中で行をクリック)したときに、その変更内容を実際にデータベースに書き込む
ようにするために、Actionクラス(jp.co.flsi.lecture.struts.tilesパッケージ内
のOrderStatusChangeAction.java)を編集しておきましょう。

OrderStatusChangeAction.javaを下記のように編集してみて下さい。

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

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

import jp.co.flsi.lecture.reflect.ValueLogStringMaker;
import jp.co.flsi.lecture.struts.ItemListAction;
import jp.co.flsi.lecture.struts.db.Order;
import jp.co.flsi.lecture.struts.db.OrderDbManager;
import jp.co.flsi.lecture.struts.db.StruShopDbException;

import org.apache.log4j.Logger;
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 OrderStatusChangeAction extends Action {
   private static Logger logger = Logger.getLogger(ItemListAction.class);

   public ActionForward execute(ActionMapping mapping, ActionForm form,
         HttpServletRequest request, HttpServletResponse response) {
      String forward = "success";
      logger.info("Start ...............");
      ValueLogStringMaker stringMaker = new ValueLogStringMaker();
      logger.info("Method parameter: <<<<<" + stringMaker.getValues("mapping", mapping));
      logger.info(">>>>>");
      logger.info("Method parameter: <<<<<" + stringMaker.getValues("form", form));
      logger.info(">>>>>");
      logger.info("Method parameter: <<<<<" + stringMaker.getValues("request", request));
      logger.info(">>>>>");
      logger.info("Method parameter: <<<<<" + stringMaker.getValues("response", response));
      logger.info(">>>>>");
      OrderDetailForm orderDetailForm = (OrderDetailForm) form;
      OrderDbManager orderDbManager = new OrderDbManager();
      HttpSession session = request.getSession();
      Order order = (Order)session.getAttribute("ORDERSET");
      order.setPayment(orderDetailForm.isPayment());
      order.setDelivery(orderDetailForm.getDelivery());
      try {
         orderDbManager.connect();
         orderDbManager.updateOrderStatus(order);
      } catch (StruShopDbException e) {
         logger.error(e, e);
         forward = "systemerror";
      }
      catch (Throwable e) {
         logger.error(e, e);
         forward = "systemerror";
      }
      finally {
         try {
            orderDbManager.disconnect();
         }
         catch (Exception e) {
            logger.info("Disconnect failed or there is no connection.");
         }
         logger.info("End ...............");
      }
      logger.info("Method return: <<<<< " + forward);
      logger.info(">>>>>");
      return mapping.findForward(forward);
   }

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

変更したことは、

      order.setDelivery(orderDetailForm.getDelivery());

という行を追加したことだけですね。



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

この段階で、一度、動作確認をしてみましょう。

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

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

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

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

http://localhost:8080/StrutsShop/tiles-parts/index.jsp

または、

http://localhost:8080/StrutsShop/tiles-parts/

を入力しましょう。

(3) 注文のリストが表示されますので、その中のどれかの注文番号(たとえば 1)を
クリックしましょう。

(4) 注文の詳細のWebページが開いたら、「配送状況」を変更してみましょう。
現在は「未配達」のほうが選択された状態になっているでしょうから、「配達済み」
のほうに選択を変更(クリック)してみて下さい。そして、「状況を変更する」ボタン
をクリックします。

そうすると、注文のリストに戻りますが、今度は先ほどの注文の「配送状況」が
「配達済み」のほうに変わっていますね。

これでOKです。



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


(次回に続く)



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