■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2008年01月06日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.086

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


[このメールマガジンは、画面を最大化して見てください。]


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


では、前回作成したJSP(customerList.jsp)のソース・コード
の解説をしておきましょう。

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

<HTML>
<HEAD>
<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>
    </TR>

<%@ page import="java.util.Vector" %>
<%@ page import="jp.co.flsi.lecture.webapp.entity.*" %>
<jsp:useBean class="jp.co.flsi.lecture.webapp.db.CustomerDbManager" id="CUSTOMERDB" scope="request" />
<%      Customer  aCustomer;
       Vector<Customer> customerList = CUSTOMERDB.getCustomerList();
      for (int i = 0; i < customerList.size(); i++) {
         aCustomer = customerList.elementAt(i); %>
          <TR>
            <TD><%= aCustomer.getNum() %></TD>
            <TD><%= aCustomer.getName() %></TD>
            <TD><%= aCustomer.getZipCode() %></TD>
            <TD><%= aCustomer.getAddress() %></TD>
          </TR>
<%      } %>

  </TBODY>
</TABLE>

</BODY>
</HTML>
--------------------------------------------------------


新しく出てきたコードだけを説明します。

まず、1行目の
--------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="Shift_JIS" %>
--------------------------------------------------------
ですが、
<%@
で始まる文はJSPのディレクティブ(directive)と呼ばれ、Webコンテナー
(JSPコンテナー)への命令を表します。つまり、ここではTomcatへの
命令を意味します。そして、そのうち
<%@ page
で始まる文はJSPの個々のページに対して指定する命令を記述します。
(つまり、この文がはいっているJSPファイルで生成しようとしている
Webページにだけ影響する命令であり、他のJSPファイルのページには
影響がありません。)

ここでは、language="java"によって、使用する言語をJavaに指定し
(といっても現時点ではJavaしかないから、この属性は指定しなくても
同じなのだが)、contentType="text/html; charset=UTF-8"によって、
出力する文書の種類を指定しています。

contentType="text/html; charset=UTF-8"は、HttpServletResponseの
setContentType()メソッド(vol.074のサーブレットの中で使っている
ので、忘れた人は復習してください)に相当するもので、ここではこの
JSPが出力するHTMLのエンコーディングをUTF-8に指定しています
(Webコンテナーに指示しています)。

そして、pageEncoding="Shift_JIS"は、このJSPのファイルを記述して
いる文字コードのエンコーディングがShift_JISであることをWebコンテ
ナーに知らせています。

┌注意─────────────────────────┐
 上記のlanguage属性の値としての"java"はすべて小文字で書く
 決まりになっていますので、"Java"というように頭文字を大文字
 にしたりしないように注意してください。
└───────────────────────────┘

そうすると、ページ・コンパイルのときには、このファイルはShift_JIS
として読み込まれた後、Javaのプログラムに変換され(もちろんJavaの
内部コードはUnicodeなのでUnicodeに変換される)、そのプログラムの
中のHTMLを出力する部分はUTF-8のエンコーディングで書かれることに
なります。

要するに、この指定では、JSPのファイルの読み込みのときはShift_JIS
だが、HTMLの出力はUTF-8のエンコーディングで行われるわけです。


次に
--------------------------------------------------------
<%@ page import="java.util.Vector" %>
<%@ page import="jp.co.flsi.lecture.webapp.entity.*" %>
--------------------------------------------------------
の部分ですが、これらはJavaのimport文を表します。

つまり、Javaの通常の文で
--------------------------------------------------------
import java.util.Vector;
import jp.co.flsi.lecture.webapp.entity.*;
--------------------------------------------------------
と記述するのに相当します。
なお、JSPでは、java.lang.*のほかにjavax.servlet.*、
javax.servlet.jsp.*およびjavax.servlet.http.*も暗黙にimportされ
ていますので、JSPファイルの中では明示的にimportする必要はありま
せん。


続いて、<TABLE border="1" width="100%">から</TABLE>までの部分に
ついて説明します。
これは、表を描くためのコードであり、通常のHTMLであれば、たとえば

--------------------------------------------------------
<TABLE border="1" width="100%">
  <TBODY>
    <TR>
      <TH>顧客番号</TH>
      <TH>氏名</TH>
      <TH>郵便番号</TH>
      <TH>住所</TH>
    </TR>
    <TR>
      <TD>T0001</TD>
      <TD>試験太郎</TD>
      <TD>111-1111</TD>
      <TD>某県某市某町1-1-1</TD>
    </TR>
    <TR>
      <TD>T0002</TD>
      <TD>試験花子</TD>
      <TD>112-1112</TD>
      <TD>なんとか県なんとか市なんとか町1-2-3</TD>
    </TR>
    <TR>
      <TD>T0003</TD>
      <TD>試験次郎</TD>
      <TD>113-1113</TD>
      <TD>ほにゃら県ほにゃら市ほにゃら町4-5-6</TD>
    </TR>
  </TBODY>
