Servletにメッセージを送ろう

Servletにメッセージを送ろ
う!
杉浦学・山下純一・北川敦規
今日の目標です

サーブレットとブラウザのメッセージ送受信



ブラウザでサーブレットにメッセージを送信できる
サーブレットでメッセージを受信できる
実習で実際にアプリを作れるようになる
Webアプリケーションとは?
先週の復習です!
Q:Webアプリケーションってなんでした?
A: Webアプリは人を幸せにするコンセプトを持っている
単なる動的なページはWebアプリではない
Ex.)掲示板なら・・・・
もしコンセプトなければ
人は幸せにならない
コンセプトがなければ
→Webアプリとは言えない
掲示板にコンセプトをつける
Q:「掲示板」にコンセプトをつけるとしたら、
どんなものが考えられますか?
A:
題材:奥様支援Webアプリケーション
主婦の日々の料理をバラエティー豊かに
オリジナル料理に注目
「オリジナルレシピ投稿掲示板」


みんなにこんな美味いオリジナル料理を食
べてもらいたい(投稿)
もっと色んなオリジナルレシピが知りたい
たい(閲覧)
利用シナリオ
デモってみましょう
投稿者:末広 涼子
料理名:スペシャルカレー・ブチキレ風味
作り方:①ルーにWASABIを入れます
②ご飯は無洗米でいいです
③具はBSE
メッセージの送受信モデル
GET toukou.html
クライアント
(末広涼子)
<html><body><form
><text=></html>
toukou.html
POST UketoriServlet
投稿者="末広涼子"・・・
サーバー
Webブラウザ
<html><body>スペ
シャルカレー</html>
UketoriServlet.class
Get? Post?
Q:先ほどの図でGetとPostが出てきました。
役割の違うところはなんでしょう
A:
 Get HTMLをもらうための要求
 Post メッセージを送って、処理した結果
のHTMLをもらうための要求
メッセージ送信編
入力から送信まで
GET toukou.html
クライアント
(末広涼子)
<html><body><form
><text=></html>
POST UketoriServlet
投稿者=末広涼子・・・
toukou.html
Webブラウザ
サーバー
メッセージを発信する仕組み
<html><body bgcolor="#33CCFF">~
<form name="form1" method="post"
action="../servlet/UketoriServlet">
<font size="+1">お名前:</font>
<input type="text" size="15“ name="contributor">
<font size="+1">料理名:</font>
<input type="text" size="20" name="title" >
<font size="+1">作り方</font>
<textarea cols="50" rows="25" name="recipe" >
<input type="submit" name="submit" value="投稿">
<input type="reset" name="reset" value="リセット">
</form></body></html>
フォームのはじめ
<form name="form1" method="post"
action="../servlet/UketoriServlet">
メッセージを入力する為の部品を書く
それらを送信する為の部品を書く
</form>
action ・・・ 送信先
入力の為の部品
<input type="text"
size="15“ name="contributor">
type ・・・ 部品の種類
<textarea cols="50" rows="25"
name="recipe" >
name ・・・各部品固有の名前
送信の為の部品
<input type="submit"
name="submit" value="投稿">
<input type="reset"
name="reset" value="リセット">
送信される形式
Postで送ったHttpリクエストは、
POST ../servlet/UketoriServlet HTTP/1.1
Length: 54
contributor=末広 涼子&title=スペシャルカレー・ブチキレ風味
&recipe=①ルーにwasabiを入れます②ご飯は無洗米でいいです
③具はBSE・・・・
な形で送られました。めでたし、めでたし。
メッセージ送信編 終了
メッセージ受信編
受信から返答まで
クライアント
(末広涼子)
UketoriServlet.class
<html><body>スペ
シャルカレー</html>
サーバー
Webブラウザ
送られてきたメッセージ
contributor=末広 涼子&title=スペシャルカレー・ブチキレ風味
&recipe=①ルーにwasabiを入れます②ご飯は無洗米でいいです
③具はBSE・・・・
すると・・・アプリケーションサーバー
(TomCat)が「ハッシュテーブル」にマッピン
グしてくれます
ハッシュテーブル?


