• 検索結果がありません。

サーブレットの活用事例 ある飲食チェーン店の例 条件 全国の店舗や取引先のパソコンに特別なソフトをインストールすることはできない 全国の店舗や取引先に特別な教育をすることはできない 本部側で対応できる仕組み として JAVA サーブレットを採用 1

N/A
N/A
Protected

Academic year: 2021

シェア "サーブレットの活用事例 ある飲食チェーン店の例 条件 全国の店舗や取引先のパソコンに特別なソフトをインストールすることはできない 全国の店舗や取引先に特別な教育をすることはできない 本部側で対応できる仕組み として JAVA サーブレットを採用 1"

Copied!
174
0
0

読み込み中.... (全文を見る)

全文

(1)

JAVA サーブレット

(2)

1

サーブレットの活用事例

【ある飲食チェーン店の例】

【条件】 全国の店舗や取引先のパソコンに特別なソフトをインストールすることはできない 全国の店舗や取引先に特別な教育をすることはできない 「本部側で対応できる仕組み」としてJAVA サーブレットを採用

(3)
(4)

3

【ショッピングサイト】

1.インターネット利用による市場の変化 今までの死に筋を積み上げれば・・・ 一定以上のシェアや規模(アクセス数)がないと商売が成り立たない。 口コミ情報 ユーザがつい書き込みしたくなるような魅力的なサイト構成

(5)

4

HTML によるホームページの閲覧

インターネットでホームページを閲覧するには、ホームページのアドレスを指定して、 該当するファイルを受信し、これをブラウザで解析して自分の画面に表示する、という手 順をふみます。この手順を司るソフトウェアをWeb サーバと言います。 インターネットでは、初期の頃から、HTML で記述されたファイルが使われてきました。 <HTML> <HEAD> <TITLE>名前</TITLE> </HEAD> <BODY> 私の名前は○○です。<BR>どうぞよろしく </BODY> </HTML> サーバ クライアント index.html next.html ページの要求 http://www.page.wo.mitai.co.jp/index.html 応答:ファイルが送信される W eb サ ー バ

(6)

5

サーバサイドプログラミング

HTML は、決まった内容の情報しか表示することができません。そこで、サーバ側に、状 況に応じて、HTML を自動生成するプログラムを用意しました。そのときの環境やデータに よって、異なった HTML を作成することができるのです。このようなプログラムをサーバサ イドプログラミングと言います。 クライアントで受け取るのは、従来と同じ HTML ですから、サーバ側で行われていること を、知るよしもありません。普通のブラウザで表示することができます。データ処理のす べてをサーバ側が引き受けているので、改版が必要なときは、サーバ側だけを修正すれば よいのです。また、クライアント側に特別なソフトやハードウエアを用意する必要がない、 ということは、保守・運用の点で大きなメリットとなります。 クライアント側に送られてくるのは普通の HTML。しかし状況に応じて変化します <HTML> <HEAD> <TITLE>名前</TITLE> </HEAD> <BODY> 私の名前は○○です。<BR>どうぞよろしく </BODY> </HTML> サーバ クライアント HTML ページの要求 http://www.page.wo.mitai.co.jp/waiwai.php 応答:作成されたファイルが送信される プログラム 作成 W eb サ ー バ

(7)

6

web データベースシステム

データの保存場所としてデータベースを利用したものを web データベースシステムと言 います。 本講座で利用する MySQL は、オープンソースのリレーショナルデータベース管理システム (RDBMS)です。無料でダウンロードして利用することができるマルチスレッド、マルチユ ーザのデータベースサーバです。無料でありながら、堅牢で処理速度が速く、アメリカの Yahoo ファイナンスや NASA をはじめ世界的に多くの企業で利用されています。 データベースサーバとは、データベースを利用したいプログラムからの要求に対して応答 するデータベースシステムです。データベースに対する要求は SQL と呼ばれる言語で行い ます。 クライアント側に送られてくるのは、やっぱり普通の HTML。しかしデータに応じて変化し ます <HTML> <HEAD> <TITLE>名前</TITLE> </HEAD> <BODY> 私の名前は○○です。<BR>どうぞよろしく </BODY> </HTML> サーバ クライアント HTML ページの要求 http://www.page.wo.mitai.co.jp/waiwai.php 応答:作成されたファイルが送信される 作成 W eb サ ー バ プログラム データベース SQL の発行 要求に応じたデータ

(8)

7

サーブレット・JSP・JavaBeans

サーバーサイドプログラミングを JAVA で記述したものをサーブレットと言います。サー ブレットは、スレッドで動作しますので、複数のクライアントが同じページを要求しても、 一度しかプログラムはロードされません。クライアントごとにスレッドが生成されます。 サーブレットは、CGI と同様、データの処理を行った結果に基づいて、HTML を作成する のが目的です。そこで、簡単に HTML を生成することのできる言語、JSP(Java Server Pages) が開発されました。JSPは、HTML の記述の中に、Javaの命令を埋め込んだ、そんな イメージの言語です。 また、「データ」をオブジェクト化するために設計した Java のクラスを JavaBeans と言 います。JavaBeans は、「コーヒー豆」の名前のとおり、サーバーアプリケーションにとっ ての重要な小さな部品です。そして、JavaBeans は、データを扱いますので、その後ろのデ ータベースとの連携も重要です。 このように、サーバサイドアプリケーションは、サーブレットと JSP、それに JavaBeans の絶妙な連携で実現されるのです。

(9)
(10)

9

簡単な Web サーバを作ってみよう

【通信するには】 複数のコンピュータが接続されているネットワーク環境で、コンピュータ同士がデータの やり取りをするには、お互いに送受信の手順を約束しておかなければなりません。この約 束をプロトコルと言います。インターネットでは、TCP/IP プロトコルが使用されています。

IP アドレスとポート番号

TCP/IP では、IP アドレスで、コンピュータを識別します。が、それだけでは、1 台のコ ンピュータで1つの接続しかできませんので、ポートという考え方が導入されています。 ポートは、論理的な入口に付けられた 1 番から65535番までの番号で、実際にこれだ けの数のハードウエアが装備されているわけではありません。ソフトスイッチのようなも のです。TCP/IP プロトコルでは、IP アドレスとポート番号の組を指定して通信を行います。