</TABLE>
--------------------------------------------------------

というふうに書けば

顧客番号 氏名 郵便番号 住所
T0001 試験太郎 111-1111 某県某市某町1-1-1
T0002 試験花子 112-1112 なんとか県なんとか市なんとか町1-2-3
T0003 試験次郎 113-1113 ほにゃら県ほにゃら市ほにゃら町4-5-6

というデータが表形式で表示されます。

では、この表の要素を一つずつ解説していきましょう。
まず、
--------------------------------------------------------
<TABLE border="1" width="100%">
   ...................
   ...................
</TABLE>
--------------------------------------------------------
のように<TABLE ...>と</TABLE>で囲まれた部分が表を記述する部分で、
その中の
--------------------------------------------------------
<TBODY>
   ...................
   ...................
</TBODY>
--------------------------------------------------------
のように<TBODY>と</TBODY>で囲まれた部分が表の本体(body)部分を
表します。

なお、<TBODY>...</TBODY>と並んで使用されるタグとして
<THEAD>...</THEAD>と<TFOOT>...</TFOOT>もあり、それぞれ表の
ヘッダー部分とフッター部分を記述するために使いますが、
上記のJSPファイルの中では使っていません。
もし、これらのタグも使った場合は、
--------------------------------------------------------
<TABLE border="1" width="100%">
   <THEAD>
      ...................
      ...................
   </THEAD>
   <TBODY>
      ...................
      ...................
   </TBODY>
   <TFOOT>
      ...................
      ...................
   </TFOOT>
</TABLE>
--------------------------------------------------------
というような書き方になります。(なお、字下げは見やすくするため
のものであり、機能上は字下げしてもしなくても同じです。)

また、<TABLE>タグに指定したborder属性は、表の外枠の線の太さを
意味します(borderを直訳すと境界線の意味になる)。
また、width属性は表全体の幅の大きさを意味し、ここで指定してい
る100%というのは、Webブラウザーの幅に合わせて、目いっぱい(つ
まり100%)の幅に広げることを意味します。
したがって、Webブラウザーの幅を広げるとそれに合わせて表の幅も
広がり、Webブラウザーの幅をせばめるとそれに合わせて表の幅もせば
まります。


続いて<TBODY>...</TBODY>の中には複数の行(もしくは単数の行)を
記述していくのですが、行(Row)は
--------------------------------------------------------
<TR>
   ...................
   ...................
</TR>
--------------------------------------------------------
のように<TR>と</TR>で囲むことで表現します。
(TRのTはTable、RはRowを意味します。)

そして行の中には複数の列(または単数の列)のデータが入るわけ
ですが、このデータ(Data)は
--------------------------------------------------------
<TD>.....データ.....</TD>
--------------------------------------------------------
のように<TD>と</TD>で囲むことで表現します。
(TDのDはDataを意味します。)

そして、一つの行の中に複数の列のデータがあるときには、
--------------------------------------------------------
<TR>
   <TD>.....データ1.....</TD>
   <TD>.....データ2.....</TD>
   <TD>.....データ3.....</TD>
</TR>
--------------------------------------------------------
のような表現になります。

また、複数の行があるときには
--------------------------------------------------------
<TR>
   <TD>.....データ1.....</TD>
   <TD>.....データ2.....</TD>
   <TD>.....データ3.....</TD>
</TR>
<TR>
   <TD>.....データ1'.....</TD>
   <TD>.....データ2'.....</TD>
   <TD>.....データ3'.....</TD>
</TR>
<TR>
   <TD>.....データ1".....</TD>
   <TD>.....データ2".....</TD>
   <TD>.....データ3".....</TD>
</TR>
--------------------------------------------------------
というような表現になります。

また、通常は、一行目に見出しを入れることが多いですが、
見出し(Heading)は<TD>...</TD>の代わりに<TH>...</TH>と
書くことによって表現されます。
(THのHはHeadingを意味します。)
見出しは通常、太字で表現されますが、実際の表現の仕方は
Webブラウザーに依存します。

というわけで、
--------------------------------------------------------
<TABLE border="1" width="100%">
  <TBODY>
    <TR>
      <TH>顧客番号</TH>
      <TH>氏名</TH>
      <TH>郵便番号</TH>
      <TH>住所</TH>
    </TR>
    <TR>
      <TD>T0001</TD>
      <TD>試験太郎</TD>
      <TD>111-1111</TD>
      <TD>某県某市某町1-1-1</TD>
    </TR>
    <TR>
      <TD>T0002</TD>
      <TD>試験花子</TD>
      <TD>112-1112</TD>
      <TD>なんとか県なんとか市なんとか町1-2-3</TD>
    </TR>
    <TR>
      <TD>T0003</TD>
      <TD>試験次郎</TD>
      <TD>113-1113</TD>
      <TD>ほにゃら県ほにゃら市ほにゃら町4-5-6</TD>
    </TR>
  </TBODY>
