サーブレットの様々なサンプル
技術情報 TOP へ

ここでは、Java サーブレットに関する簡単なサンプルを記述いたします。

( 1 ) GET と POST( 6 ) JSP へのフォワード
( 2 ) 画像の出力( 7 ) 他のサーブレットへのフォワード
( 3 ) リクエストの HTTP ヘッダ情報の取得( 8 ) init メソッドと load-on-startup
( 4 ) 初期パラメータの取得 - コンテキスト単位 -
( 5 ) 初期パラメータの取得 - サーブレット単位 -



( 1 ) GET と POST

HTTP の GET メソッド と POST メソッドそれぞれのリクエストに対して、doGet 、doPost それぞれのメソッドで処理を行います。 これらの処理は以下の SimpleServlet クラスのスーパークラスである HttpServlet クラスの service メソッドでリクエストに含まれる HTTP ヘッダの情報を元に振り分けられます。

[ doGet メソッド ]
リクエストが HTTP GET メソッド の場合に実行されます。

[ doPost メソッド ]
リクエストが HTTP POST メソッド の場合に実行されます。


以下は GET と POST それぞれで doGet メソッド、doPost メソッドがよばれるサンプルです。

ファイル名:SimpleServlet.java
import java.io.*;
import javax.servlet.http.*;
import java.io.IOException;
import javax.servlet.ServletException;

public class SimpleServlet extends HttpServlet {
		  
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, 
                      HttpServletResponse response) 
                          throws ServletException, IOException {
	
	/* メソッド名を取得します。 */
	String mtd = request.getMethod();	
	
	System.out.println(mtd + "です。");
	
	/* ContentType を設定*/
	response.setContentType("text/html; charset=Shift_JIS");

	/* 出力用 PrintWriter を取得*/
	PrintWriter out = response.getWriter();
	    
	/* HTML 出力 */
	out.println("<html>");
	out.println("<head>");
	out.println("<title>" + mtd + "メソッド</title>");
	out.println("</head>"); 
	out.println("<body>");   
	out.println("<h2>" + mtd + "メソッドで送信され doGet が処理を行いました。" + "</h2>"); 
	out.println("<form method=\"POST\" action=\""
	 		+ request.getContextPath() + "/SimpleServlet\">");  
	out.println("<input type=\"submit\" value =\"POST送信\">" );  
	out.println("</form>");   
	out.println("<A href=\"" + request.getContextPath() + "/SimpleServlet\">");
	out.println("GET送信");
	out.println("</A>");
	out.println("</body>");
	out.println("</html>");
	
	}

	public void doPost (HttpServletRequest request,HttpServletResponse response)
	throws ServletException, IOException {
		
	/* メソッド名を取得します。 */
	String mtd = request.getMethod();
	
	System.out.println(mtd + "です。");
	
	/* ContentType を設定*/
	response.setContentType("text/html; charset=Shift_JIS");

	/* 出力用 PrintWriter を取得*/
	PrintWriter out = response.getWriter();
	    
	/* HTML 出力 */
	out.println("<html>");
	out.println("<head>");
	out.println("<title>" + mtd + "メソッド</title>");
	out.println("</head>"); 
	out.println("<body>");   
	out.println("<h2>" + mtd 
			+ "メソッドで送信され doPost が処理を行いました。" + "</h2>");
	out.println("<form method=\"POST\" action=\""
			+ request.getContextPath() + "/SimpleServlet\">");  
	out.println("<input type=\"submit\" value =\"POST送信\"> ");  
	out.println("</form>");  
	out.println("<A href=\"" + request.getContextPath() + "/SimpleServlet\">");
	out.println("GET送信");
	out.println("</A>");
	out.println("</body>");
	out.println("</html>");
	    
	}
 } 



( 2 ) 画像の出力

ローカルパス上にある画像を取得し、サーブレットから画像をレスポンスとして出力します。

* 出力する画像を用意します。カレントディレクトリに img ディレクトリ を作成し、JPEG 画像 を jet.jpg として配置してください。
( ここでは相対パス指定: ./img/jet.jpg )

ファイル名:ImgServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import javax.servlet.ServletException;

