教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習

ヘッダ情報の取得、URLの表示、リンクからの起動

ヘッダ情報を取得するServletプログラム

次のPrintHeader.java は、URLを使ってブラウザ からサーバに要求がなされる時に、クライアントから送信される ヘッダ情報を取得し表示するプログラムである。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class PrintHeader extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** Processes requests for both HTTP <code>GET & lt;/code> and 
   * <code> POST </code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
                       HttpServletResponse response)
      throws ServletException, java.io.IOException {
        response.setContentType("text/html; charset=UTF-8");
        java.io.PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<ul>");

        // ヘッダの名前のリストを取得する
        java.util.Enumeration eName = request.getHeaderNames();
        while (eName.hasMoreElements()) {
            // 個々のヘッダの名前を取得する
            String name = (String)eName.nextElement();
            // 個々のヘッダの名前に対応する、値のリストを取得する
            java.util.Enumeration eValue = request.getHeaders(name);
            while (eValue.hasMoreElements()) {
                // 個々のヘッダの値を取得する
                String value = (String)eValue.nextElement();
                out.println("<li>" + name + "=" + value);
            }
            out.println("<hr>");
        }

        out.println("</ul>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code> POST </code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }  
}
たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下の build/web/WEB-INF/classes/パッケージ名 ディレクトリに格納されている コンパイル済みのServletファイルPrintHeader.class(テキストファイルはPrintHeader.java)を実行する。そうすると、ブラウザ上にブラウザの種類や対応する言語などの ヘッダー情報が表示される。

プログラム PrintHeader.java の説明

以下のprocessRequestメソッド

    protected void processRequest(HttpServletRequest request, 
                       HttpServletResponse response)
      throws ServletException, java.io.IOException {
        response.setContentType("text/html; charset=UTF-8");
        java.io.PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<ul>");
        // ヘッダの名前のリストを取得する
        java.util.Enumeration eName = request.getHeaderNames();
        while (eName.hasMoreElements()) {
            // 個々のヘッダの名前を取得する
            String name = (String)eName.nextElement();
            // 個々のヘッダの名前に対応する、値のリストを取得する
            java.util.Enumeration eValue = request.getHeaders(name);
            while (eValue.hasMoreElements()) {
                // 個々のヘッダの値を取得する
                String value = (String)eValue.nextElement();
                out.println("<li>" + name + "=" + value);
            }
            out.println("<hr>");
        }
        out.println("</ul>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
の中において、

        java.util.Enumeration eName = request.getHeaderNames();
では、ヘッダの名前のリストを取得する。

        while (eName.hasMoreElements()) {
            // 個々のヘッダの名前を取得する
            String name = (String)eName.nextElement();
            // 個々のヘッダの名前に対応する、値のリストを取得する
            java.util.Enumeration eValue = request.getHeaders(name);
            while (eValue.hasMoreElements()) {
                // 個々のヘッダの値を取得する
                String value = (String)eValue.nextElement();
                out.println("<li>" + name + "=" + value);
            }
            out.println("<hr>");
        }            
の中において、

            String name = (String)eName.nextElement();

では、求めたヘッダの名前のリストから、個々のヘッダの名前を取得する。

            java.util.Enumeration eValue = request.getHeaders(name);

では、得られた個々のヘッダの名前に対応した値のリストを取得する。

後は、個々のヘッダの値を取り出し、表示する。

URLを表示するServletプログラム

次のPrintURL.java は、URLを使ってブラウザ からサーバに要求がなされる時に、そのURLに関する情報を 取得し表示するプログラムである。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class PrintURL extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** Processes requests for both HTTP <code> GET </code> and 
     * <code> POST </code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
                       HttpServletResponse response)
      throws ServletException, java.io.IOException {
        response.setContentType("text/html; charset=UTF-8");
        java.io.PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>URL関連情報の表示</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("RequestURL=" + request.getRequestURL());
        out.println("<br>");
        out.println("Scheme=" + request.getScheme());
        out.println("<br>");
        out.println("ServerName=" + request.getServerName());
        out.println("<br>");
        out.println("ServerPort=" + request.getServerPort());
        out.println("<br>");
        out.println("RequestURI=" + request.getRequestURI());
        out.println("<br>");
        out.println("ContextPath=" + request.getContextPath());
        out.println("<br>");
        out.println("ServletPath=" + request.getServletPath());
        out.println("<br>");
        out.println("PathInfo=" + request.getPathInfo());
        out.println("<br>");
        out.println("PathTranslated=" + request.getPathTranslated());
        out.println("<br>");
        out.println("QueryString=" + request.getQueryString());
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
    
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}

たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションのルートディレクトリ下の build/web/WEB-INF/classes/パッケージ名 ディレクトリ に格納されているコンパイル済みのServletファイルPrintURL.class(テキストファイルはPrintURL.java)を実行する。そうすると、ブラウザ上にURLに関する情報が表示される。

プログラム PrintURL.java の説明

以下のprocessRequestメソッド

    protected void processRequest(HttpServletRequest request, 
                       HttpServletResponse response)
      throws ServletException, java.io.IOException {
        response.setContentType("text/html; charset=UTF-8");
        java.io.PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>URL関連情報の表示</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("RequestURL=" + request.getRequestURL());
        out.println("<br>");
        out.println("Scheme=" + request.getScheme());
        out.println("<br>");
        out.println("ServerName=" + request.getServerName());
        out.println("<br>");
        out.println("ServerPort=" + request.getServerPort());
        out.println("<br>");
        out.println("RequestURI=" + request.getRequestURI());
        out.println("<br>");
        out.println("ContextPath=" + request.getContextPath());
        out.println("<br>");
        out.println("ServletPath=" + request.getServletPath());
        out.println("<br>");
        out.println("PathInfo=" + request.getPathInfo());
        out.println("<br>");
        out.println("PathTranslated=" + request.getPathTranslated());
        out.println("<br>");
        out.println("QueryString=" + request.getQueryString());
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
内において、

        out.println("RequestURL=" + request.getRequestURL());
では、要求されたURLを取得して、出力する。

        out.println("Scheme=" + request.getScheme()); 
では、スキーム名を取得して、出力する。

        out.println("ServerName=" + request.getServerName());
では、要求を受け付けたホスト名を取得し、出力する。

        out.println("ServerPort=" + request.getServerPort());
では、要求を受け付けたホストのポート番号を取得し、出力する。

        out.println("RequestURI=" + request.getRequestURI());
では、要求されたURIを取得し、出力する。

        out.println("ContextPath=" + request.getContextPath());
では、Webアプリケーションのルートディレクトリを取得し、出力する。

        out.println("ServletPath=" + request.getServletPath());
では、Servletファイルへのパスを取得し、出力する。

        out.println("PathInfo=" + request.getPathInfo());
では、URL形式で表現された、リクエストされたパス情報を取得し、出力する。

        out.println("PathTranslated=" + request.getPathTranslated());
では、実際の物理パスに変換された、パス情報を取得し、出力する。

        out.println("QueryString=" + request.getQueryString());
では、「キー名=値&....」形式から構成される生のクエリー情報を 取得し、出力する。

リンクによるServletプログラムの起動

Servletにアクセスする場合に、従来はHTMLフォームを使っていた。 今回はそれ以外の方法として、ハイパーリンクを使ったServlet へのアクセスを理解しよう。 以下に示すHyperLink.htmlでは、ハイパーリンクを利用して、 Servletにアクセスする。HyperLink.htmlによりブラウザ上で表示された ハイパーリンクをクリックすることで、URLのQueryStringに書かれた パラメータがServlet(PrintQueryString.java)に渡されて、ブラウザ 上に表示される。

プログラム HyperLink.html の説明

<!DOCTYPE HTML>

<HTML>
  <HEAD>
    <TITLE>ハイパーリンクによるサーブレット呼び出し</TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </HEAD>
  <BODY>
  ハイパーリンクの場合
  <BR>
  <A href='PrintQueryString?param=JSP%26Servlet'>リンクです</A>
  </BODY>
</HTML>

次のプログラム PrintQueryString.java は、アンカータグで 表示されたハイパーリンクをクリックすることで、URLのQueryStringに書かれた パラメータを受け取って表示する。 ハイパーリンクをクリックすると、ブラウザはGETメソッドでアクセスする ことになるので、URLに指定されたパラメータもGETメソッドで送信される。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class PrintQueryString extends HttpServlet {
    
    /** Initializes the servlet.
     */
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        
    }
    
    /** Destroys the servlet.
     */
    public void destroy() {
        
    }
    
    /** Processes requests for both HTTP GET and 
   * POST methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        java.io.PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>QueryStringとパラメータの表示</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("QueryString=" + request.getQueryString());
        out.println("<hr>");
        out.println("<pre>");
        out.println("param=" + request.getParameter("param"));
        out.println("</pre>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
    
    /** Handles the HTTP GET method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Handles the HTTP POST method.
     * @param request servlet request
     * @param response servlet response
     */
    protected void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, java.io.IOException {
        processRequest(request, response);
    }
    
    /** Returns a short description of the servlet.
     */
    public String getServletInfo() {
        return "Short description";
    }
    
}
たとえば、コンパイル済みのServletファイルPrintQueryString.class (テキストファイルはPrintQueryString.java)をWebサーバが動いている ホストlocalhostのWebアプリケーションのルートディレクトリ下の build/web/WEB-INF/classes/パッケージ名 ディレクトリに格納する。 HTMLファイルである、 HyperLink.htmlは、Webアプリケーションのルートディレクトリ下に格納する。 Servletを実行するためには、ブラウザを起動し、HyperLink.htmlをアクセスし、 表示されたハイパーリンクをクリックする。その結果、URLパラメータが Servletに送信され、Servletが実行される。 これにより、ブラウザ上にはServletに送信されたURLパラメータが 表示される。

プログラム HyperLink.html の説明

<!DOCTYPE HTML>

<HTML>
  <HEAD>
    <TITLE>ハイパーリンクによるサーブレット呼び出し</TITLE>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </HEAD>
  <BODY>
  ハイパーリンクの場合
  <BR>
  <A href='PrintQueryString?param=JSP%26Servlet'>リンクです</A>
  </BODY>
</HTML>
の中における、

  <A href='PrintQueryString?param=JSP%26Servlet'>リンクです</A>

では、アンカータグを使って、アクセスすべきServletのURLと必要となる パラメータ(URLパラメータ)を指定している。

プログラム PrintQueryString.java の説明

以下のprocessRequestメソッド

    protected void processRequest(HttpServletRequest request, 
                                    HttpServletResponse response)
        throws ServletException, java.io.IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");
        java.io.PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>QueryStringとパラメータの表示</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("QueryString=" + request.getQueryString());
        out.println("<br>");
        out.println("<pre>");
        out.println("param=" + request.getParameter("param"));
        out.println("</pre>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
における、

        out.println("QueryString=" + request.getQueryString());
によって、HyperLink.htmlで指定されたパラメータを 「キー名=値&....」形式から構成される生のクエリー情報と して取得し、出力する。

問題-1

上のプログラム PrintHeader.java をIDEとしてNetBeansを 使って実行してみよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-2
以下に示すHttpServletRequestインターフェイスのメソッドから、リクエストに 関する情報を収集、表示するプログラムPrintRequest.java を作成せよ。 IDEとしてNetBeansを利用せよ。

文字エンコーディングpublic String getCharacterEncoding()
データ本体のバイト長public int getContentLength()
MIMEタイプString getContentType()
Accept-Languageヘッダ Locale getLocale()
HTTPメソッドString getMethod()
プロトコルとバージョン名String getProtocol()
クライアントのIPアドレスString getRemoteAddr()
クライアントのドメイン名 String getRemoteHost()

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-3

上のプログラム PrintURL.java をIDEとしてNetBeansを 使って実行してみよ。

ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。

問題-4

検索エンジンを利用するなどして、URLとURIを調べてみよ。 また、PrintURL.java を実行した結果を用いて、 両者の違いを具体的に説明せよ。

問題-5

NetBeansを使って、上のプログラム HyperLink.htmlPrintQueryStringを実行してみよ。

また、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-6

ハイパーリンク呼び出しにより、PrintHeader.javaを 実行してみよ。また、HTMLフォームを用いて実行してみよ。

なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-7

ハイパーリンク呼び出しにより、PrintURL.javaを 実行してみよ。また、HTMLフォームを用いて実行してみよ。

なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-8

HTMLフォームを用いて、PrintQueryString.javaを 実行してみよ。

なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

問題-9
ブラウザからプログラムを呼ぶ出すための実行URLに要求パラメータ(問い合わせ文字列)を追加してURLを書き換え、このURLを用いてPrintQueryString.javaを実行してみよ。

なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。

システムプログラミング演習


nagai@rsch.tuis.ac.jp