サーブレットの処理

HttpServlet クラスと GenericServlet クラスには、情報にアクセスするメソッドおよびメッセージを記録するメソッドがあります。次の表で、これらのメソッドについて説明します。
メソッド
説明
getInitParameter
サーブレットの初期化パラメータの値を返します。
getInitParameterNames
サーブレットの初期化パラメータ名を返します。
getServletConfig
ServletConfig オブジェクトを返し、初期化パラメータやコンテキスト情報にアクセスできます。サーブレットメソッドにはこの情報にアクセスするメソッドがあるので、通常 、getServletConfig は使用しません。
getServletContext
ServletContext オブジェクトを返すので JRun と対話するメソッドにアクセスできます。
getServletInfo
サーブレット情報を String として返します。情報を返すようにするには、このメソッドをオーバーライドする必要があります。
getServletName
サーブレットのインスタンス名を String として返します。
log
ログファイルにメッセージを書き込みます。

初期化パラメータの使用

ServletConfig オブジェクトを使用して各サーブレット定義から、またアプリケーション内のすべてのサーブレットのパラメータを提供する ServletContext から初期化パラメータを取得できます。

サーブレット特有の初期化パラメータ

サーブレット特有の初期化パラメータを取得するには、次の例に示すように、ServletConfig オブジェクトの getInitParameterNames メソッドと getInitParameter メソッドを使用します。

...
  ServletConfig config = getServletConfig();
  Enumeration eParmNames = config.getInitParameterNames();
  while (eParmNames.hasMoreElements()) {
    String parm = (String) eParmNames.nextElement();
    out.println(" " + parm + ":" + config.getInitParameter(parm) + 
"<br>");
  }
...

サーブレット特有の初期化パラメータは、次の例に示すように、Web アプリケーションのデプロイメントディスクリプタの servlet 定義で設定します。

<web-app>
...
<servlet>
  <servlet-name>ConfigParams</servlet-name>
  <servlet-class>ConfigParams</servlet-class>
  <init-param>
    <param-name>datasourcename</param-name>
    <param-value>lightgoldenrodyellow</param-value>
  </init-param>
</servlet>
...
</web-app>

詳細については、 「ServletConfig オブジェクトの使用」 を参照してください。

アプリケーション全体の初期化パラメータ

アプリケーション内のすべてのサーブレットが共有する初期化パラメータを取得するには、次の例に示すように、ServletContext オブジェクトの getInitParameter メソッドと getInitParameterNames メソッドを使用します。

...

ServletContext context = this.getServletContext();
Enumeration parmEnum = context.getInitParameterNames();
if (parmEnum.hasMoreElements()) { 
  out.println("<h2>ServletContext Init Parameters</h2>");
}
while (parmEnum.hasMoreElements()) {
  String name = (String)parmEnum.nextElement();
  out.println("<b>"+name+":&nbsp;</b>");
  out.println(context.getInitParameter(name) + "<br>");
}
...

次の例に示すように、アプリケーション全体の初期化パラメータは、Web アプリケーションのデプロイメントディスクリプタで、servlet 定義の外側で設定します。

<web-app>
...
<context-param>
  <param-name>datasourcename</param-name>
  <param-value>fred</param-value>
</context-param>
...
</web-app>

ServletContext オブジェクトの使用

ServletContext オブジェクトを使用すると、アプリケーション情報を保管したり、アプリケーションのさまざまなコンポーネント間で情報を共有したりすることができます。

たとえば、アプリケーションが複数のサーブレット (Java で書かれたものや JSP として書かれたもの)、HTML タグ、およびデータベースで構成されているとします。これらのアプリケーションコンポーネント間で情報をやり取りするには、アプリケーションコンテキストを使用して、その情報を保管したり、取り出したりすることができます。コンテキストオブジェクトを通じて使用できる情報には、次のものがあります。

また、アプリケーションコンテキストには、Web サーバへのアプリケーションの実装に伴って、アプリケーション情報が保管されます。この情報には、アプリケーションコンポーネントのファイルの位置、サーブレットの初期化パラメータ、バージョン情報などの、アプリケーション特有の情報が含まれます。

次の方法で、サーブレットや JSP のアプリケーション情報にアクセスできます。

ServletContext オブジェクトを使用して、アプリケーションに関する情報を保存したり、次の環境情報にアクセスできます。

サーブレットは getServletContext メソッドを使用して ServletContext オブジェクトのリファレンスを取得します。

次の例では、いくつかのサーブレットコンテキスト情報を表示します。