public class ImgServlet extends HttpServlet {
		  
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, 
                      HttpServletResponse response) 
                          throws ServletException, IOException {
	  
	   /* 出力する画像ファイル名 */
	   String fileName = "./img/jet.jpg";

	   int iData = 0;

	   /* OutputStream を取得します。 */
	   ServletOutputStream out = response.getOutputStream();
       
	   /* 画像ファイルを BufferedInputStream を使用して読み取ります。*/
	   BufferedInputStream in = 
		new BufferedInputStream(new FileInputStream(fileName));
        
	   /* 画像を書き出します。*/
	   while ((iData = in.read()) != -1) {
	       out.write(iData);
	   }
	   in.close();
	   out.close();
	}
}



( 6 ) リクエストの HTTP ヘッダ情報の取得

リクエストの HTTP ヘッダ情報を取得します。

ファイル名:HeaderServlet.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HeaderServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  	throws IOException,ServletException {
	  
	  String name = null;
	  String value = null;
	  
	  response.setContentType("text/html; charset=shift_jis");
	  
	  PrintWriter out = response.getWriter();
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>Header Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  
	  /* メソッド名を取得します。 */
	  String mtd = request.getMethod();
	  out.println(mtd + " method <BR>");

	  /* Enumeration オブジェクトを取得します。*/
	  Enumeration enu = request.getHeaderNames();	
	  	
	  while(enu.hasMoreElements()) {	  	
	  	name = (String)enu.nextElement();
	  	value = request.getHeader(name);
	  	out.println( name + " : " + value  + "<BR>");
	  }
	  
	  out.println("</body>");
	  out.println("</html>");
	  out.close();
	}
}



( 4 ) 初期パラメータの取得 - コンテキスト単位 -

web.xml の context-param 要素 ( <context-param> ) で設定した初期パラメータを取得します。

[ context-param 要素 ]
コンテキスト内の全てのサーブレットから取得できますので、 コンテキスト内共通で使用する値に利用できます。

web.xml に以下の記述を追記します。( context-param 要素 は、web-app 要素内に記述します。 )
<web-app>
  <!--ここから-->
  <context-param>
      <param-name>Color</param-name>
      <param-value>White</param-value>  
  </context-param>  
    <context-param>
      <param-name>Fruit</param-name>
      <param-value>Strawberry</param-value>  
  </context-param>  
  <!--ここまで-->
上記の web.xml の <context-param> の値を以下プログラムから取得します。
* context-param の取得は、getServletContext().getInitParameter メソッドを使用します。

ファイル名:InitServlet.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class InitServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  	throws IOException,ServletException {
		
	  String name = null;
	  String value = null;		  
	  	  
	  response.setContentType("text/html; charset=shift_jis");
	  
	  PrintWriter out = response.getWriter();
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>ContextParam Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  out.println("<h2>");
	  
	  /* getInitParameter での取得 */
	  String msg = getServletContext().getInitParameter("Color");		  
	  out.println("<p>初期パラメータ Color の値は " + msg+ "</p>");
	  
	  /* Enumeration からの取得 */
	  /* Enumeration オブジェクトを取得します。*/
	  Enumeration enu = getServletContext().getInitParameterNames();
	  	
	  while(enu.hasMoreElements()) {	  	
	  	name = (String)enu.nextElement();
	  	value = getServletContext().getInitParameter(name);
	  	out.println( name + " : " + value  + "<BR>");
	  }
	  out.println("</h2>");	  
	  out.println("</body>");
	  out.println("</html>");
	  out.close();
	}
}



( 5 ) 初期パラメータの取得 - サーブレット単位 -

web.xml の init-param 要素 ( <init-param> ) で設定した初期パラメータを取得します。

[ init-param 要素 ]
サーブレット単位 ( <servlet> ) です。 サーブレットごとに使用する値に利用できます。

web.xml に以下の記述を追記します。( init-param 要素 は、対象の servlet 要素内に記述します。 )
   <servlet>
        <servlet-name>InitServlet</servlet-name>
        <servlet-class>InitServlet</servlet-class>
	  <!--ここから-->
	  <init-param>
	      <param-name>Color</param-name>
	      <param-value>White</param-value>  
	  </init-param>  
	  <init-param>
	      <param-name>Fruit</param-name>
	      <param-value>Strawberry</param-value>  
	  </init-param>  
	  <!--ここまで-->
    </servlet>
上記の web.xml の <init-param> の値を以下プログラムから取得します。
* init-param の取得は、getServletConfig().getInitParameter メソッドを使用します。

