教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
次のプログラム HelloWorld0.java
は、指定したWebサーバ下の
ディレクトリ(アプリケーションのルートディレクトリ/build/web/WEB-INF/classes/パッケージ名)下に格納されているコンパイル済みのServletファイルを実行する
ことで、ブラウザ上にテキストを表示するプログラムである。
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorld0 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // HTMLを出力するので、setContentTypeメソッドで // CONTENT-TYPEにtext/htmlを指定 response.setContentType("text/html;charset=UTF-8"); // setContentTypeメソッドで設定した後、getWriterメソッドを // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクト // を取得 PrintWriter out = response.getWriter(); // PrintWriterオブジェクトのprintlnメソッドの引数で渡した // メッセージがブラウザに表示される out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World!"); out.println("</body>"); out.println("</html>"); // closeメソッドを呼び出すと出力終了 out.close(); } }たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションのルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納されているコンパイル済みのServletファイルHelloWorld0.class(テキストファイルはHelloWorld0.java)を実行する。そうすると、ブラウザ上に"Hello World"というテキストが表示される。
プログラム HelloWorld0.java の説明:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;では、HelloWorld.javaにおいて、Java APIとServlet APIを構成する クラスライブラリ(パッケージ)を使えるように宣言している。
クラス定義は、次のようにおこなわれる。
public class HelloWorld0 extends HttpServlet {ここでは、HelloWorld0クラスが定義される。通常のServletは、 HttpServletクラスを拡張して定義することが多く、HelloWorld0.java でも、HttpServletクラスを拡張する。
HelloWorld0.javaでは、クライアントからの要求をGETメソッドで 受け取るために、doGetメソッドに処理を記述する。 POSTメソッドの場合には、doPostメソッドに処理を記述する。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // HTMLを出力するので、setContentTypeメソッドで // CONTENT-TYPEにtext/htmlを指定 response.setContentType("text/html;charset=UTF-8"); // setContentTypeメソッドで設定した後、getWriterメソッドを // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクト // を取得 PrintWriter out = response.getWriter(); // PrintWriterオブジェクトのprintlnメソッドの引数で渡した // メッセージがブラウザに表示される out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World!"); out.println("</body>"); out.println("</html>"); // closeメソッドを呼び出すと出力終了 out.close(); }以下では、
doGet
メソッドの内容を説明する。
doGet
メソッドは、ServletにHTTPのGETメソッドで
アクセス時に、Servletコンテナから呼び出されるメソッドである。
ブラウザから普通にアクセスすると、このメソッドが呼び出される。
doGet
メソッドは、引数にHttpServletRequest
オブジェクトとHttpServletResponseオブジェクトをとる。前者の
オブジェクトには、Servletの入力が格納され、後者のオブジェクト
には、Servletからの出力が格納される。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
このメソッドの処理を以下で説明する。 まず、Servletからの出力データ(ここでは、HTML文書)の形式を 指定するために、以下のように、HttpServletResponseオブジェクト のsetContentTypeメソッドを呼び出す。
response.setContentType("text/html;charset=UTF-8");
次に、setContentTypeメソッドで設定した後、以下のように、 getWriterメソッドを呼び出して、ブラウザへの表示に使う PrintWriterオブジェクトを取得する。
PrintWriter out = response.getWriter();
そして、以下では、上記で取得したPrintWriterオブジェクトの printlnメソッドが呼び出され、引数で渡したメッセージが ブラウザに表示される。
out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World!"); out.println("</body>"); out.println("</html>");
出力が終わると、PrintWriterオブジェクトのcloseメソッドを呼び出し て、Servletからの出力を終了する。
このServletは、以下のようなHTML文を出力する。
<!DOCTYPE html> <head> <title>Hello World</title> </head> <body> Hello World! </body> </html>
次のプログラム HelloWorld1.java
は、HelloWorld0.java
と同様に、指定したWebサーバ下のディレクトリ
(アプリケーションのルートディレクトリ/ソースパッケージ/パッケージ名)下に
格納されており、ブラウザ上にテキストを表示するプログラムである。
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloWorld1 extends HttpServlet { /** 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 { // HTMLを出力するので、setContentTypeメソッドでCONTENT-TYPEに // text/htmlを指定 response.setContentType("text/html;charset=UTF-8"); // setContentTypeメソッドで設定した後、getWriterメソッドを // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクト // を取得 PrintWriter out = response.getWriter(); // PrintWriterオブジェクトのprintlnメソッドの引数で渡した // メッセージがブラウザに表示される out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("Hello World!"); out.println("</body>"); out.println("</html>"); // closeメソッドを呼び出すと出力終了 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"; } }
プログラム HelloWorld1.java の説明:
以下では、HelloWorld0.javaと異なる部分のみ説明する。 processRequestメソッドは、doGetメソッドとdoPostメソッドで 呼び出されるメソッドを定義している。両者のメソッドでおこなう 処理を共通にするために、processRequestメソッドとしてひとつの メソッドとして実装している。
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
processRequestメソッドの処理の詳細は、上述したHelloWorld0.javaの doGetメソッドの処理の定義と同様である。
通常、Servletでは、doGetメソッドとdoPostメソッドのどちら かは必ず存在すると考えられる。HelloWorld1.javaでは、 Servletでおこなう処理の内容を共通化して、同じ処理が doGetメソッドとdoPostメソッドでおこなわれるように している。
doGetメソッドは、上述したHelloWorld0.javaのdoGetメソッドと 同様に、引数にHttpServletRequestオブジェクトとHttpServletRequest オブジェクトを取る。前者のオブジェクトには、Servletへの入力が、 後者のオブジェクトにはServletからの出力が格納される。doGetメソッド の処理では、上述したprocessRequestメソッドを呼び出す。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { processRequest(request, response); }
doPostメソッドは、ServletにHTTPリクエストのPOSTメソッドで アクセスされた時に、Servletコンテナから呼び出される。 通常、HTMLフォームを使ってブラウザからアクセスする時に、 このメソッドが呼び出される。doPostメソッドの処理でも、doGet メソッドと同様に、上述したprocessRequestメソッドを呼び出す。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { processRequest(request, response); }
getServletInfoメソッドは、Servletに関する説明を表示する 場合に用いる。
public String getServletInfo() { return "Short description"; }
問題-1
HelloWorld0.java
をIDEとしてNetBeansを
使って実行してみよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-2
HelloWorld0.java
で、ブラウザに出力
するテキストを"Hello Servlet!"、それからブラウザのタイトルを
"Servlet exercise”としたプログラムをHelloServlet.javaとして
実行してみよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-3
HelloWorld1.java
をIDEとしてNetBeansを
使って実行してみよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-4
SumServlet.java
を作成し、
実行せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-5
RandServlet.java
を作成し、
実行せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-6
RandServlet1.java
を作成し、
実行せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-7
EvenSumServlet.java
を作成し、
実行せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-8
OddSumServlet.java
を作成し、
実行せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。