■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2009年11月01日

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

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


-------------------------------------------------------
・このメールマガジンは、画面を最大化して見てください。
小さな画面で見ていると、不適切な位置で行が切れてしまう
など、問題を起すことがあります。
・このメールマガジンに掲載されているソース・コード及び
文章は特に断らない限り、すべて筆者が著作権を所有してい
ます。また、これらのソース・コードは学習用のためだけに
提供しているものです。
-------------------------------------------------------


========================================================
◆ 01.SOAPのアプリケーション(Webサービス)
========================================================


では、次に予約ボタン(「選択した部屋を予約する」というボタン)をクリック
した後の動作を処理するサーブレット(HotelServlet.java)を作成しましょう。

(1) Eclipseのパッケージ・エクスプローラーの中のJStudyRshaSoapClientの中の
WEB-INF/srcの中のjp.co.flsi.lecture.webapp.servletを右クリックし、
「新規」→「クラス」を選択します。

(2) 「名前」に
HotelServlet
と入力し、「スーパークラス」に
javax.servlet.http.HttpServlet
と入力し、「終了」ボタンをクリックします。

(3) HotelServletのエディターが開いたら、下記のようなソース・コード
に編集します。

--------------------------------------------------------
package jp.co.flsi.lecture.webapp.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.rpc.ServiceException;

import org.apache.log4j.Logger;

import jp.co.flsi.lecture.webapp.bean.HotelBean;

public class HotelServlet extends HttpServlet {

   private static Logger logger = Logger.getLogger(TravelSearchServlet.class);

   public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
      req.setCharacterEncoding("UTF-8");
      HttpSession session = req.getSession();
      String startYYYY = (String)session.getAttribute("STARTYYYY");
      String startMM = (String)session.getAttribute("STARTMM");
      String startDD = (String)session.getAttribute("STARTDD");
      String startDate = startYYYY + startMM + startDD;
      String days = (String)session.getAttribute("DAYS");
      int numOfNights = Integer.parseInt(days) - 1;
      String strNumOfLodgers = (String)session.getAttribute("NUMOFLODGER");
      int numOfLodgers = Integer.parseInt(strNumOfLodgers);
      String name = null;
      String address = null;
      String telNo = null;
      int roomNum = -1;
      boolean reserveResult = false;
      Enumeration paramNames = req.getParameterNames();
      while(paramNames.hasMoreElements()) {
         String aParamName = (String)paramNames.nextElement();
         if (!aParamName.equals("putIntoCart")) {
            if (aParamName.equals("reserveName")) {
               name = req.getParameter(aParamName);
            }
            else if (aParamName.equals("reserveAddress")) {
               address = req.getParameter(aParamName);
            }
            else if (aParamName.equals("reserveTel")) {
               telNo = req.getParameter(aParamName);
            }
            else {
               roomNum = Integer.parseInt(aParamName);
            }
         }
      }
      HotelBean hotel = new HotelBean();
      try {
         reserveResult = hotel.reserveHotel(roomNum, startDate, numOfNights, numOfLodgers, name, address, telNo);
      } catch (ServiceException e) {
         logger.error(e, e);
      }
      String result = "予約できませんでした。";
      if (reserveResult) result = "予約が完了しました。";
      session.setAttribute("RESULT", result);
      session.setAttribute("ROOMNUM", Integer.toString(roomNum));
      session.setAttribute("STAYDAYS", Integer.toString(numOfNights));
      session.setAttribute("NAME", name);
      session.setAttribute("ADDRESS", address);
      session.setAttribute("TELNO", telNo);
      getServletContext().getRequestDispatcher("/reserveresult.jsp").forward(req,res);
   }

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


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



サーブレット(TravelSearchServlet)を作成したので、これをweb.xmlファイル
(vol.072参照)に登録する必要があります。

そのためには、

(1)パッケージ・エクスプローラーのJStudyRshaSoapClientの中のWEB-INFの中の
web.xmlを、次のようにソース・コードを編集してみてください。

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

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

    <servlet>
        <servlet-name>TravelSearchServlet</servlet-name>
        <servlet-class>jp.co.flsi.lecture.webapp.servlet.TravelSearchServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>HotelServlet</servlet-name>
        <servlet-class>jp.co.flsi.lecture.webapp.servlet.HotelServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>TravelSearchServlet</servlet-name>
        <url-pattern>/servlet/travelsearch</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>HotelServlet</servlet-name>
        <url-pattern>/servlet/orderhotel</url-pattern>
    </servlet-mapping>
   
</web-app>
--------------------------------------------------------

前回のweb.xmlからどこが変わった(追加された)か分かりますね。



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


では続いて、reserveresult.jspを作成しましょう。

(1) Eclipseのパッケージ・エクスプローラーの中のJStudyRshaSoapClientを右クリックし、
「新規」→「ファイル」を選択します。

(2) 「名前」に
reserveresult.jsp
を入力し、「終了」ボタンをクリックします。

(3) reserveresult.jspのエディターが開いたら、下記のようなソース・コードに
編集します。

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

