2012年3月3日土曜日

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

(p86) はじめてのJSP

JSPは コンパイルが不要で、web . xml への登録も不要。
作成した . JSP ファイルはコンテキスト名直下(entryフォルダ内)に置く。
tomcat は起動している必要がある。
htmlファイルと同じような特徴です。
JSPのコードもHTMLの中に埋め込むような格好になっている。

コンテキストとは? コンテキスト名とは?(復習) 
http  :  //    localhost   :   8080   /    entry   /   hello.txt
プロトコル      サーバ名     ポート番号   コンテキスト名 ファイルのパス

JSPの式(Expression)とは、
” <%= ”、” %>” で囲む。 


(p88) JSPはサーブレット

この章の始め(p86)に、『JSPはサーブレットと違って…』という記述があったの
だけれど、JSPはサーブレットらしい。クライアントからリクエストが発生した際
コンテナは、

①” . jsp ” ファイルを ”. java”ファイルに変換し、
②その” . java ” ファイルがコンパイルされ、
③”. class”ファイルが生成され、
④”サーブレットのインスタンスが生成される。
という4段階の過程を踏むらしい。
よって、最初にアクセスがあった場合のみ、変換やコンパイルで時間が長くかかるらしい。

これまで、サーブレット(”○○servlet . java” ) を記述した場合、
意識して WEB-INF フォルダ内の src フォルダ を探し、そこに保存してから、
コンパイルするという(class フォルダへ class ファイルの保存は自動的だが)。
少々面倒なことを意識し、  さらには、web . xml に登録しなければならなかったが、
JSP はそれらが不要と言うことですね。
ちなみにコンテナが①~④を実行してくれますが、
” . java ” ファイルや、”. class ” ファイルは、

使用中の tomca tフォルダ > work フォルダ >Catalina フォルダ >localhost フォ
ルダ >entry フォルダ >org フォルダ >apache フォルダ >jsp フォルダ 内に保存
されています。


(p89) JSPを変更した場合

サーブレットを変更した場合は tomcat を再起動(Webアプリケーションをリロード)
する必要がありましたが、JSPの場合は不必要。 なぜ?
それは、JSPにアクセスした時に、再び ①JSPの変換、②javaコードのコンパイル、
③classファイルの生成、④サーブレットインスタンスの生成が行われるから。


(p90) スクリプトレットを使ってみよう

スクリプトレットとは、見た感じ ”JSPの式” に似ている。
<%= ○○○ %>  …  JSPの式
<%   ○○○  %>  …  スクリプトレット

スクリプトレットにはjavaのコードを記述できる。


(p91)  出力用の変数out

out はオブジェクト? 変数? 混乱してきた。
ググッたら、 わかりやすいブログを見つけたので勉強させてもらいました。
稲員勇輝さんありがとうございました。

コンテナは、
" . jsp ファイル” をサーブレットに変換する際に、予めよく使うであろう変数
( out を含む) を宣言してくれているらしい。 よって、JSPコード内でいちいち
out を宣言しなくてもすぐ使えるようになっている。
これも JSP が楽チンであると言う要素ですね。

この out 変数 には、
JspWriter . class 型のインスタンス(インスタンスのアドレス)が入るようになっている。
JspWriter . class 型を詳しく調べたわけではありませんが、どうやらブラウザへの
レスポンスインスタンス(response)に出力する機能を持っているようですね。 

” out ” はオブジェクトと短絡的にイメージしていたが、厳密には
” out ” は インスタンスが存在するメモリー上のアドレスが入るわけで、
変数ですね。

たぶん小生の認識で間違いないと思うのですが、いろいろ確認してみてください。


(p94) JSPのコメント

<%-- JSP Comment --%>  これがJSPのコメント
<!-- JSP Comment -->    これはHTMLのコメント

JSPをサーブレット(javaコード)に変換すると、 javaコードの中にHTMLを生成するが、

そのHTMLの中に <%-- JSP Comment --%>は存在しない。
 
<!-- JSP Comment --> はブラウザでは表示されないが、HTML には存在する。

(p95)コンテンツタイプの指定

JSPでコンテンツタイプを指定するには、” page ディレクティブ ” を使用する。
<%@page contentType="text/html ;  charset=Windows-31J" %>

ディレクティブとは?
<%@ ○○○ %>で記述するタグを言う。
これに、page が付く ( <%page ○○○ %> )と、
ページディレクティブとなる。


(p97) import宣言

外部クラスをインポートする場合は、page ディレクティブの import 属性を使う。
ここでは、現在時刻を表示する訳だが、”java.util.Date”クラスが必要となり、
JSPコードの最初の段階で、
<%@page import= "java.util.Date" %> でDateクラスをインポートしている。

このおかげで、<%= new Date() %> の記述で、日付が求められる。

このインポートの記述は、複数行に分けて、複数インポートすることもできる。
また、ワイルドカード(*)により1行で複数インポートすることもできる。

javax.servlet、javax.servlet.http、javax.servlet.jsp パッケージについては、
デフォルトでインポートされるので記述はいらない。


(p102) コンテキストパスを理解する

”コンテキスト” とは、個々のWebアプリケーション(これまでの内容では ”entry”)

|←      リソースのURL                                  →| 
|←      WebアプリケーションのURL               →|
|←      サーバのURL          →|

 http : // localhost : 8080  /   entry     /   hello.txt
                ↑        ↑         ↑         ↑     ↑
             サーバ名  ポート番号  コンテキスト名     ファイルのパス
                                   
※コンテキストルート         コンテキストパス = コンテキストルートまでの道のり


コンテキストルートには index.html ファイルなどが配備してありますね。

よって、context.jspでは、
サーバのルート("/" = http://localhost:8080)では、
TOMCATのページが表示され、
リクエストインスタンスの getContextPath() メソッドが返す文字列(”/entry” ※)
では、index . html が表示される。
※ 絶対URLに直すと ”http://localhost:8080/entry” と言うことだが、
少々もやもやしている。 


(p105) JSPからサーブレットを呼び出す

テキスト通りコードを入力するも、期待通りの結果は得られない。
”サーバルート”からのパス” は ”servlet”を削除(小生のtomcat7では
invoker を利用できない)することで、表示されるようになったが、
”カレントからのパス” は どのように修正してもエラーとなる。 
そもそも、ここで言う ”カレント(. jspファイルから?)からの” の意味が良く
わからない。理解していないのか?!

いろいろ試した結果、


<p><a href="../../../entry/HelloServlet">HelloServlet</a>
(カレントからのパス)

と変更することで期待通りの結果が表示された。

JSPコードからjavaコードに変換されて、コンパイルで生成されたクラスファイルは

 tomcat7\work\Catalina\localhost\entry\org\apache\jsp 

ここに保存されているということですかね。

まだ、知識が浅いようだ。

取り敢えず先へ進むこととする。



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




0 件のコメント:

コメントを投稿