連載
» 2003年06月20日 00時00分 公開

基礎から学ぶサーブレット/JSP(6):JSPの基本「暗黙オブジェクト」をさらに極める (3/3)

[山田祥寛,@IT]
前のページへ 1|2|3       

カスタムエラーページを作成する−exceptionオブジェクト−

 exceptionオブジェクトは、JSPページ内で処理されない例外(エラー)があった場合、その例外情報を捕捉し、また、エラーページでは参照するためのオブジェクトです。

 @pageディレクティブのisErrorPage属性がtrue(デフォルトはfalse)になっている場合のみ有効な暗黙オブジェクトで、falseの場合には使用できません。

カスタムエラーページ

 デフォルトで表示されるエラーページは、開発者向けのものです。エラーが発生するまでのスタックトレースや例外が発生した個所のコードなどが表示されます。

 しかし考えてみてください。サーバサイドのコードには、さまざまな「秘匿すべき情報」が含まれています。データベースにアクセスするためのユーザーIDやパスワードなどがまさにその一例です。

 つまり、デフォルトのエラーページとは、本来、ユーザーに「見せてはならない」ページにほかならないのです。そこで、利用ユーザー向けに実運用局面では専用のカスタムエラーページを設置するのが一般的です。

 以下のサンプルでは、exception_miss.jspで例外が発生した場合に(指定された初期化パラメータ「nothing」は存在しないものとします)、errorPage属性で指定されたカスタムエラーページexception_error.jspにリダイレクトします。

exception_miss.jsp
<%@ page contentType="text/html;charset=Shift_JIS"
errorPage="exception_error.jsp" %>
<% Class.forName(application.getInitParameter("nothing")); 
%>
exception_error.jsp
<%@ page contentType="text/html;charset=Shift_JIS" 
isErrorPage="true" %>
<html>
<head>
<title>カスタムエラーページ</title>
</head>
<body>
<h1>エラーが発生しました</h1>
<hr />
<pre><%=exception.toString()%></pre>
<% application.log(exception.toString()); %>
</body>
</html>
カスタムのエラーページ カスタムのエラーページ

 toStringメソッドは、発生した例外クラス名とエラーメッセージとを表示します。また、同様の内容をコンテナの標準ログに記録します(logメソッド)。

exceptionオブジェクトのそのほかのメソッド

 以下に、ここまで紹介したtoStringメソッドのほか、exceptionオブジェクトに用意されている主なメソッドを挙げておきます。

表6 exceptionオブジェクトの主なメソッド
メソッド 概要
getLocalizedMessage() 地域対応されたエラーメッセージを取得
getMessage() 詳細なエラーメッセージを取得
printStackTrace(out) スタックトレースをPrintWriterオブジェクトoutに出力
toString() 例外クラス名とエラーメッセージを取得

exceptionオブジェクトは、@pageディレクティブのisErrorPage属性がtrueであるページ内でのみ使用することができ、ページ内で発生したエラー情報を管理します。


ページ固有の初期化パラメータを管理する−configオブジェクト−

 configオブジェクトは、デプロイメント・ディスクリプタ(WEB-INF/web.xml)上で定義されたサーブレット/JSP個々の初期化パラメータにアクセスするための一連のメソッドを提供します。

 configオブジェクトが扱うのは、あくまでページ内でのみ使用される初期化パラメータに限定されますので、アプリケーション共通の初期化パラメータを表現したい場合には、applicationオブジェクトを使用してください。

ページ固有の初期化パラメータ

 以下のサンプルでは、web.xml上で定義された初期化パラメータ「driverName」と「connectString」を引用し、データベースへの接続を確立してみることにしましょう。先のapplication_init.jspの例と異なり、ほかのページからはここで設定されたパラメータは参照できない点に注意してください。

 データベース接続情報などは、一般的にアプリケーション共通の初期化パラメータとして指定するのが普通ですが、ここでは、ページ固有のパラメータとして要素配下に指定してみることにします。

config.jsp
<%@ page contentType="text/html;charset=Shift_JIS" 
import="java.sql.*" %>
<%
Class.forName(config.getInitParameter("driverName"));
Connection db=DriverManager.getConnection(
config.getInitParameter("connectString"));
/* データベースへの一連の処理 */
db.close();
%>
web.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <servlet>
    <servlet-name>config</servlet-name>
    <jsp-file>/chap5/config.jsp</jsp-file>
    <init-param>
      <param-name>driverName</param-name>
      <param-value>org.gjt.mm.mysql.Driver</param-value>
    </init-param>
    <init-param>
      <param-name>connectString</param-name>
      <param-value>jdbc:mysql://localhost/dbNameXx?user=UserXx&password=
passwordXx&useUnicode=true&characterEncoding=Shift_JIS</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>config</servlet-name>
    <url-pattern>/chap5/config.jsp</url-pattern>
  </servlet-mapping>
</web-app>

 config.getInitParameterメソッドは、web.xmlの要素で定義された初期化パラメータを取得します。getInitParameterメソッドは指定されたパラメータ名をピンポイントで取得しますが、もしも定義されたすべての初期化パラメータ(名)を取得したいという場合には、getInitParameterNamesメソッドを使用します。

 デプロイメント・ディスクリプタの要素は、サーブレット/JSPの固有情報(論理名や初期化パラメータなど)を定義する際に使用することができます。要素は、要素で指定された論理名()に対して、マッピングするURLパターンを設定します。これらの設定については、本連載の「デプロイメント・ディスクリプタ」の回で紹介することにします。

configオブジェクトのそのほかのメソッド

 以下に、ここまで紹介したgetInitParameterメソッドのほか、configオブジェクトに用意されている主なメソッドを挙げておきます。

表7 exceptionオブジェクトの主なメソッド
メソッド 概要
getInitParameterNames() すべての初期化パラメータ名を取得
getServletName() 現在のサーブレット論理名(要素)を取得

configオブジェクトはページ固有の初期化パラメータを参照する際に用います。初期化パラメータ情報はデプロイメント・ディスクリプタ上、要素によって定義することが可能です。



 以上、JSPページで使用することができる主な暗黙オブジェクトについて、かなり駆け足ながら紹介してきました。もちろん、暗黙オブジェクトの用途はここで紹介した内容に限定されるものではなく、JSPページ全般で広く使用されるものです。さらに詳細を学習したいという方は、拙著『今日からつかえるJSP&サーブレットサンプル集(基礎編・応用編)』(秀和システム)や『プチリファレンスJSP&サーブレット』(同)、『10日でおぼえるJSP/サーブレット入門教室』(翔泳社)を参考にしてみてください。

 次回からは、いよいよJavaに豊富に用意された主要なクラスライブラリを活用して、より実用的なJSPアプリケーションに挑戦することにします。どうぞお楽しみに。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。