ファイル名:InitServlet.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class InitServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  	throws IOException,ServletException {
		
	  String name = null;
	  String value = null;		  
	  	  
	  response.setContentType("text/html; charset=shift_jis");
	  
	  PrintWriter out = response.getWriter();
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>ContextParam Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  out.println("<h2>");
	  
	  /* getInitParameter での取得 */
	  String msg = getServletConfig().getInitParameter("Color");		  
	  out.println("<p>初期パラメータ Color の値は " + msg+ "</p>");
	  
	  /* Enumeration からの取得 */
	  /* Enumeration オブジェクトを取得します。*/
	  Enumeration enu = getServletConfig().getInitParameterNames();
	  	
	  while(enu.hasMoreElements()) {	  	
	  	name = (String)enu.nextElement();
	  	value = getServletConfig().getInitParameter(name);
	  	out.println( name + " : " + value  + "<BR>");
	  }
	  out.println("</h2>");	  
	  out.println("</body>");
	  out.println("</html>");
	  out.close();
	}
}



( 8 ) 他のサーブレットへのフォワード

他のサーブレットへのフォワードします。

ファイル名:ForwServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ForwServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  throws IOException,ServletException {
		
	  String tex = "Hello!";
		
	  /* リクエストスコープのセッションに値を設定します。 */
	  request.setAttribute("sendMsg", tex);	
		
	  /* /ForwServlet2 へフォワードします。*/
	  getServletContext().getRequestDispatcher("/ForwServlet2").forward(request,response);

	}
}
上記のサーブレットから下記のサーブレットへフォワードします。

ファイル名:ForwServlet2.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ForwServlet2 extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  	throws IOException,ServletException {
		
	  response.setContentType("text/html; charset=shift_jis");
	  
	  PrintWriter out = response.getWriter();
		
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>Forward Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  out.println("<h2>" + request.getAttribute("sendMsg") + "</h2>");
	  out.println("</body>");
	  out.println("</html>");
	  out.close();

	}
}



( 9 ) JSP へのフォワード

JSP へフォワードします。

ファイル名:ForwServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ForwServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  throws IOException,ServletException {
		
	  String tex = "Hello!";
		
	  /* リクエストスコープのセッションに値を設定します。 */
	  request.setAttribute("sendMsg", tex);	
		
	  /* /frow.jsp へフォワードします。*/
	  getServletContext().getRequestDispatcher("/frow.jsp").forward(request,response);

	}
}
上記のサーブレットから下記の JSP へフォワードします。

ファイル名:frow.jsp

<%@ page contentType="text/html; charset=Shift_JIS" %>

<html>
  <head>
    <title>Forward Example</title>
  </head>
<body>
<jsp:useBean id="sendMsg" type="java.lang.String" scope="request" />
<h2>
<%=sendMsg%>
</h2>
</body>
</html>



( 8 ) init メソッドと load-on-startup


[ init メソッド ]
対象のサーブレットが呼び出された時 ( 実行時 ) に 一度だけ実行されます。 初期化処理などによく利用されるメソッドです。

以下のプログラムは init メソッド を使用した例です。


ファイル名:InitServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class InitServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;

	public void init() {
		System.out.println("InitServlet - startup -");
	}

	public void doGet(HttpServletRequest request,HttpServletResponse response)
	  	throws IOException,ServletException {
		
	  response.setContentType("text/html; charset=shift_jis");
	  
	  PrintWriter out = response.getWriter();
	  out.println("<html>");
	  out.println("<head>");
	  out.println("<title>ContextParam Example</title>");
	  out.println("</head>");
	  out.println("<body>");
	  out.println("<h2>");
	  out.println("Hello!");
	  out.println("</h2>");	  
	  out.println("</body>");
	  out.println("</html>");
	  out.close();
	}
}

init メソッドをアプリケーションサーバ起動時に実行したい場合

web.xml の servlet 要素 ( <servlet> ) 内に load-on-startup 要素 ( <load-on-startup> ) を記述します。
load-on-startup 要素の値は実行される順となります。


web.xml に以下の記述を追記します。
   <servlet>
        <servlet-name>InitServlet</servlet-name>
        <servlet-class>InitServlet</servlet-class>
        <!--ここから-->
        <load-on-startup>1</load-on-startup>
        <!--ここまで-->
    </servlet>
アプリケーションサーバを起動すると InitServlet クラスの init メソッド が一度だけ実行されます。

( web.xml の再読み込みが実行された場合は、再度 init メソッド も実行されます。 )



技術情報 TOP へ


Google
WWW を検索 whitemark.co.jp を検索
[ 株式会社ホワイトマーク TOP ]   [ 免責事項 ]

Copyright © 2006 by WhiteMark, All rights Reserved. Last Modified: 2006/05