独習Javaサーバサイド編第2版 第2章まとめ
/WEB-INFと/META-INF
JSP&サーブレットで特別な意味を持つフォルダ
HTTP経由でアクセスすることができない
エラーが発生したときは
・スペリングに誤りがないか、大文字小文字は区別されているか(<%~%>や<%@~%>で囲まれた中身は要注意)
・日本語以外の部分はすべて半角文字で記述しているか
・ファイルの保存形式は適切か
・ファイル名や保存先は間違っていないか
拡張子の基本
Tomcatは拡張子が.jspであるファイルが要求されたタイミングでJSPの実行エンジンを起動する
ファイル名そのものはスクリプトの内容が類推しやすく、シンプルに命名する
ファイル名に含んで良いのはシングルバイト文字(英数字やハイフン、アンダースコアなど)だけ
原則としてマルチバイト文字(日本語)を含めるべきではない
JSPページの構造
HTMLをベースに、さまざまな出力ルール(プログラム)を埋め込むことができる HTML埋め込み型 の言語である
JSPページで使える主な要素
・ディレクティブ:ページ単位の処理方法を指定
<%@~%>
・宣言部:変数や定数、ユーザー定義メソッドを宣言
<%!~%>
・スクリプトレット:ページの処理方法を記述
<%~%>
・式(Expression):指定された式を出力
<%=~%>
・アクションタグ:定型的な処理をタグの形式で記述
<jsp:~>
・コメント:処理に際しては無視される備考を記述
<%--~--%>
宣言部、スクリプトレット、式を総称して スクリプティングの要素 という
ここに書いた以外の箇所を HTMLテンプレート(固定テンプレート) という( < html> < /html> とか)
コードが正しいのにちゃんと表示されないときは
JSP&サーブレットコンテナはHTMLテンプレート部分を単なる文字列として解析する
HTMLテンプレートの部分が間違っていてもJSPとしてはエラーにならない
サーバサイド(コンテナ)で解析されるのかクライアントサイド(ブラウザ)で解析されるものなのかきちんと区別すること
ブラウザからソースの表示を確認するとJSPによって作成されたHTMLだけを確認できる
文字コードの作成
コンピュータの世界では文字の情報をコードとして表現する
それぞれの文字に割り当てられたコードを 文字コード 、実際の文字と文字コードの対応関係のことを 文字エンコーディング という
サーバからクライアントにデータを送信するとき、サーバ側で文字列をあらかじめ決められた文字コードに基づきエンコード(符号化)し、クライアント側でデコード(復号化)するという処理が行われている
文字化けなどを起こさないよう、ページをクライアントに送信するにあたって文字コードの情報も通知する必要がある
ディレクティブ(指令)
JSPページの処理方式をコンテナに伝えるための仕組み
コンテナがページを解析/処理するための情報を設定できる
多くの場合ページ全体にかかわる宣言を行うので先頭に記述するのが好ましい
基本構文
<%@ ディレクティブ名 属性名1="属性値1" 属性名2="属性値2"...%>
属性値は数値でも文字列でも必ずダブルクォートで囲む
ディレクティブ名、属性名、属性の値が文字列である場合属性値も、大文字小文字が区別される
JSPで利用可能な主なディレクティブ
・@page:ページの基本的な処理方法を決める
・@include:外部ファイルをインクルードする
・@taglib:ページ内で使用するタグライブラリを宣言する
・@attribute:タグファイルで使える属性を宣言する(タグファイルでのみ使用可)
・@tag:タグファイルの基本情報を定義する(タグファイルでのみ使用可)
・@variable:タグファイルで使える変数を宣言する(タグファイル内でのみ使用可)
ページの処理方法を決める
@pageディレクティブは同じページの中で複数記述しても良いが同じ属性を2回以上指定することはできない(例外あり)
@pageディレクティブの主な属性
・contentType:ページのコンテンツタイプ
デフォルト値:text/html
デフォルト値:contentTypeの属性の値
・buffer:出力バッファのサイズ(単位はキロバイト)
デフォルト値:8
・autoFlush:バッファサイズを超えた場合に自動出力を行うか
デフォルト値:true
・import:インポートするパッケージ/クラス(複数指定の場合はカンマ区切り)
デフォルト値:java.lang.*,javax.servlet.*.javax.
servlet.jsp.*,javax.servlet.http.*
・errorPage:例外発生時に表示するエラーページのパス
デフォルト値: -
・isErroePage:現在のページがエラーページであるかどうか
デフォルト値:false
・isELIgnored:式言語を無視するか
デフォルト値:false
・session:セッション機能を使用するか
デフォルト値:true
・info:ページに関するメモ情報
デフォルト値: -
・language:使用している言語
デフォルト値:java(固定)
コンテンツタイプを宣言する
コンテンツタイプとはインターネット経由でやり取りされるデータの種類を表す情報のことで@oageディレクティブのcontentType属性で宣言する
MINE(Multipurpose Internet Maik Extension)タイプとも
ContentType属性は以下の形式で表せる
コンテンツタイプ;charset=文字コード
主なコンテンツタイプの種類
・application/octet-stream:バイナリデータ
拡張子: -
・application/pdf:Acrobat文書
拡張子: .pdf
・image/gif:GIFイメージ
拡張子: .gif
拡張子: .jpeg .jpg
・text/css
拡張子: .css
拡張子: .xml
拡張子: .mpeg .mpg
出力文字コードとページ文字コード
pageEncoding属性は.jspファイルを記述した文字コードを表す
.jspファイルの文字コードと実材に出力する文字コードが等しい場合には省略可
バッファ処理を有効にする
バッファ(Buffer)とはJSPページが処理を行った場合にその処理結果を一時的に蓄積するメモリ上の倉庫のようなもの
処理結果をバッファに蓄積することを バッファリング という
ある程度データがまとまったところでまとめてデータを運べるのでサーバ/クライアント間のやり取りの回数が抑えられ結果的に処理効率を高められる
ただし処理に時間がかかるページでは一定の処理が終わるまでサーバからデータが送信されないのでユーザの体感速度としてはむしろよくないこともある
バッファとして確保するサイズを調整し、処理速度と体感速度を最適化するべき
JSPはデフォルトで出力が指定されたバッファサイズを超えたところでそれまでの内容をいったん自動出力する
値にnoneを指定するとデータはバッファに蓄積されない
クラスライブラリをインポートする
JSPではJavaにあらかじめ用意されている、またはサードベンダが提供する(自作も含む)クラスライブラリを自由に使える
import属性はJSPであらかじめどのクラスライブラリを使うかを指定しておくためのもの
@pageディレクティブの中で唯一、何度でも指定できる属性である
値はパッケージ単位/クラス単位どちらも可
アクションタグ
JSPページの中で実現される処理の中でも特に典型的な処理をJavaのコードを記述することなくHTMLにもよく似たタグの形式で記述できるようにした仕組み
Javaを知らなくてもページを記述できるのでプログラマとデザイナとが分業しやすい
アクションタグの基本的な用法
jso:includeタグはpage属性で指定されたファイルを現在のページの指定位置に取り込むためのアクションタグ
<jsp:include page ="includeするファイル" flush ="includeする前に強制的に出力を行うか" />
指定された外部ファイルを現在のページにincludeする
アクションタグは厳密にはXML構文に則した書式で記述する
閉じタグは省略できない
属性値は必ずダブルクォートでくくる
インクルードファイルではpageEncoding属性が必須
インクルードファイルを記述する場合 pageディレクティブのpageEncoding属性が必須 である
インクルードファイルを含むページでは
・親ページの文字コードはcontentType属性で宣言
・子ページの文字コードはpageEncoding属性で宣言
スクリプティング要素
スクリプティング要素を使うことでJSPページの中にJavaのプログラムを埋め込むことができる
このような方式をページインライン方式という
(スクリプティング要素は本格的なコーディング向きではない)
スクリプトレット
<% Javaのコード %>
<%~%>の中のコードをJavaプログラムとして解釈、実行する
一つのスクリプトレットは1つ以上の命令文から構成され、1つの命令は必ずセミコロンで終わる
ブロックの中では日本語文字列を出力する場合を除いてシングルバイト文字しか使用できない
「out.println」のoutは暗黙オブジェクトの一種でクライアントへの出力を行うための一連の機能を提供する
暗黙オブジェクトとはスクリプトレットや式の中で特別な前準備を行うことなく利用できるJSPページ固有のオブジェクト
void print(T str) throws IOException
void println(T str) throws IOException
str:出力する値(Tは任意のデータ型を指定可能であることを表す)
指定された文字列をクライアントに出力する
文字列の末尾に改行を付与したい場合printlnメソッドを使用する
暗黙オブジェクト
JSPで使える主な暗黙オブジェクト
・application:コンテナに関する情報やユーザ間で共有可能な情報を管理
・config:サーブレット初期化パラメータにアクセスする手段を提供
・exception:ページ内で発生した例外情報を管理(@pageディレクティブのisEErrorPage属性がtrueの場合のみ利用可)
・out:クライアントにデータを出力する手段を提供
・page:JSPページそのものを表す(.jspファイルで利用することはほとんどない)
・pageContext:ページ単位で利用可能な情報、暗黙オブジェクトへのアクセス手段提供(タグハンドラクラスで利用。jspファイルで利用することはほぼない)
・request:クライアントから送信されたリクエスト情報にアクセスする手段を提供
・response:クライアントへの応答を操作する手段提供
・session:セッション単位で保持可能な情報を管理(@pageディレクティブのsession属性がtrueの場合のみ利用可)
スクリプトレットと固定テンプレート
スクリプトレットと固定テンプレートは入れ子にして記述できる
ある程度まとまった文字列の出力がスクリプトレットに含まれている場合、積極的に固定テンプレートに切り出すことでコードをよりシンプルに記述できる
宣言部
JSPページで変数を使用する場合宣言部またはスクリプトレットの中であらかじめ宣言する必要がある
宣言部で記述できるのは変数/メソッドの定義のみ
変数はスクリプトレットでも記述できるがメソッドは必ず宣言部で記述する
宣言部では暗黙オブジェクトは利用できない
変数の有効範囲が異なる
<%!~%>の中で宣言された変数はJSPコンテナが起動している間ずっと有効である
スクリプトレットで宣言された変数はページの処理が終了するたび破棄される
同時アクセスの注意
宣言部で宣言された変数が同時アクセスを考慮した設計になっていない(このような状態を スレッドセーフでない という)
宣言部では原則として読み取り専用の変数以外を定義すべきではない
式
単純な値を出力する場合にスクリプトレットの代替として使用することができる
記述の注意
式はあくまでout.printメソッドの引数部分を切り出した省略形なので、複数の変数を続けて記述することはできないし、他のスクリプトを併記することもできない
コメント
コメントの記述は必須ではないが長期的なプログラムの保守を考えた時プログラムを後から読むことを考えれば大事な要素である
・宣言された変数の意味、用途
・クラスやメソッドの概要、引数、戻り値など
・プログラム改定時の履歴(改定日時や対応内容など)
・その他意味あるブロック単位での処理の概要
JSPで利用可能なコメント
4種類のコメントを使い分けられる
・<%--~--%>
JSP独自のコメント
サーブレットやJavaBeansなどでは使えない
宣言部やスクリプトレット内で使用できない
ページ内の複数ブロックをまとめて無効にしたい場合などに利用する
・//
単一行のコメント
サーブレットなどでも使用可
JSP内では宣言部、スクリプトレットで使用
クライアントにはこの箇所はHTMLとして送信されないので変数やメソッドなどのメモ的情報を記述する
・/*~*/
複数行のコメント
サーブレットなどでも使用可
JSP内では宣言部、スクリプトレットで使用
・<!--~-->
HTMLのコメント
宣言部やスクリプトレットでは使用できない
ユーザからも見えてしまうので、ユーザが参照する可能性のある情報(管理情報など)を記述したり、デバッグ時に出力したHTMLを確認するための目印などを埋め込みたい場合便利