教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
次の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クラスを 作成、これを修正してプログラムを作成すること。