<%@page import="java.util.Date"%>
<%@page import="java.text.DateFormat"%>
<%@page import="java.text.SimpleDateFormat"%>
<HTML>
<HEAD>
<TITLE>ホテル予約結果</TITLE>
</HEAD>
<BODY bgcolor="#77ffff" text="#fa5a00">
<H1>予約情報</H1>
<BR>
<jsp:useBean class="java.lang.String" id="STARTYYYY" scope="session" />
<jsp:useBean class="java.lang.String" id="STARTMM" scope="session" />
<jsp:useBean class="java.lang.String" id="STARTDD" scope="session" />
<jsp:useBean class="java.lang.String" id="STAYDAYS" scope="session" />
<jsp:useBean class="java.lang.String" id="NUMOFLODGER" scope="session" />
<jsp:useBean class="java.lang.String" id="ROOMNUM" scope="session" />
<jsp:useBean class="java.lang.String" id="NAME" scope="session" />
<jsp:useBean class="java.lang.String" id="ADDRESS" scope="session" />
<jsp:useBean class="java.lang.String" id="TELNO" scope="session" />
<jsp:useBean class="java.lang.String" id="RESULT" scope="session" />
ドコニデモアリソナホテル <%= ROOMNUM %>号室
<BR>
<BR>
宿泊期間:<%= STARTYYYY %>年<%= STARTMM %>月<%= STARTDD %>日から<%= STAYDAYS %>泊
<BR>
宿泊者数:<%= NUMOFLODGER %>名
<BR>
予約者芳名:<%= NAME %> 様
<BR>
予約者住所:<%= ADDRESS %>
<BR>
予約者電話番号:<%= TELNO %>
<BR>
<BR>
<% Date today = new Date();
   DateFormat format = new SimpleDateFormat("yyyy年MM月dd日HH時mm分");
   String stringToday = format.format(today); %>
予約日時:<%= stringToday %>
<BR>
予約結果:<%= RESULT %>
<BR>
</BODY>
</HTML>
--------------------------------------------------------

なお、上の予約日時の出力をする部分(SimpleDateFormatを使っている部分)は、
vol.077で登場したものと同様のパターンなので、忘れた人はvol.077付近を復習
して下さい。



では、再度デプロイをしましょう。
前回と同様にしてWARファイルを生成し、Tomcatのwebappsディレクトリー配下に置き
(前回置いたファイルを置き換え)ます。



では、Tomcatを起動した後、動作をテストをしてみましょう。
(予めLinuxのPCを起動して、Axisが稼動状態になっていることが前提です。)

(1) Webブラウザーを起動し、下記URLを入力してください。
http://localhost:8080/JStudyRshaSoapClient/travel.html

(2) 旅行日数を3に、旅行者人数を2にして(他にも変更したい項目があれば変更して)、
「送信」ボタンをクリックします。

(3) 検索結果のホテルのリスト)が返ってきたら、予約したい部屋の選択欄をクリック
することによってチェックマークを入れ、予約者芳名(漢字で入力)と予約者住所(同じ
く漢字を含めて入力)と予約者電話番号を入力し、予約ボタン(「選択した部屋を予約
する」というボタン)をクリックします。
(ちなみに「交通機関を予約する」というボタンは単なるダミー(見せかけ)のボタン
なのでクリックしないで下さい。)

(4) 予約情報のページが返って来るので、内容を確認します。

(大きく手抜きをしていますから、予約ボタンをクリックすると、確認のページも
表示せずにいきなり「予約が完了しました」というページが返って来ますが、現実
のアプリケーションであれば、間に一度確認のページを入れるところです。)



念のため、LinuxのPCのデータベース上に予約のデータが書き込まれていることを
確認してみましょう。

Tera TermでLinuxのPCのuser01にログインし、

su -

でスーパー・ユーザー(root)になって下さい。

では、MySQLのクライアント・プログラムを起動しましょう。

mysql --user=root --password=rootpass hoteldb

と入力します。そうすると

mysql>

というプロンプトが表示されますね。
ここで、以下のように入力することによってhoteldbデータベースに含まれる
テーブルをリストしてみましょう。

show tables;

これで、3つのテーブル(bookingテーブルとroombookテーブルとroominfoテーブル)
がリストされますね。

このうち、bookingテーブルの中のデータを見てみることにしましょう。

その前に、このLinuxのデフォルトの文字コードはUTF-8でしたが、データベースの
文字コードはShift-JISにしてありましたから、そのままデータを画面上に表示する
と文字化けしてしまいます。そこで、データベースのデータを画面に表示するときに
それをUTF-8に変換してもらうように、MySQLのクライアントに文字コードを設定して
おく必要があります。そこで、

SET CHARACTER SET utf8;

というように入力します。こうすれば、データを画面に表示する際に、データベース
の文字コード(Shift-JIS)からUTF-8に変換してから表示してくれます。

では、bookingテーブルの中身をすべて表示してみましょう。

select * from booking;

と入力します。

あらあら、先ほどホテルの部屋の予約の操作をしたときに書き込まれたと思われる
行が文字化けしていますね。

何かMySQLの文字コードの設定関係でやり残していたことがあるようです。

そこで思い出すのが、vol.084でMySQLのmy.iniファイルに指定したのと同じ

default-character-set=sjis

の指定をこのLinuxのMySQLに対しては行っていなかったということです。
(この指定があると、データをMySQLサーバーに読み込んだときにShift-JISに変換
してくれます。デフォルトのままだとlatin1になっており、漢字の文字コードの
変換は行われません。)

では、この指定を行っておきましょう。
ここで、

quit

と入力することによって、MySQLのクライアント・プログラムから抜けて
おいて下さい。

そして、/etc/my.cnfファイル(vol.172参照)を編集

vi /etc/my.cnf

して、その中の

[mysqld]

という行の下に

default-character-set=sjis

という行を追加し、このファイルを保管して閉じて下さい。

そして、MySQLサーバー(デーモン)を再起動しておきましょう。

service mysqld restart

と入力します。


では、もう一度、ホテルの部屋の予約を(別の部屋番号で)してから、bookingテーブル
の中身を見てみて下さい。
今度の予約のデータは文字化けしないですね。
めでたしめでたし。



以上で、Webサービスのお話は、いったん終わりにします。
(なお、後ほど、上級コースとして、さらに高度なWebサービスのお話が登場します。
お楽しみに。)



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



(次回に続く)


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



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