|
||||
|
|
暗黙のオブジェクト
|
|
|
暗黙のオブジェクトとは
スクリプトレットの紹介で以下のソースを紹介しました。
<%@page language="java"%>
<html>
<body>
<%
for(int i = 0; i < 10; i++){
for(int c = 0; c <= i; c++){
out.print("*");
}
out.print("<br>");
}
%>
</body>
</html>
上記で「out.print("*");」と記述していますが、この「out」とはどこで宣言されていて、何型のオブジェクトなんでしょうか・・ この変数は定義していませんが、正常に servletへ変換ですますし、コンパイルも正常に行えました。 これは JSPエンジンが暗黙のオブジェクトとして、宣言しなくても使える以下の9つの変数を提供しているためです。 response、pageContext、pageなど、実際あまり使用しませんが、SJC-WCの試験としては出題されますので覚えておきましょう。
out
outは javax.servlet.jsp.JspWriter型の変数になります。これまでにも何度かサンプルで使ってきましたが、 javax.servlet.jsp.JspWriterは JSPから クライアントへデータを送信するためのストリームを扱うクラスです。
outオブジェクトはクライアントへデータを出力する際に使用するため、紹介する暗黙オブジェクトの中でも最も使用頻度の高いオブジェクトと言えます。 このクラスはすべての基本データ型、String型、ユーザ定義オブジェクトを出力ストリームへ書き出すための printメソッド、printlnメソッドを提供します。
<%
int i = 0;
// 基本データ型の出力
out.print(i);
// String型の出力
out.print("Hello World");
%>
request
requestは、javax.servlet.http.HttpServletRequestインターフェイスの実装オブジェクトになります。requestオブジェクトはクライアントから送信されるフォームデータやクエリデータ、ヘッダ情報など HTTP要求の全般を扱うオブジェクトになります。
最も良く利用されるのは getParameterメソッドで ユーザが画面から入力した値を取得することですが、その他にも HTTPメソッドの取得(GETやPOST)や、クライアントのIPアドレス取得、またはヘッダからクライアントのブラウザ情報を取得することが出来ます。 リクエストパラメータの取得プログラム構成
ソース[sample_request1.jsp]
<%@ page language="java" contentType="text/html; charset=Windows-31J" %>
<%@ page import="java.util.*" %>
<html>
<body>
<table table width="400" border="1" cellspacing="0" cellpadding="2">
<tr>
<th width="50%">キー</th>
<th width="50%">値</th>
</tr>
<%
request.setCharacterEncoding("Shift_JIS");
Enumeration objEnm=request.getParameterNames();
while(objEnm.hasMoreElements()){
String strKey=(String)(objEnm.nextElement());
%>
<tr>
<td><%=strKey%></td>
<td><%=request.getParameter(strKey)%></td>
</tr>
<%
}
%>
</table>
</body>
</html>
今回はキー値の分からない複数パラメータが渡されることを想定し、Enumerationを利用して全ての「キー」「値」の組み合わせを出力しています。ただしキー値が分かっていれば、直接 request.getParameter(キー名) で値を取得することが出来ます。(むしろシステム構築上こちらのほうが一般的ですが、、)また、「 request.setCharacterEncoding("Shift_JIS")」と、リクエスト情報の文字エンコードを設定します。リクエスト情報に日本語が含まれている場合、このメソッドが正しく設定されていないと、文字化けしてしまうことになります。 動作サンプルそれでは上記のJSPにパラメータを渡してみます。今回はサンプルとして分かりやすいようにクエリ(URLの末尾に「?」以降 「キー&値」を指定する形式)でパラメータを渡してみます。 下のアドレスを指定すると、以下のようにキー、値が取得できたのが分かると思います。http://localhost:8080/wtomcat/jsp/sample_request1.jsp?name=Satoh&birth=19800101&addr=Tokyo
response
responseは、javax.servlet.http.HttpServletResponseインタフェースの実装オブジェクトになります。responseオブジェクトはリクエストに対して返される情報を扱ういます。outオブジェクトもクライアントへの情報出力を行いましたが、responseオブジェクトは 各ヘッダー情報、HTTPステータス、Cookieといった HTTPヘッダ部の出力を行います。
Servletでは HttpServletResponseを PrintWriterクラスを取得するために使用していましたが、JSPの場合 outがこの役目を既に担っているため、実際 resposeオブジェクトは Cookieの発行、エラーの送信位しかあまり出番がありません。 session
sessionは javax.servlet.http.HttpSession型の変数になります。 pageディレクティブの session属性が trueの場合に使用することができます。デフォルトで trueなので、falseを指定しない限り利用可能です。
先ずセッションとは、Webサーバ(アプリケーション)と Webクライアント(ブラウザ)の接続している状態のことをいいます。そして暗黙のオブジェクト sessionは、Webアプリケーションが各クライアントに対して個別に用意できるオブジェクトになります。 sessionオブジェクトとは、異なるページ間でデータを共有するため、 [ 各クライアントが Applicationとのセッションが確立されている間保持しつづけることが出来るオブジェクト ] と言えます。 sessionは一般的にログイン済みユーザであるか否かの確認などに利用されます。 下記サンプルでは、フォームから入力した名前を、遷移した次のページで参照するサンプルプログラムです。 セッションデータの取得プログラム構成
動作サンプル下記のように、一番初めのHTML画面(inputname.htm)で入力した名前「サンプル太郎」が最後の画面(getsession.jsp)で表示されています。このような画面をまたいだ動作は Cookieを使用しなければ実現できませんでしたが、sessionを使用することで容易に実現することが出来ます。
↓
↓
ソース[inputname.htm]<html> <body> <form method="post" action="../jsp/setsession.jsp"> お名前を入力してください。<br> <input type="text" name="name" maxlength="20" size="20"><br> <input type="submit" value="送信"> </form> </body> </html>[setsession.jsp]
<%@ page language="java" contentType="text/html; charset=Windows-31J" %>
<html>
<body>
<%
String strName = request.getParameter("name");
strName = new String(strName.getBytes("iso-8859-1"), "Shift_JIS");
session.setAttribute("name", strName);
%>
ようこそ。<br>
セッションの動作を試すために次のページへ遷移してください。<br>
<a href="getsession.jsp">getsession.jsp</a>
</body>
</html>
「session.setAttribute」で同一セッションであれば共有できる sessionオブジェクトに値を格納します。sessionオブジェクトに値を保持しておくことで、別の画面に遷移した後でも、「name」をキーとしてこの値を取り出すことが出来ます。[getsession.jsp]
<%@ page language="java" contentType="text/html; charset=Windows-31J" %>
<%
String strName = (String)session.getAttribute("name");
%>
<html>
<body>
あなたのお名前は 「 <%= strName %> 」 さんです。
</body>
</html>
「session.getAttribute」で格納されている値を取り出しています。getAttribute の戻り値は Object型のため、上記サンプルでは Stringへキャストして値を受け取ります。exception
exceptionは、java.lang.Throwable型の変数になります。本来例外がスローされた場合にアプリケーションサーバは既定のエラー画面が表示されますが、exceptionオブジェクトを使用して、特定のJSPページをエラーハンドラの役割で使用することができます。
exceptionオブジェクトは pageディレクティブの isErrorPage属性が trueに設定されている場合に使用することができます。 プログラム構成
ソース[rize_error.jsp]
<%@ page language="java" contentType="text/html; charset=Windows-31J" %>
<%@ page errorPage="/jsp/error_page.jsp" %>
<%
String str = null;
out.println(str.length());
%>
<html>
<body>
このページはスクリプトレットにて例外が発生します。
</body>
</html>
pageディレクティブの errorPage属性で「/jsp/error_page.jsp」をエラーページとして指定しています。このようにすることで、このページで実行時例外が発生したとき、指定したページに処理を委譲することが出来ます。[error_page.jsp] <%@ page language="java" contentType="text/html; charset=Windows-31J" %> <%@ page isErrorPage="true" %> <html> <head> <title>エラー</title> </head> <body> エラーが発生しました。<br> 内容は以下の通りです。 <hr> <pre> <%=exception.toString() %> <%=exception.getMessage() %> </pre> </body> </html>pageディレクティブの isErrorPage属性を「true」に設定しています。この値を「true」にしていないと exceptionオブジェクトは使用することが出来ません。 動作サンプル上記JSPを呼び出すt以下のように表示されます。exceptionオブジェクトを参照することで、例外の内容を画面に表示しています。http://localhost:8080/wtomcat/jsp/rize_error.jsp
|