文字を鍵(Key)として
値(Value)を取得することができる
今回の場合・・・
Key
Value
Contributor = 末広 涼子
Title
= スペシャルカレー・ブチキレ風味
Recipe
= ①ルーにwasabiを入れます
②ご飯は無洗米でいいです
③具はBSE・・・・
Servletの2つの部分
UketoriServlet.class
サーバーから
(ハッシュテーブル)
ブラウザーへ
受け取りプログ
ラム
HTML生成
プログラム
public class UketoriServlet extends HttpServlet {
/**
doPost() メソッドは、POSTリクエストがブラウザー
からプログラムに発信されたときに呼び出されるメソッド
**/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletExceptio
{
/**
送信されたメッセージが格納されたハッシュテーブルから、
キーを指定してバリューをそれぞれの変数に格納する
**/
String contributor = request.getParameter("contributor");
String title = request.getParameter("title");
String recipe = request.getParameter("recipe");
contributor = transferUnicode(contributor);
title = transferUnicode(title);
recipe = transferUnicode(recipe);
//*****ここまででメッセージを受信できた*****
//*****ここからがメッセージを表示する為の部分*****
response.setContentType("text/html;charset=Shift_JIS");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body bgcolor=\"#33CCFF\" text=\"#000000\">");
out.println("<hr>");
//投稿者と現在の日付を出力する。
out.print("<b><font size=4><p>"+contributor+"さんオリジナル</font></b>");
out.print("(投稿時刻:"+ new java.util.Date() + ")<BR/></p>");
//料理名を出力する。
out.println("<p><font size=5>「"+title+"」のレシピ</font> </p><hr/>");
//作り方を出力する
out.println(recipe+"</p><hr/>");
out.println("</body>");
out.println("</html>");
//*****ここまででメッセージを表示できた*****
}
}
受け取りプログラム
送信されたメッセージが格納されたハッシュテーブルから、
キーを指定してバリューをそれぞれの変数に格納します
String contributor = request.getParameter("contributor");
//キーcontributorのバリューを取得して文字列contributorに入
れる
String title = request.getParameter("title");
//キーtitleのバリューを取得して文字列titleに入れる
String recipe = request.getParameter("recipe");
//キーrecipeのバリューを取得して文字列recipeに入れる
投稿者の例でいうと・・・
String contributor=request.getParameter("contributor");
Key
Contributor =
文字列
contributor
Value
末広 涼子
文字列
contributor
末広 涼子
受け取りプログラム1
(文字コードの変換)
このままでは正常な文字列ではないので
文字化けするので、Unicodeに変換します
contributor = transferUnicode(contributor);
title = transferUnicode(title);
recipe = transferUnicode(recipe);
中略
private String transferUnicode(String s) throws
UnsupportedEncodingException{
return new
String(s.getBytes("8859_1"),"JISAutoDetect");
表示プログラム準備
(出力を日本語形式に)

出力を日本語形式に指定して、ブラウ
ザでの文字化けを解消する。
response.setContentType("text/html;ch
arset=Shift_JIS");
HTMLを生成プログラム
/ / デ ー タ の 出 力 に 必 要 な Pr i n t Wr i t e r を 作 成 す る 。
Pr i nt Wr i t er out = r es p ons e. g et Wr i t er ( ) ;
/ / * * HTMLタ
out . p r i nt l
out . p r i nt l
out . p r i nt l
グ と 受 信 し た メ ッ セ ー ジ を 出 力 す る **/
n( "<ht ml >") ;
n( "<b od y >") ;
n( "<hr >") ;
//投 稿 者 と 現 在 の 日 付 を 出 力 す る 。
out . p r i nt ( "<b ><f ont s i z e=4><p >"+ c o n t r i b u t o r + " オ リ ジ ナ ル < / f on t >
j a v a . ut i l . Da t e( ) + ") <BR/></p >") ;
//料 理 名 を 出 力 す る 。
ou t . p r i n t l n ( " < p > < f on t s i z e = 5 > 「 " + t i t l e + " 」 の レ シ ピ < / f on t > < / p > < h r / > " ) ;
//作 り 方 を 出 力 す る
out . p r i nt l n( r e c i p e +"</p ><hr />") ;
out . p r i nt l n( "</b od y >") ;
out . p r i nt l n( "</ht ml >") ;
</b> ( 投 稿 時 刻 : "+ new
メッセージ受信編 終了
では。実習です。


自分でコンセプトがあって、人が幸せになるよう
な掲示板を考えて、実装しましょう。
投稿できる項目は3つくらい作ります。
ヒント:浮かばない人は、
「みんなの書評を見れる掲示板」でいいですよ
1.書名
2.作者
3.書評
今回の掲示板
・投稿書き込みが1回だけできるレシピ投稿掲示板
・保存もできません
(Servletが生きている間のみ)
→1/4人前の掲示板
サブゼミの中で一人前に育てましょう
構造の復習

ディレクトリを作って関連ファイルを入れ
ましょう。それがWebアプリという宣言で
す。
(先回の復習)
今後は?

今後のサブゼミで書き込みを保存できるよ
うにします。
だんだん本格的になりますね。
お疲れ様でした。
来週からも頑張りましょう!
では、作業開始です。
なぜなら



ウェブに使われる文字コードは複数あって、
異なるコードが混在すると表示が混乱する。
そこで、あらかじめ出力文字コードを宣言して
おけば、ブラウザが正常に表示できる
<文字コード一覧 (名称・・・指定方式) >



シフトJIS ・・・Shift-JIS
JIS
・・・ iso-2022-jp
EUC
・・・ euc-jp