2012年3月7日水曜日

やり直し JAVAサーブレット(基礎からのサーブレット/JSP [改訂版] )その5

(p112) はじめに


チャプター10以降の開発環境を選択させている。
・Eclipseを使った開発
・コマンドラインでの開発

前者の場合は、P442~P465を習得してからチャプター10を始める。
後者の場合は、これまでのentryフォルダ(Webアプリケーション)の箱に代わり、
basicフォルダを作成し、これまで通り、階層構造にする。




(p114) 入力パラメータの取得


ブラウザからサーブレットに渡される値を、入力パラメータと呼ぶ。
テキストでは、3つの『入力パラメータを扱う HttpServletRequest のメソッド 』
が紹介されている。
String getParameter(String name)
String[] getParameterValues(String name)
Enumeration getParameterNames()
 これらは、 HTTPというネットワーク間での情報のやり取りに関する約束事に
準拠したデータから、コンテナ(tomcat)が生成したRequestインスタンスが持つ
いくつかのメソッドの内の、ブラウザからの入力パラメータを扱う3つのメソッド。
と言い換えられるかなぁと、理解を深めるためにイメージを膨らませてみた。


(p114) この章で作成するサンプル

作成したファイルを配備する階層が示されている。
basic
input     … JSPファイル(○○ . JSP)などを配備
WEB-INF
src
input … javaファイル(○○ . servlet) を配備
classes
input …  クラスファイル(○○ . class)を配備(コンパイルすると自動配備)


<p116> 作成するファイル

List10-1 echo.jsp とList10-2 EchoServlet.javaを作成し、
所定のフォルダに保存。
EchoServlet.javaをコンパイルし、. classファイルも所定の場所に生成された事を確認。
web.xml を作成して、WEB-INFフォルダに配置。

ブラウザから echo . jsp 呼び出す(自動的に”○○ . java ” , ” . class ”が生成される)。

その後、ブラウザの textbox に文字を入力し送信ボタンを押下すると、
エラーメッセージが表示される。
どうやら、
” <FORM ACTION=" . . /servlet/input . EchoServlet"> ” の記述が良くないようだ。

EchoServlet . class を起動させたい場合は、” /EchoServlet ” とブラウザに入力する。
※web.xml に マッピングした通り
JSPファイルから EchoServlet を起動させたい時は、


”<FORM ACTION ”タグ内に、”  . . /EchoServlet ” を指定する。

テキストで、” . . /servlet/input . EchoServlet ”と記述してあるのは、
invoker サーブレット の関係(小生はtomcat7 の為有効にしていない)なのだろう。
この辺の事でも初心者には原因を突き止めるのが難しい。
もう少し説明が欲しいところだ。

適切に修正し,、
ブラウザのテキストボックスに ” ai ” と入力し、送信ボタンを押下すると、
ブラウザはHTMLに記載されている(<form action=”~”>)通り、
EchoServlet を呼び出し(ブラウザのアドレス欄が自動的に…)、
” ai ” というデータを渡す。

ブラウザのアドレスランには ”EchoServlet”(サーブレット名)と
”message=ai”(入力パラメータとデータ)を ” ? ” で結合しているのが
見て取れる。



テキストボックスに入力された文字列 ” ai ” は html(JSP)ファイルで用意
された ” message ”という入れ物に格納され、EchoServletに渡された。

【クライントは、http に準拠した形式でWebサーバを指定し、データを送る 】

Webサーバ(コンテナ)はそのデータを元にリクエストインスタンスを生成し、
サーブレット(EchoServlet)に渡す(同時にレスポンスインスタンスを渡す)。

EchoServlet の doGet() メソッドは2つのインスタンスを元に処理を実行する。
ここでは、リクエストインスタンスが持つ getParameter()メソッドで、
ブラウザが message という変数に格納した文字列を msgと いう変数に
入れている。

レスポンスインスタンスが持つ、setContentType()メソッドで文字タイプなどを
設定し、

レスポンスインスタンスが持つ、getWriter()メソッドで out と言う変数に
PrintWriterクラスのインスタンスを生成した後、アドレスを格納している。

out が示す インスタンスの println() メソッドで、ブラウザへ返す文字列を出力
している。


(p119) 日本語を入力する

URLエンコードとは、WebブラウザとWebサーバ間でのデータ伝送を行う際に、
入力パラメータに収まったデータ(日本語)は、16進数2桁の文字コードに変換
される等の約束事がありますが、 サーバに送るデータ部を明瞭に示す為と
言う事ですね。 indexさんのページで勉強させてもらいました。

「xyz=x=a」と記述された場合は、データ部を解釈できないからです。
この問題を解決するためにURLエンコードという手法を使い、データ部を特殊文字に置き換える
事によって解決します。「xyz=%82%A1%AB%62」 。

テキスト通り ” EchoServlet2 ” を入力し日本語を表示させたいと思ったのですが、
期待した結果が得られず、先へ進むことにしたが(残念)、


文字化け解消法はこちら
要は、サーブレットの doGet() メソッド内で、まず先にエンコーディングを指定する
事が重要と言う事ですね。


(p121) TomcatのGETパラメータのデコード

小生が現在使っている tomcat は 7 なので、テキストで示している
” useBodyEncodingForURI ” は無い。 



情報処理 再チャレンジ ブログ ホーム へ

0 件のコメント:

コメントを投稿