JavaサーブレットとJSPの違い
http://oshiete.goo.ne.jp/qa/488861.html
1)JSPはHTMLの記述の中にJAVAのコードを記述することでコンパイルなしで※
データの受取りや動的なページの生成を行う技術
※内部的にはJSPコンテナというモジュールによって
自動的にコンパイルされServletに変換されている
→JSPもサーバー側で動作する
2)Servletを用いても動的なHTMLは作れるが、以下の問題点がある
・HTMLのコード全てをServletから送信しなければならないので面倒
・HTMLは画面デザインに関係してくるのでコンパイルが必要なServletに
記述していては画面の変更などをHTMLファイルのように簡単に行えない
3)JSPはコンパイルをせずHTMLファイルの中に直接JAVAコードを記述するだけで
動的なページを生成できるのでデザインの変更などが行いやすい
ただし、あまりJAVAコードを記述すると内容が複雑となり管理しにくくなる。
4)そこで役割としてサーバ内部の処理はServletで行い、
画面表示はJSPで行うというのが一般的な方法
JSPの使い方
<%@ page contentType="text/html;charset=Shift_JIS" %>
<html>
<head>
<title>Hello!!</title>
</head>
<body>
<% out.println("Hello!!"); %> ←このように<%~%>で囲む
</body>
</html>
※先頭の行はディレクティブというもの(後述)
※サーブレットのように、web.xmlなどないので楽。
※localhostフォルダへのxxx.xmlの登録は必要
※HTMLと同じだが、拡張子は.jspである。
※初回起動時は、サーブレットへの変換を行うため若干の時間を要する。
※「out」と言う変数を特に宣言せずに利用している。
これは暗黙オブジェクトと呼ばれるもので、JSPページで
最初から利用できるようになっているオブジェクトである
JSPの変換した後
JSPはサーブレットに変換されるが、
「(Tomcatがインストールされたディレクトリ)\work\Catalina\localhost\」に
.javaと.classが保存される。
ディレクティブ
日本語にすると「指示文」という意味。JSPページのヘッダーのようなもの。
構文は以下の通り
<%@ ディレクティブ名 属性名1="値1" 属性名2="値2" ... %>
ディレクティブ名:「page」「include」「taglib」の3つがある
属性名:ディレクティブ名ごとに異なる
http://www.javadrive.jp/servlet/jsp_directive/を参照
MIMEタイプを指定するものや、Javaクラスのimportなどを設定できる
また、他のJSPをincludeすることも可能
スクリプティング
1)スクリプトレット
スクリプトレットとは、JSPの中でJavaのコードを記述する部分のこと
<%
Javaのコード
%>
スクリプトレットが1つのJSPページ内で分かれていても
変数名などは共有して使われる
2)変数値出力の省略形
<%= 変数名など %>
改行は入らない
3)変数の宣言方法
<%!
変数や定数の宣言
%>
・サーブレットに変換されたときに、
Javaソースでの変数宣言が行頭になる
(_jspServiceメソッドよりも前)
・再読み込みしても値がクリアされない
→初期化は一回だけ。
スクリプトレット内の変数宣言は、その位置で初期化されるので
再読み込みで値が初期化されてしまう
4)メソッドの宣言
<%!
メソッドの宣言
%>
・メソッドを呼び出しを使えるようになる
・暗黙オブジェクト(outなどの変数)は使えない
→_jspServiceメソッドで宣言されているから
5)コメント
<!-- HTMLのコメント -->
<%-- JSPのコメント --%>
・HTMLのコメントはクライアントに表示されるが、
JSPのコメントはクライアントに表示されない
・もちろん、スクリプトレット中なら、
// や /* */ が使える
標準アクション
JSPで最初から用意されているアクション
ページの転送や結果のインクルードなど、良くつかわれる機能は
Javaコードがすでに用意されていて、それを使える
<jsp:アクション名 属性名1=属性値1 属性名2=属性値2 ... >
転送の例)
<jsp:forward page="forwardTo.jsp" />
※パラメータを渡して転送することも可能
JSPの余談
"\n"やout.printlnは、テキストレベルでの改行は行われるが、
<br>に変換されるわけではないので、
ブラウザ上での見た目に差はない