教育サーバーのページ
 オンラインテキスト目次
システムプログラミング演習 
次の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);
では、得られた個々のヘッダの名前に対応した値のリストを取得する。
後は、個々のヘッダの値を取り出し、表示する。
次の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にアクセスする場合に、従来は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クラスを作成、これを修正してプログラムを作成すること。
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
PrintURL.java を実行した結果を用いて、
両者の違いを具体的に説明せよ。
問題-5
HyperLink.html と
PrintQueryStringを実行してみよ。
また、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-6
PrintHeader.javaを
実行してみよ。また、HTMLフォームを用いて実行してみよ。
なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-7
PrintURL.javaを
実行してみよ。また、HTMLフォームを用いて実行してみよ。
なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-8
PrintQueryString.javaを
実行してみよ。
なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
PrintQueryString.javaを実行してみよ。
なお、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。