教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
次の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たとえば、コンパイル済みの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パラメータが 表示される。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 HTTPGET
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 HTTPPOST
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"; } }
プログラム 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クラスを 作成、これを修正してプログラムを作成すること。