...
  ServletContext scntxt = this.getServletContext();
  out.println("サーバ情報:"+ scntxt.getServerInfo() + "<br>");
  int majorVersion = scntxt.getMajorVersion();
  int minorVersion = scntxt.getMinorVersion();
  out.println("メジャーバージョン:" + majorVersion + "<br>");
  out.println("マイナーバージョン:" + minorVersion + "<br>");
  java.util.Enumeration parmEnum = scntxt.getInitParameterNames();
  if (parmEnum.hasMoreElements()) { 
    out.println("<h2>ServletContext Parameters</h2>");
  }
  while (parmEnum.hasMoreElements()) {
    String name = (String)parmEnum.nextElement();
    out.println("<b>"+name+":&nbsp;</b>");
    out.println(scntxt.getInitParameter(name) + "<br>");
  }
  // ServletContext 属性
  java.util.Enumeration attrEnum = scntxt.getAttributeNames();
  if (attrEnum.hasMoreElements()) { 
    out.println("<h2>ServletContext Attributes</h2>");
  }
  while (attrEnum.hasMoreElements()) {
    // 常に属性を適切なクラスにキャストします。
    String attrName = (String)attrEnum.nextElement();
    out.println("<b>" + attrName + ":&nbsp;</b>");
    out.println(scntxt.getAttribute(attrName) + "<br>");
  }
  // サーブレットの実際のパスを取得します。
  String path = req.getServletPath();
  out.println("<b>サーブレットのフルパス:</b>");
  out.println(scntxt.getRealPath(path) + "<br>");
  // ServletContext のログを記録します。
  Date now = new Date();
  scntxt.log("Testing ServletContext:" + now);
...

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。

ServletConfig オブジェクトの使用

JRun は、初期化時にサーブレットに設定情報を渡します。設定情報には、初期化パラメータを示す名前/値のペア、およびサーブレットが実行されるコンテキストを示す ServletContext オブジェクトが含まれます。

サーブレットは getServletConfig メソッドを使用して ServletConfig オブジェクトへのリファレンスを取得します。次に、ServletConfig オブジェクトを使用して初期化パラメータにアクセスできます。

次の方法で、サーブレットや JSP の設定情報にアクセスできます。

次の例では、getServletConfig メソッドを使用して、サーブレットの init メソッド内の ServletConfig オブジェクトを取得します。

...
public void init(ServletConfig config) throws ServletException {
  super.init(config);
  try {
    bgcolor = config.getInitParameter("bgcolor");
    System.out.println("bgcolor:" + bgcolor);
  } catch (Exception e) {
    System.out.println("error:" + e.toString());
  }
}
...
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
throws IOException, ServletException {
  resp.setContentType("text/html");
  PrintWriter out = resp.getWriter();
  out.println("<html><head><title>Servlet Config</title>");
  out.println("</head><body bgcolor=¥"" + bgcolor + "¥">");
  out.println("<h1>Servlet Config</h1>");
  out.println("</body></html>");
}
...

メモ:  init メソッドが再び呼び出されるように JRun を再起動する必要があります。このメソッドはサーバの起動時に 1 回だけ呼び出されます。

次の web.xml ファイルの抜粋では、初期化パラメータを設定します。

<servlet>
  <servlet-name>GetServletConfigInfo</servlet-name>
  <servlet-class>GetServletConfigInfo</servlet-class>
  <init-param>
    <param-name>bgcolor</param-name>
    <param-value>lightgoldenrodyellow</param-value>
  </init-param>
</servlet>

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。

log メソッドの使用

log メソッドを使用して、プログラマが指定したメッセージを、サーブレットのホストになっている JRun サーバのログファイルに書き込むことができます。

メモ:  JRun では、記録されるログ情報の量は自動的に変わります。ログファイル設定の詳細については、『JRun 管理者ガイド』または JMC を参照してください。

次の例では、ユーザーのアクセス情報をログに記録します。

  HttpSession thisSession = req.getSession();
  String userName = (String)thisSession.getAttribute("name");
  if(userName != null) {
    out.println("<h2> ようこそ、" + userName + " さん</h2>");
    // ロギング用の情報を準備
    // この例では、ユーザー名と IP アドレスをログに記録します。
    String logMsg = userName + ", " + req.getRemoteAddr();
    log(logMsg);
  }

システムプロパティへのアクセス

他の Java アプリケーションと同様に、System オブジェクトを呼び出してプロパティを取得できます。これにより、ユーザーの言語、タイムゾーン、地域、ファイルセパレータなど Web アプリケーションをプラットフォーム独立にするために役立つ多くのプロパティにアクセスできます。これらのプロパティによって、JRun が使用するいくつかのサービスにもアクセスでき、JVM が使用するネーミングファクトリ、ディレクトリ構造、クラスパスを識別できます。

次の例では、すべての System プロパティを表にリストし、それから user.region プロパティにアクセスして JRun サーバのロケーションに関する情報をクライアントに提供します。

...
Properties sysprops = System.getProperties();
...
out.println("<TABLE>");
Enumeration enum = sysprops.propertyNames() ;
while (enum.hasMoreElements()) {
  out.println("<TR><TD>");
  String key = (String) enum.nextElement();
  out.println(key + "</TD><TD>" + sysprops.getProperty(key) + 
"</TD></TR>");
}
out.println("</TABLE>");
...
String region = sysprops.getProperty("user.region");
out.println("<HR>このサーバがホストされている地域:<B>" + region + "</B>");
...

サンプルサーブレットを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。