ソケット

TCP/IP プロトコルに沿って通信するプログラムを書くためには、TCP/IP の規約の詳細を 知らなければなりません。これらの規則を包含したアプリケーションプログラムのことを ソケットと言います。ソケットを使うと、詳細を気にすることなく、あたかもファイルと の入出力と同じ感覚でプログラムを書くことができます。つまり、ソケットを使って、2 台 のコンピュータの間にストリームを確立するのです。

Java では、ソケットとして Socket クラスと ServerSocket クラスが用意されています。 クライアント側の Socket からの接続要求を、サーバ側の ServerSocket が常に監視し、両 者が接続したとき、そこにストリームを確立して、データの送受信をすることができます。

(11)

10 ソケットを使って 2 台のコンピュータを接続するプログラムを作りましょう。片方をサー バ、他方をクライアントとします。 (1) サーバ側 ServerSocket クラスのオブジェクトをインスタンス化してサーバをスタートさせます。 このとき、サーバが使用するポート番号を指定します。

sSock = new ServerSocket(ポート番号);

accept メソッドで、クライアントからの接続要求を待ちます。受信すると、Socket クラ スのオブジェクトを受け取ります。

sock = sSock.accept();

受けとった Socket クラスのオブジェクトを調べることにより、接続を要求してきたク ライアントの IP アドレスを知ることができます。

InetAddress sockIP = sock.getInetAddress();

(2) クライアント側

Socket クラスのオブジェクトをインスタンス化することにより、サーバに接続要求を出 します。このとき、要求先のマシンのホスト名または IP アドレスとポート番号を指定しま す。

sock = new Socket(“サーバ名”,ポート番号); 接続を終了するときは、ソケットをクローズします。

sock.close();

このプログラムでは、ホスト名(または IP アドレス)とポート番号はプログラム起動時に コマンドから指定することにしましょう。

(12)

11 サーバ側 1: /****************************************************************** 2: SesrverTest:サーバー起動 3: ******************************************************************/ 4: import java.net.*; 5:

6: public class ServerTest{

7: /************* main ************************/ 8: public static void main(String[] args){ 9:

10:

11: ServerSocket sSock = null; //サーバー側のソケット 12: Socket sock = null; //クライアント側のソケット 13:

14: //サーバースタート

15: System.out.println("Server start..."); 16: try{

17: sSock = new ServerSocket(8088);

18: //8088 番ポートをサーバとして起動

19: while(true){

20: sock = sSock.accept(); //クライアントからの待ち

21: //受信したら

22: InetAddress sockIP = sock.getInetAddress(); 23: System.out.println("accept from " + sockIP); 24: } 25: } 26: catch(Exception e){ 27: System.exit(1); 28: } 29: } 30: }

(13)

12 クライアント側 /* ClientTest:クライアント側 コマンド ClientTest サーバ名 ポート番号 */ import java.io.IOException; import java.net.*;

public class ClientTest{

/*************** main *****************************/ public static void main(String[] args){

Socket sock = null; //クライアント用ソケット if(args.length == 2){

try{

sock = new Socket(args[0],Integer.parseInt(args[1])); //ソケット接続要求 } catch(Exception e){ System.out.println("Socket エラー"); } finally{ //ソケットをクローズする try { if(sock != null){ sock.close(); }

} catch (IOException e1) {

System.out.println("Socket closeエラー"); } } } else{ System.out.println("ホスト名とポート番号を指定してください"); } } } 複数のコンピュータがネットワークで接続されている環境であれば、異なるマシン間で、 接続実験をしてみてください

(14)

13 接続が成功したら、サーバからクライアントへ、クライアントからサーバへデータを送信 します。次のようなやりとりをすることを、クライアントとサーバとで約束することにし ます。 【ストリームの確立】 データの送受信をするには、まず、お互いにデータの通る道を作ります。Socket クラス には、InputStream と OutputStream を取得するメソッドが用意されています。

InputStream fin = sock.getInputStream(); OutputStream fout = sock.getOutputStream();

これらのストリームをラップして、文字列を扱えるようにしましょう。

BufferedReader in = new BufferedReader(new InputStreamReader(fin)); PrintWriter out = new PrintWriter(fout,true);

PrintWriter コンストラクタの 2 番目の引数は、ストリームのバッファを自動的にフラッシ ュすることを指定するものです。

(15)

14 【データの送受信】 ストリームが確立されれば、あとは、それぞれのストリームクラスのメソッドを使って データを送受信します。 出力には、PrintWriter クラスの Println() 入力には、BufferedReader クラスの readLine() サーバ側 /****************************************************************** SesrverTest:サーバー起動 ******************************************************************/ import java.io.*; import java.net.*;