</TABLE>
--------------------------------------------------------
というふうに書くと、

顧客番号 氏名 郵便番号 住所
T0001 試験太郎 111-1111 某県某市某町1-1-1
T0002 試験花子 112-1112 なんとか県なんとか市なんとか町1-2-3
T0003 試験次郎 113-1113 ほにゃら県ほにゃら市ほにゃら町4-5-6

というデータが表形式で表示され、1行目の顧客番号から住所まで
が見出しになるのです。



ところで、customerList.jspの中では、実際の表のデータとしては
Javaのコードで取り出した値を使っていますね。たとえば、
--------------------------------------------------------
<TD><%= aCustomer.getNum() %></TD>
--------------------------------------------------------
というコードによって顧客番号の値を取り出して表のデータにして
います。
<%=と%>ではさんだコードがどういう意味をもつのかは、vol.076
で説明しましたね。

また、複数行のデータを得るために、Javaのforループを使って、
--------------------------------------------------------
<TR>
   <TD><%= aCustomer.getNum() %></TD>
   <TD><%= aCustomer.getName() %></TD>
   <TD><%= aCustomer.getZipCode() %></TD>
   <TD><%= aCustomer.getAddress() %></TD>
</TR>
--------------------------------------------------------
の部分を複数回出力させるようにしていますね。
このとき、Javaの通常のコードを<%と%>で囲んでいることに注意
してください。
<%と%>で囲めば、Javaの通常のコードを書けることは、vol.076で
説明した通りです。

それから、jsp:useBeanというタグについては、vol.078で説明しま
したね。忘れた人は、復習してください。


以上で、customerList.jspのソース・コードはすべて解読?できる
ようになったはずです。


なお、JSPの詳細を独力で学びたい人は、下記URLから仕様書
(Specification)をダウンロードして読んでみください。

http://jcp.org/aboutJava/communityprocess/final/jsr245/index.html




では次に、商品のリストをWebブラウザーに表示するアプリケーション
を作ってみましょう。

前回作成した顧客のリストをWebブラウザーに表示するアプリケーション
と仕組みはほぼ同様ですが、主な違いは、商品のリストには画像も表示
するという点です。
また、今度は、カテゴリーやキーワードで検索(商品の絞込み)ができる
ようにします。
(ちなみに、前回のような顧客リストのアプリケーションはあくまで学習用
に作成したものであり、実際のWebアプリケーションでは使用されません。
顧客情報を処理するための実用的なアプリケーションについては、のちに
セキュリティーのお話をするときに説明いたします。)


なお、ここで使用する画像ファイルは、ホームページからダウンロード
できるようにしておきますので、ご利用ください。
ただし、現実の商品の写真を使おうとすると、法的な問題にひっかかって
しまうので、他のテスト用の画像ファイルで代用しています。
あるいは、読者が独自に作成した画像ファイルを使用してもかまいません。


さて、画像データはデータベースの中に保管することもできる(BLOBという
型を使用する)のですが、ちょっと扱いが面倒なので、通常は、別の場所
に画像ファイルとして保管しておいて、データベースにはその保管場所
(ファイル名など)を書き込んでおく、というやり方をします。


では、商品のリストをWebブラウザーに表示するアプリケーションを作っ
ていきましょう。


まず最初に、Customerクラスのときと同様にして、下記のようなItemクラス
を作成しましょう。

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

public class Item {
   private String num;
   private String name;
   private int price;
   private String image;
   private String category;
   private int quantity;
  
   public void setNum(String num) {
      this.num = num;
   }
  
   public String getNum() {
      return num;
   }
  
   public void setName(String name) {
      this.name = name;
   }
  
   public String getName() {
      return name;
   }
  
   public void setPrice(int price) {
      this.price = price;
   }
  
   public int getPrice() {
      return price;
   }
  
   public void setImage(String image) {
      this.image = image;
   }
  
   public String getImage() {
      return image;
   }
  
   public void setCategory(String category) {
      this.category = category;
   }
  
   public String getCategory() {
      return category;
   }
  
   public void setQuantity(int quantity) {
      this.quantity = quantity;
   }
  
   public int getQuantity() {
      return quantity;
   }
  
}
--------------------------------------------------------


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


(次回に続く)


何か、わからないところがありましたら、下記のWebページまで質問を
お寄せください。



========================================================
◆ 02.演習問題
================================================

上のcustomerList.jspのソース・コードのうち、

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

を、

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

に書き換えると、どうなるか確認してください。
(Webブラウザーでエンコーディングを確認してください。たとえば、
Internet Explorerなら、メニュー・バーの「表示」→「エンコード」
を選択することによって、どのエンコーディングが選ばれているかを
確認します。)



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