public class ServerTestA {

public static void main(String[] args) throws IOException{ ServerSocket sSock = null; //サーバー側のソケット Socket sock = null; //クライアント側のソケット InputStream fin = null; //入力ストリーム

OutputStream fout = null; //出力ストリーム PrintWriter out = null; //文字列入力ストリーム BufferedReader in = null; //文字列出力ストリーム

int counter=0; //要求クライアントへのID番号

//サーバースタート

System.out.println("Server start..."); sSock = new ServerSocket(8088);

//20番ポートをサーバとして起動 while(true){ sock = sSock.accept(); //クライアントからの待ち System.out.println("accept..."); //「受信しました」 counter++; //クライアントのID //ストリームの確立 fin = sock.getInputStream(); fout = sock.getOutputStream();

in = new BufferedReader(new InputStreamReader(fin)); out = new PrintWriter(fout,true);

//ID番号送信

out.println("counter="+counter); //送信

System.out.println("counter="+counter); //ログ //クライアントからのメッセージ受信

String s = in.readLine();

(16)

15 //確認送信

out.println("ok"); //送信

System.out.println("ok to counter="+counter); //ログ //クローズ in.close(); out.close(); sock.close(); } } } クライアント側 /*************************************************************** ClientTestA:クライアント側 コマンド ClientTestA サーバ名 ポート番号 ***************************************************************/ import java.io.*; import java.net.*;

public class ClientTestA{

/*************** main *****************************/ public static void main(String[] args) throws Exception{

Socket sock = null; //クライアント用ソケット

BufferedReader in = null; //サーバからの入力ストリーム PrintWriter out = null; //サーバへの出力ストリーム InputStream fin=null;

OutputStream fout = null;

//キーボードからの入力ストリーム BufferedReader keyIn =

new BufferedReader(new InputStreamReader(System.in));

if(args.length == 2){

sock = new Socket(args[0],Integer.parseInt(args[1])); //ソケット接続要求

//ストリームの確立

fin = sock.getInputStream(); fout = sock.getOutputStream();

in = new BufferedReader(new InputStreamReader(fin)); out = new PrintWriter(fout,true);

(17)

16 //サーバから受付番号を受信 String myNo = in.readLine();

System.out.println("server:"+myNo);

//サーバにメッセージ送信

System.out.print("key in>"); //プロンプト String msg = keyIn.readLine(); //キー入力 out.println(myNo + ";" + msg); //送信

//サーバから確認を受信 String ack = in.readLine();

System.out.println("server:"+ack);

//閉じる in.close(); out.close(); sock.close(); } else{ System.out.println("ホスト名とポート番号を指定してください"); } } } 【実験】ここで、このプログラムを使って、通信の実験をしてみましょう。このプログラ ムは、サーバからの ID を受信したクライアントは、キ―ボードからの入力を待って、入力 されたデータをサーバに送信します。これは、時間のかかる処理です。人間がすぐには、 キー入力をしないかもしれないからです。この長い時間の間に、別のクライアントが接続 要求をしてきたら、どうなるか、という実験です。 MS-DOS プロンプトを 3 枚起動します。1 枚はサーバ用、残りの 2 枚は 2 人のクライアン ト用とします。 ① サーバを起動します >c:\javasrc\java ServerTestA Server start... ② クライアント1を起動します

>c:\javasrc\java ClientTestA localhost 8088 server from:counter=1

key in>

③ クライアント2を起動します

>c:\javasrc\java ClientTestA localhost 8088

サーバから ID が送られてきてキーボ ード入力待ちになります

(18)

17 これは、サーバのプログラムが、クライアント1からの受信を待ったまま、止まってい るので、次の要求をうけつることができないのです。 クライアント1がキーボード入力を終え、データを送信すると、クライアント2は、接続 を受け付けられて、ID 番号をもらえます。 実際のサーバが一人としか接続できないのでは困ります。前ページの実験を解決するのが スレッドです。スレッドを使って、同時に何人もの要求を処理できるサーバを作りましょ う

(19)

18 (1) サーバーソケットの待ち行列 サーバーソケットに、あるクライアントからの接続要求があったとき、すでに他のクラ イアントとの接続中であったとしても、待ち行列を形成し、接続要求を受け付けることが できます。つまり、同時に複数のクライアントと 1 個のポートでやりとりができるのです。 (2) マルチスレッド マルチスレッドは、複数の処理を同時に行うためのプログラミングテクニックです。 接続を受信したら、スレッドを生成して、あとの処理(送受信)は、スレッドに任せて しまいます。こうすると、メインプログラムは、すぐに次の接続要求を待つことができま す。 Thread クラスを拡張したクラスを作ります。

(20)

19 /****************************************************************** SesrverTestThread:スレッドを使ったサーバ ******************************************************************/ import java.io.*; import java.net.*;

public class ServerTestThread{

public static void main(String[] args) throws IOException{ ServerSocket sSock = null; //サーバー側のソケット Socket sock = null; //クライアント側のソケット

int counter=0; //要求クライアントへのID番号

//サーバースタート

System.out.println("Server start..."); sSock = new ServerSocket(20);

//20番ポートをサーバとして起動 while(true){ sock = sSock.accept(); //クライアントからの待ち System.out.println("accept..."); //「受信しました」 counter++; //クライアントのID

ServerToClient t = new ServerToClient(sock,counter); t.start(); } } } /********************************************************* クライアントとの通信を担当するスレッド *********************************************************/ class ServerToClient extends Thread {

private Socket sock;

private InputStream fin = null; //入力ストリーム private OutputStream fout = null; //出力ストリーム private PrintWriter out = null; //文字列入力ストリーム private BufferedReader in = null; //文字列出力ストリーム private int counter; //ID番号

/******** コンストラクタ *****************/ public ServerToClient(Socket sock,int id){

this.sock = sock; counter = id; }

/************ run ****************/ public void run(){

try{

//ストリームの確立

fin = sock.getInputStream(); fout = sock.getOutputStream();

in = new BufferedReader(new InputStreamReader(fin)); スレッドの生成と起動

(21)

20 out = new PrintWriter(fout,true); //ID番号送信

out.println("counter="+counter); //送信

System.out.println("counter="+counter); //ログ //クライアントからのメッセージ受信

String s = in.readLine();

System.out.println("accept data>" + s ); //確認送信

out.println("ok"); //送信

System.out.println("ok to counter="+counter); //ログ

} catch(IOException e){ System.out.println("エラー" + e); } finally{ try{ //クローズ if(in != null){ in.close(); } if(out != null){ out.close(); } if(fin != null){ fin.close(); } if(fout != null){ fout.close(); } if(sock != null){ sock.close(); } } catch(IOException e){ System.out.println("エラー" + e); } } } }

(22)

21

サーブレットの構成

サーブレットは、HttpServlet クラスを継承して作ります。サーブレットの基本構成を以下 に示します。 サーブレットの基本構造 package パッケージ名 import

public class クラス名 extends HttpServlet{ クラス変数の宣言

public void init(){ 初期化処理 }

public void doPost(・・・){ }

public void doGet(・・・){ }

}

doGet メソッドは、HTTP の GET リクエストに対し、呼び出されます。また、doPost メソッ ドは、POST リクエストに対して、呼び出されます。クライアントが URL を指定してサーブ レットを要求すると、doGet メソッドが呼び出され、HTML のフォームから POST 指定で要求 すると doPost メソッドが呼び出されます。いづれも、以下の2つの引数をとります。 HttpServletRequest:クライアントからのリクエスト情報 HttpServletResponse:サーバ側からの応答情報

コンテントタイプの設定

クライアントに応答する形式を設定します。HTML を生成して出力するときは res.setContentType("text/html"); と書きます。この文は、次の HTML の送信より先に書かなければなりません。 ブラウザに表示したい内容が日本語の場合には、このままでは文字化けしてしまいます。 これは、サーブレットのデフォルトの文字コードが「iso-8859-1」という規格にあるのに 対し,Windows が「シフト JIS」であって、異なるためです。文字化けを防ぐために setContentType では漢字コードの指定をします。 res.setContentType("text/html; charset=utf-8");

(23)

22

HTML の生成

HttpServletResponse クラスの getWriter メソッドを使うと、PrintWriter クラスの出力ス トリームを確立することができます。

PrintWriter out = res.getWriter();

HTML はテキストですから、1 行作成するたびに println メソッドで送信します。MS-DOS の 画面に表示したときと全く同様に、文字列をクライアントに送信することができます。 out.println("<html><head>"); //HTML の送信 out.println("<title>Hello Servlet</title>"); out.println("</head><body>"); out.println("こんにちは<BR>"); out.println("はじめてのサーブレットです"); out.println("</body></html>");

(24)

23

POST メソッドによるクライアントからの受信

エコーバックします

inData.html の form はどのように書いたらよいでしょうか?

<form action=" servlet/ConfData " method="post">

web.xml は? <servlet>

<servlet-name>ConfData</servlet-name>

<display-name>This is the display name of my J2EE component</display-name>

<description>This is the description of my J2EE component</description> <servlet-class>servlets.ConfData</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>ConfData</servlet-name>

<url-pattern> servlet/ConfData </url-pattern> /confData

(25)

24

サーブレット側でのパラメータの受け取り

HTML のフォームから METHOD = “POST”でサーブレットを呼び出すと、HTTP プロトコル の POST コマンドが発行され、サーブレットの doPost メソッドが呼び出されます。 ブラウザから URL を指定してサーブレットを呼び出す ブラウザに配置されたボタンでサーグレットを呼び出す

HTML からは、NAME と VALUE の組が渡されます。サーブレット側では、NAME を指定して対応 する VALUE を取得します。 String p = request.getParameter(“NAME で指定した識別子”); request: サーブレットの doPost メソッドに引数として 渡される HttpRequest クラスのオブジェクト これは、取得できるデータが1つであれば、HTML でのフォームの種類に因りません。つま り、テキストボックスに入力されたデータも、ラジオボタンで選ばれたデータも、みな、 この形式で受け渡しができます。 NAME が変数名のようなもので、VALUE がその内容といったイメージです 複数の VALUE 値が渡される場合には、配列になります。 String[] p=request.getParameterValues(“NAME で指定した識別子”); request: サーブレットの doPost メソッドに引数として 渡される HttpRequest クラスのオブジェクト

http://www.homepege/mitai class servlet extends HttpServlet{

public void doGet(・・・){

public voif doPost(・・・){

} } サーブレット HTTP プロトコルの GET コマンド発行 GET 送信 POST HTTP プロトコルの POST コマンド発行

(26)

25

日本語の取り扱い

ブラウザからの入力データの文字コードは「iso-8859-1」であり、Windows のそれと異なる ため、このままでは文字化けしてしまいます。そこで、取得した文字列を一度、「iso-8859-1」 モードでバイト列に変換し、これを今度は、自動認識モード「utf-8」モードで String ク ラスに変換しなおします。 String p = req.getParameter("param1"); // パラメータを取得 byte[] b = p.getBytes("iso-8859-1"); //バイト型の配列に変換 String text = new String(b,"utf-8");

//指定された文字セットを使用してバイト配列から新しい String クラスを //インスタンス化するコンストラクタ package servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

public class ConfData extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String p = request.getParameter("name");

String name = new String(p.getBytes("iso-8859-1") , "utf-8"); p = request.getParameter("kana");

String kana = new String(p.getBytes("iso-8859-1") , "utf-8");

response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter();

out

(27)

26 Transitional//EN¥">"); out.println("<html>"); out.println(" <head>"); out.println(" <title>入力確認</title>"); out.println(" </head>"); out.println(" <body>"); out.println("氏名:" + name + "<br>"); out.println("ふりがな:" + kana + "<br>"); out.println(" </body>"); out.println("</html>"); out.flush(); out.close(); } }

(28)

27 【練習】HTML の1つのフォームの中に複数個のボタンがあり、どのボタンが押されたかに よって、異なる動作をさせてみましょう 赤ボタンを押すと 黄色ボタンを押すと 1つのフォーム内に3つの submit ボタンが配置してありますので、どのボタンが押され ても、PostServletButton.java の doPost メソッドが呼び出されます。ですから、このメソ ッド内で、どのボタンが押されたのか、を調べ、それぞれに対応する処理を行うことにな ります。 if(request.getParameter(“識別子”) != null){ “識別子”を持つボタンが押されたときの処理 } 緑ボタンを押すと 赤い画面 緑の画面 黄色い画面

(29)

28

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd"> <html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title>

</head> <body>

ボタンを押すと色が変わります<br>

<form action="servlet/SelectServlet" method="post"> <input type="submit" name="red" value=""> <input type="submit" name="green" value=""> <input type="submit" name="yellow" value=""> </form> </body> </html> import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

public class SelectServlet extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String colorCode = ""; if(request.getParameter("red")!= null){ colorCode = "#FF0000"; } if(request.getParameter("green")!= null){ colorCode = "#00FF00";

(30)

29 } if(request.getParameter("yellow")!= null){ colorCode = "#FFFF00"; } response.setContentType("text/html"); this.preventCaching(request, response); PrintWriter out = response.getWriter();

out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<html>");

out.println(" <head>");

out.println(" <title>A Servlet in POST</title>"); out.println("<style type='text/css'>"); out.println("body{"); out.println("background-color:"+colorCode+";"); out.println("}"); out.println("</style>"); out.println(" </head>"); out.println(" <body>"); out.print(" This is <b>"); out.print(this.getClass().getName());

out.println("</b>, using the <b>POST</b> method <br>"); out.println(" </body>"); out.println("</html>"); out.flush(); out.close(); } }

(31)

30

JSP で受け取ると

inData.html の form は

<form action=" " method="post">

普通に HTML で書けるので、CSS なども簡単に実装できます

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

String p = request.getParameter("name");

String name = new String(p.getBytes("iso-8859-1") , "utf-8"); p = request.getParameter("kana");

String kana = new String(p.getBytes("iso-8859-1") , "utf-8"); %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>

<head>

<title>入力確認</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style type="text/css"> td , th{ border-style:solid; border-color:#0000ff; border-width:1px; } table{ border-collapse:collapse; } th{ text-align:right; } </style> </head> <body> <table> <tr> <th>氏名:</th> <td><%= name %></td> </tr> <tr> <th>ふりがな:</th> <td><%= kana %></td> </tr> </table> </body> </html>

(32)

31

JSP(Java Server Pages)は、HTML の中に、JAVA のコードを埋め込むことができる 言語です。JSP は、JAVA のように、コンパイルする必要がありません。ソースファイルを そのままサーバーに置きます。 JSP が通常の完全なインタプリタと異なる点は、実行時に、実行に先立ってサーブレットに 変換され、コンパイルされることです。サーブレットへの変換やコンパイルがうまくでき ないと実行できません。従って、通常の完全なインタプリタのように、とりあえずできた ところまで動かしてみる、というわけにはいかないのです。また、初めて実行したときは、 変換したりコンパイルしたりする時間がかかります。が、一度実行されると、メモリ上に ロードされたまま、何度も使われるので、2度目からは、高速に動作できます <<注意>> JSP のファイルを同じ名前で作り直して差し替えた場合、ファイルのタイムスタンプが現 在コンパイルされているものより新しい場合のみサーブレットに変換され、コンパイルさ れます。古いファイルに差し替えようとすると変換されませんので,一度保存しなおして、 タイムスタンプを最新にしてから実行してください

(33)

32 JSP は、サーブレットと全く同じことができます。ですから、JSP だけでサーブレットを 記述することもできます。しかし、JSP は、「HTML を出力する」機能に優れており、サーブ レットのうち、画面出力の部分だけを担当することにより、プログラミングの経験の浅い、 デザイナでも、HTML さえ知っていれば、容易に記述することができます。それにより、プ ログラマとデザイナが同時に作業を進行することできますし、画面デザインだけが変更さ れた場合には、JSP だけを差し替えればすむ、というメリットがあります。

逆に、JAVA のコードも記述できますので、JAVA の for 文や if 文などのロジックを加え た動的なページを作ることができます。 サーブレットでは、一般に3つの役割に分け、以下のように分担します モデル 必要なデータの保持と業務ロジック JAVABeans ビュー 画面デザイン JSP コントロール 入力情報を受け取り、モデルとビューをコントロール サーブレット このような分担の方法をMVC モデルと言います。

JSP を構成する要素

JSP の記述は、3つの要素に分類することができます。 1.ディレクティブ(Directive) JSP ファイルを実行する JSP コンテナに対する指令です 【例】

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

2.スクリプト(Script) HTML を動的に生成するための JAVA コードを記述します 【例】 <% for(int i=0;i<5;i++){ %> 3.アクション(Action) JavaBeans や他の JSP を呼び出すための記述をします 【例】

(34)

33

ページの属性

はじめに、このページの属性を指定します。JSP では、属性を指定するタグは以下のよう に書きます。 <%@ page 属性名=”属性”%> 属性名は、下表の中から、必要なものを指定します。複数の属性を指定したいときは、並 べて書くことができます。 属性名 説明 例

language いつも=”java”と書く language = “java” extends サーブレットの extends にあたりま す。 (ほとんと使用しない) import ページの中で利用しているクラスが所 属するパッケージを指定します。サー ブレットの import にあたります。 import したいパッケージが複数ある ときは、「,」で区切って並べます。以 下 の パ ッ ケ ー ジ は 指 定 が な く て も import されます。 java.lang.* javax.servlet.* javax.servlet.http.* javax.servlet.jsp.* import = “java.util.*,java.text.*”

session true のとき、session 管理するするが、 false のときは session を作らない。 デフォルトで true session = “true” buffer HTML をクライアントに送信する際の バッファサイズをキロバイト単位で指 定。デフォルトでは8KB buffer = “8KB” autoFlush true のとき、バッファを自動的にフラ ッシュする 指定がなければ true autoFlush = “true” isThreadSafe true のときはマルチスレッドにし、 false1 のときは SingleThreadModel に する。デフォルトでは true isThreadSafe = “true” info この JSP ページに関する情報(作成日 や制作者など)を記録しておく。他の ページから getServletInfo()で読み出す文字列を info = “ore_ga_tukutta”

(35)

34 設定 errorPage エラーが発生したときに表示するペー ジを指定する。 errorPage = “err.html” contentType HTTP ヘッダの ContentType を設定。サ ーブレットの setContetType にあたる contentType = “text/html;charset = Shift_JIS isErrorPage ture であるとき、このページがエラー 発生時に呼び出されるページであるこ とを示す isErrorPage = “true” 【例】

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %> contentType に html を指定し、文字セットとして Shift_JIS を指定してます 文字セットの指定をしないと、サーブレット同様、日本語を正しく表示することがで きません。

HTML の記述

通常の HTML は、そのまま記述します。

JSP 内に Java の構文を書く

JSP 内に Java の構文を埋め込むには、以下のタグで囲みます。 <% Java の構文 %> 文の途中でも、JAVA の命令の部分だけ、このタグで囲みます。このタグで囲まれた中には、 Java の命令を何でも書くことができます。 例) <% for(int i = 0;i<3;i++){ %> こんにちは<BR> <% } %> 「こんにちは」を3回表示します

(36)

35

変数の内容を HTML としてクライアントに送信する

通常の決まった文字であれば、そのまま書きますが、(前ページの例の「こんにちは」の ように)変数の内容を HTML としてクライアントに送信するには、以下のタグで囲みます <%= 送信したい内容 %> 変数の内容や、メソッドを実行した結果などを送信したいときに使います。 【例】 <%= text %> 変数 text の内容を送信します。変数名 text はあらかじめ宣言されて、データが 記録されていなければなりません。 <% %>と組み合わせると、配列の内容を1つずつ送信することができます。 【例】 <% for(int i = 0;i<kamoku.length;i++){ %> <%= kamoku[i]+" " %> <% } %>

クラス変数の宣言

<% %>タグの中で、変数の宣言を行うと、ローカル変数として宣言されます。クラス変数 を宣言したいときには、以下のタグを使います。 <%! クラス変数の宣言 %> クラス変数は、スレッドが終了しても継続して使うことができますが、その反面、複数の スレッドが同時に起動されていても1つしか存在しないので、その取り扱いには、注意が 必要です。 【例】 <%! int Total = 0; %> この total は、JSP がロードされている間、最初の1回しか初期化されないため、合計値を 求めようとすると、履歴のすべてが累積されてしまいます

HTML のコメント文

HTML にもコメントを沢山入れておきましょう。HTML では、以下のタグで囲まれた部分は、 無視されます。 <!-- =--> このタグは、HTML のタグです。従って、このタグで囲まれた部分、クライアントに送信さ れます。

(37)

36

JSP のコメント文

JSP にもコメントを沢山入れておきましょう。<% %>で囲まれた部分は、JAVA なので、 JAVA のコメント/* */ と//がそのまま使えます。その他に、下記のタグが JSP のコメント 文となり、クライアントにも送信されません。 <%-- コメント文 --%>

暗黙のオブジェクト

JSP では、宣言せずに使える暗黙のオブジェクト名が用意されています。以下に一覧表を 示します。 暗黙のオブジェクト 変換後のクラス 説明

request ServletRequest サーブレットの doGet や doPost の1つ目の引数にあた ります。クライアントからの要求情報を保持します。 【例】

<% request.getParameter(・・・); %>

response ServletResponse サーブレットの doGet や doPost の2つ目の引数にあた ります。クライアントに対する応答情報を保持します。 【例】

<% response.getWriter(); %>

pageContext PageContext PageContext クラスは、サーブレットで持っているセッ ションやオブジェクトの情報を管理するクラスです。 JSP 内では、あまり使われません

session HttpSession HttpSession は、セッション情報を保持するクラスで

す。 【例】

<% session.getAttribute(); %>

application ServletContext ServletContext クラスは、サーブレットの環境情報を 保持しているクラスで、API のバーションやファイルが 実際に置かれているパス名などを取り出すことができ ますが、JSP 内では、あまり使われません。

out JSPWriter クライアントに対する文字列の出力先です

【例】<% out.print(text); %>

config ServletConfig ServletConfig クラスは、サーブレットの設定情報を保 持しているクラスす。JSP 内ではあまり使われません。

page Object サーブレットの this と同じです

(38)

37

サーブレットからのリクエストの転送

本来は、ID とパスワードは、データベースから取得するのですが、ここでは、ID に「IS04」 パスワードに「kamata」と入力されたときだけログインできることにしましょう。

login.html のフォームは?

(39)

38 package servlets; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginCheck extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String id = request.getParameter("id"); String pass = request.getParameter("pass"); boolean loginOK = false;

//本来は、ここでデータベースに接続する //SELECT * FROM users where id = ? if(id.equals("IS04")){ if(pass.equals("kamata")){ loginOK = true; } } response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter();

out .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<html>"); out.println(" <head>"); out.println(" <title>ログイン</title>"); out.println(" </head>"); out.println(" <body>"); if (loginOK){ out.println("ログインできました"); } else{ out.println("IDまたはパスワードが違います"); } out.println(" </body>"); out.println("</html>"); out.flush(); out.close(); } }

(40)

39 サ ー ブ レ ッ ト か ら の リ ク エ ス ト を ほ か の サ ー ブ レ ッ ト や JSP に 転 送 す る に は 、 RequestDispatcher インターフェイスの forword メソッドを使って、次のように書きます。 getServletContext().getRequestDispatcher("転送先").forward(request, response); ここでの転送先には、コンテキストルートからの絶対パスを書きます。絶対パスですから、 先頭は必ず「/」で始まります。JSP や HTML は拡張子まで書きますが、サーブレットの場合 には、サーブレット名を指定するので、拡張子は書きません。 サーブレットからほかのサーブレットや JSP にリクエストを転送する際、serAttribute メ ソッドを使って、パラメータを一緒に転送することができます。パラメータは、「パラメー タ名」と「パラメータ値」を一対の組として指定します。パラメータ値は、文字列でなけ ればなりませんが、パラメータ値は、オブジェクトをなんでも指定できます。 req.setAttribute("パラメータ名", パラメータ値); 転送先では、以下のようにパラメータを取り出します (パラメータ値の型)request.getAttribute(“パラメータ名”);

(41)

40 実際には、ログインしたときは、コンテンツを表示し、できなかったときは、入力画面に 移動します。 package servlets; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.*;

public class LoginCheck extends HttpServlet {

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String id = request.getParameter("id"); String pass = request.getParameter("pass");

boolean loginOK = false;

//本来は、ここでデータベースに接続する //SELECT * FROM users where id = ? if(id.equals("yokohama")){ if(pass.equals("system")){ loginOK = true; } } if(loginOK){ getServletContext().getRequestDispatcher("/loginOK.html") .forward(request, response); } else{ getServletContext().getRequestDispatcher("/loginNG.html") .forward(request, response); } } }

(42)

41 loginOK.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title>

</head> <body> ログインできました </body> </html> loginNG.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html> <head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title>

</head> <body>

IDまたはパスワードがちがいます </body>

(43)

42 html を jsp に変えて id を表示します

loginOK.jsp

<%@ page language="java" import="java.lang.*,java.util.*"

contentType="text/html;charset=utf-8" %>

<%

String path = request.getContextPath(); String basePath =

"http://"+request.getServerName()+":"+request.getServerPort()+path+"/";

String id = (String)request.getAttribute("id"); %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html> <head>

<base href="<%=basePath%>">

<title>My JSP 'loginOK.jsp' starting page</title>

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page">

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<!--

<link rel="stylesheet" type="text/css" href="styles.css"> -->

</head>

<body>

This is my 'loginOK.jsp' JSP page. <br> 受け取ったIDは <%= id %>

</body> </html>

(44)

43 loginNG.jsp

<%@ page language="java" import="java.lang.*,java.util.*" %> <%

String path = request.getContextPath(); String basePath =

"http://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html> <head>

<base href="<%=basePath%>">

<title>My JSP 'loginNG.jsp' starting page</title>

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page">

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<!--

<link rel="stylesheet" type="text/css" href="styles.css"> -->

</head>

<body>

This is my 'loginNG.jsp' JSP page. <br> </body>

(45)

44 loginCheck.java

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String id = request.getParameter("id"); String pass = request.getParameter("pass");

//本来はここでデータベースに問い合わせる //テーブル名:users

//フィールド名:id passwordである場合 //"SELECT * from users where id='"+id+ // "' and password='"+pass+"'"

//本来はセキュリティを考える boolean loginOK;

if (id.equals("IS04") && pass.equals("kamata")){ loginOK = true; } else{ loginOK = false; }

request.setAttribute("id", id);

if (loginOK){ this.getServletContext().getRequestDispatcher("/loginOK.jsp"). forward(request, response); } else{ this.getServletContext().getRequestDispatcher("/loginNG.jsp"). forward(request, response); } }

(46)
(47)

46 【練習】ラジオボタンで画面を振り分ける

(48)

47 language.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd"> <html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title>

</head> <body>

<form action="servlet/SelectLanguage" method="post">

<input type="radio" name="select" value="0" checked>English<br> <input type="radio" name="select" value="1" >日本語<br>

<input type="submit" value="選択"> </form>

</body> </html>

SelectLanguage.java

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String p = request.getParameter("select"); int lang = Integer.parseInt(p);

String[] htmlName ={"/english.html" , "/Japanese.html"};

this.getServletContext().getRequestDispatcher(htmlName[lang]).

forward(request, response);

(49)

48

JavaBeans の設計

情報をまとめてクラス化することを JavaBeans といい、また、作成したクラスを Bean と言 います。Beans はパッケージに収めておかなければなりません。

Bean の条件

Bean は、今まで作成してきたクラスとなんら変わりませんが、以下のような条件がありま す。 ・ 引数なしのコンストラクタが用意されていること インスタンス化するだけのコンストラクタ ・ セッタ・ゲッタが用意されていること JSP のコマンドにより、セッタ・ゲッタを呼び出すとき、メソッド名ではなく、メ ンバ変数名を使う。 JSP による Bean の利用 JSP では、Bean のオブジェクトを利用するためのタグが用意されています。 ① <jsp:useBean>アクション このタグにより、指定のクラスのオブジェクトが利用できるようになります。

<jsp:useBeans id=”オブジェクト名” scope=”オブジェクト有効範囲” class=” クラス名”/>

または

<jsp:useBean id=”オブジェクト名” scope=”オブジェクト有効範囲” class=”クラ ス名” /> bean に関する処理 </jsp:useBean> 各属性には、以下のような値を与えます 属性 説明 id オブジェクト名を与える。このタグ以降、JSP に埋め込まれた Java コ ード中で、インスタンス化されたオブジェクトとして利用できる scope 以下のいずれか 値 説明 page このページ中でのみ参照できる。デフォルト request このリクエストの処理の間、参照できる。include されたページ中でも参照できる

(50)

49 session セッションが継続する間、参照できる。セッション にこの id のオブジェクトが存在した場合、あらため てインスタンス化せず、同じものを参照する。セッ ションにバインドされていない場合には、新しくイ ンスタンス化する application アプリケーションが継続している間、参照できる。 セッションを超えて、ほかのサーブレットや JSP か ら同一のオブジェクトが参照できる ② <jsp:setProperty>アクション Bean のセッタメソッドを呼び出して、フィールドに値を設定する

<jsp:setProperty name=”オブジェクト名” property=”フィールド名”value=”値” />

または

<jsp:setProperty name=”オブジェクト名” property=”フィールド名” param=”パラメータ名” /> フィールドに設定する値を直接書く場合は、前者を使います。フォームを持つ JSP や HTML から呼び出され、パラメータを伴う場合は、後者を使います。 ③ <Jsp:getProperty>アクション Bean のゲッタメソッドを呼び出してフィールドに設定されている値を取得するタグで す。

(51)

50

学生を扱う JavaBean

package datas;

public class Personal { //メンバ変数

private String id; //学籍番号

private String name; //名前

private int age; //年齢

//コンストラクタ public Personal(){ id = null; name = null; age = 0; }

public Personal(String id, String name , int age){

this.id = id;

this.name = name;

this.age = age;

}

public void setId(String id){

this.id = id;

}

public String getId(){

return id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

} }

(52)

51 学生情報をホームページに表示してみましょう import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import datas.Personal;

public class DispPersonal extends HttpServlet {

/**

* The doGet method of the servlet. <br> *

* This method is called when a form has its tag value method equals to get. *

* @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred

* @throws IOException if an error occurred */

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Personal p1 = new Personal("K101C0000" , "じゅげむじゅげむ" , 20);

response.setContentType("text/html ; charset=utf-8"); this.preventCaching(request, response);

PrintWriter out = response.getWriter();

out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<html>");

(53)

52

out.println(" <title>A Servlet in GET</title>"); out.println(" </head>"); out.println(" <body>"); out.println("学籍番号:" + p1.getId() + "<br>"); out.println("氏名:" + p1.getName() + "<br>"); out.println("年齢:" + p1.getAge() + "<br>"); out.println(" </body>"); out.println("</html>"); out.flush(); out.close(); } /**

* Prevents navigator from caching data. *

* @param request the request send by the client to the server * @param response the response send by the server to the client */

protected void preventCaching(HttpServletRequest request, HttpServletResponse response) {

// see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html String protocol = request.getProtocol();

if ("HTTP/1.0".equalsIgnoreCase(protocol)) { response.setHeader("Pragma", "no-cache"); } else if ("HTTP/1.1".equalsIgnoreCase(protocol)) {

response.setHeader("Cache-Control", "no-cache"); // "no-store" work also }

response.setDateHeader("Expires", 0); }

}

(54)

53 html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd"> <html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title>

<style> <!-- table{ border-collapse:collapse; } td,th{ padding:5px; border-style:solid; border-color:#0033FF; border-width:1px; } --> </style> </head> <body> <table> <tr> <th>学籍番号</th> <td>K010C0000</td> </tr> <tr> <th>氏名</th> <td>じゅげむじゅげむ</td> </tr> <tr> <th>年齢</th> <td>20才</td> </tr> </table> </body> </html> の部分が Bean からのデータになります。

(55)

54 JSP で表示してみましょう

<%@ page language="java" import="java.lang.*,java.util.*,datas.*" contentType="text/html; charset=utf-8" %>

<%

Personal p1 = new Personal("K101C0000" , "じゅげむじゅげむ" , 20); %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html> <head>

<title>My JSP 'dispPersonal.jsp' starting page</title>

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style> <!-- table{ border-collapse:collapse; } td,th{ padding:5px; border-style:solid; border-color:#0033FF; border-width:1px; } --> </style> <!--

<link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <table> <tr> <th>学籍番号</th> <td><%= p1.getId() %></td>

(56)

55 </tr> <tr> <th>氏名</th> <td><%= p1.getName() %></td> </tr> <tr> <th>年齢</th> <td><%= p1.getAge() %>才</td> </tr> </table> </body> </html> JSP には、JavaBeans を扱う特別な記述があります。

<%@ page language="java" import="java.lang.*,java.util.*,datas.*" contentType="text/html; charset=utf-8" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html> <head>

<title>My JSP 'dispPersonal.jsp' starting page</title>

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style> <!-- table{ border-collapse:collapse; } td,th{ padding:5px; border-style:solid; border-color:#0033FF; border-width:1px; } --> </style>

(57)

56 <!--

<link rel="stylesheet" type="text/css" href="styles.css"> -->

</head>

<body>

<jsp:useBean id="p1" class="datas.Personal" scope="request" /> <jsp:setProperty name="p1" property="id" value="K010C0000" />

<jsp:setProperty name="p1" property="name" value = "じゅげむじゅげむ" /> <jsp:setProperty name="p1" property="age" value="20" />

<table> <tr>

<th>学籍番号</th>

<td><jsp:getProperty name="p1" property="id" /></td> </tr>

<tr>

<th>氏名</th>

<td><jsp:getProperty name="p1" property="name" /></td> </tr>

<tr>

<th>年齢</th>

<td><jsp:getProperty name="p1" property="age" />才</td> </tr>

</table> </body> </html>

(58)

57 データを取り込みたいときは

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd"> <html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title>

</head> <body>

<form action="servlet/GetPersonal" method="post"> 学籍番号:<input type="text" name="id"><br> 氏名:<input type="text" name="name"><br> 年齢:<input type="text" name="age"><br> <input type="submit" value="送信"> </form> </body> </html> import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;

(59)

58 import datas.Personal;

public class GetPersonal extends HttpServlet {

/**

* The doPost method of the servlet. <br> *

* This method is called when a form has its tag value method equals to post. *

* @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred

* @throws IOException if an error occurred */

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String id = (String)request.getParameter("id"); String p = (String)request.getParameter("name");

String name = new String(p.getBytes("iso-8859-1"),"utf-8"); int age = Integer.parseInt((String)request.getParameter("age")); Personal p1= new Personal(id , name , age);

response.setContentType("text/html;charset=utf-8"); this.preventCaching(request, response);

PrintWriter out = response.getWriter();

out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<html>");

out.println(" <head>");

out.println(" <title>A Servlet in POST</title>"); out.println(" </head>"); out.println(" <body>"); out.println("学籍番号:" + p1.getId() + "<br>"); out.println("氏名:" + p1.getName() + "<br>"); out.println("年齢:" + p1.getAge() + "<br>"); out.println(" </body>"); out.println("</html>"); out.flush(); out.close(); }

(60)

59 /**

* Prevents navigator from caching data. *

* @param request the request send by the client to the server * @param response the response send by the server to the client */

protected void preventCaching(HttpServletRequest request, HttpServletResponse response) {

// see http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html String protocol = request.getProtocol();

if ("HTTP/1.0".equalsIgnoreCase(protocol)) { response.setHeader("Pragma", "no-cache"); } else if ("HTTP/1.1".equalsIgnoreCase(protocol)) {

response.setHeader("Cache-Control", "no-cache"); // "no-store" work also }

response.setDateHeader("Expires", 0); }

}

JSP では

<%@ page language="java" import="java.lang.*,java.util.*,datas.*"

contentType="text/html; charset=utf-8" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html> <head>

<title>My JSP 'dispPersonal.jsp' starting page</title>

<meta http-equiv="Pragma" content="no-cache">

<meta http-equiv="Cache-Control" content="no-cache"> <meta http-equiv="Expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page">

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style> <!-- table{ border-collapse:collapse; } td,th{

参照

Outline

関連したドキュメント

B 賞.グランプリ受賞店舗限定で利用できる商品引換券・・・30 名様 C 賞.ひこぼし賞受賞店舗限定で利用できる商品引換券・・・10 名様

就学前の子どもに関する教育保育 等の総合的な提供の推進に関する 法律第 2 条第 6 項の認定こども園 延べ面積 3,000 ㎡食料品が購買

ロボットは「心」を持つことができるのか 、 という問いに対する柴 しば 田 た 先生の考え方を

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

最愛の隣人・中国と、相互理解を深める友愛のこころ

本事業を進める中で、

VREF YZのQRは Io = 30 mA になりま す。 VREF ?を IC のでJKする./、QR のæç でJKするような èとしてGさ い。をéえるQRとした./、