教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
次のプログラム HelloWorld2.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 HelloWorld2 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"); // setContentTypeメソッドで設定した後、getWriterメソッドを // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクトを取得 PrintWriter out = response.getWriter(); // PrintWriterオブジェクトのprintlnメソッドの引数で渡した // メッセージがブラウザに表示される out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>HELLO!!サーブレットの世界にようこそ</title>"); // 日本語のメッセージを表示したい out.println("</head>"); out.println("<body>"); out.println("HELLO!!サーブレットの世界にようこそ"); // 日本語のメッセージを表示したい 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"; } }たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションのルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに格納されている コンパイル済みのServletファイルHelloWorld2.class(テキストファイルはHelloWorld2.java)を実行する。
プログラム HelloWorld2.java の説明:
以下のprocessRequestメソッド
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // HTMLを出力するので、setContentTypeメソッドでCONTENT-TYPEに // text/htmlを指定 response.setContentType("text/html"); // setContentTypeメソッドで設定した後、getWriterメソッドを // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクトを取得 PrintWriter out = response.getWriter(); // PrintWriterオブジェクトのprintlnメソッドの引数で渡した // メッセージがブラウザに表示される out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>HELLO!!サーブレットの世界にようこそ</title>"); // 日本語のメッセージを表示したい out.println("</head>"); out.println("<body>"); out.println("HELLO!!サーブレットの世界にようこそ"); // 日本語のメッセージを表示したい out.println("</body>"); out.println("</html>"); // closeメソッドを呼び出すと出力終了 out.close(); }の中の、
out.println("HELLO!!サーブレットの世界にようこそ");
は、HelloWorld1.javaでのメッセージ部分"Hello World"を "HELLO!! サーブレットの世界にようこそ"に置き換えた プログラムである。
しかし、HelloWorld2.javaを実行してみると、日本語の部分 が字化けして"?"になって表示されてしまう。
次のプログラム HelloWorld3.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 HelloWorld3 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"); // charsetで表示文字コードにUnicode(UTF-8)を使うことを指定 // setContentTypeメソッドで設定した後、getWriterメソッドを // 呼び出して、ブラウザへの表示に使うPrintWriterオブジェクトを取得 PrintWriter out = response.getWriter(); // UTF-8で表示するPrintWriterオブジェクトを取得できる // PrintWriterオブジェクトのprintlnメソッドの引数で渡した // メッセージがブラウザに表示される // printlnを呼び出すと、メッセージがUnicode(UTF-8)で表示される out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>HELLO!!サーブレットの世界にようこそ</title>"); // 日本語のメッセージを表示したい out.println("</head>"); out.println("<body>"); out.println("HELLO!!サーブレットの世界にようこそ"); // 日本語のメッセージを表示したい 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"; } }たとえば、Webサーバが動いているホストlocalhostのWebアプリケーションのルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに格納されている コンパイル済みのServletファイルHelloWorld3.class(テキストファイルはHelloWorld3.java)を実行する。そうすると、ブラウザ上に"HELLO!!サーブレットの世界にようこそ"というテキストが表示される。
プログラム HelloWorld3.java の説明:
processRequestメソッドにおいて、
response.setContentType("text/html; charset=UTF-8");では、HTMLを出力するために、setContentTypeメソッドでCONTENT-TYPEに "text/html"を指定し、charsetでは表示文字コードにUTF-8 (Unicode) を使うことを指定している。 Javaプログラムの中では、文字をUnicodeという文字コードで表現 している。これをブラウザで表現する場合には、通常のブラウザで 取り扱える文字コードに変換する必要がある。Servletコンテナでは、 デフォルトでは、ISO-8859-1という文字コードに変換することに なっている。 このような理由で、日本語を表示できる文字コードに変換することが 必要になってくる。そのために、setContentTypeメソッドにより、 "charset=文字コード"を追加することで指定する。
次のプログラム PrintText1.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 PrintText1 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 { response.setContentType("text/html; charset=UTF-8"); // text/htmlではHTMLとみなされてしまう PrintWriter out = response.getWriter(); // 普通のテキストを出力する out.println("これはテキストです。"); out.println(" この行はインデントしています。"); out.println(" ・箇条書きにしてみました。"); out.println(" ・同じく箇条書きです。"); out.println("テキスト終わりです。"); 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ファイルPrintText1.class(テキストファイルは PrintText1.java)を実行する。そうすると、出力として、ブラウザ上に HTML文章ではなく、普通の日本語テキストテキストが表示される。
プログラム PrintText1.java の説明:
processRequestメソッドの
response.setContentType("text/html; charset=UTF-8");によって、Content-Typeが"text/html"と設定されるので、 出力がHTMLメッセージとみなされる。
出力として、Printerオブジェクトのprintlnメソッドの引数として与えられる メッセージは、
out.println("これはテキストです。"); out.println(" この行はインデントしています。"); out.println(" ・箇条書きにしてみました。"); out.println(" ・同じく箇条書きです。"); out.println("テキスト終わりです。"); out.close();のように記述され、ブラウザに表示される。
ブラウザは、Servletからテキストデータを受け取り、HTML と解釈して表示をおこなう。
次のプログラム PrintText2.java
は、指定した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 PrintText2 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 { response.setContentType("text/plain; charset=UTF-8"); // テキストなので、text/plainを指定する PrintWriter out = response.getWriter(); // 普通のテキストを出力する out.println("これはテキストです。"); out.println(" この行はインデントしています。"); out.println(" ・箇条書きにしてみました。"); out.println(" ・同じく箇条書きです。"); out.println("テキスト終わりです。"); 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ファイルPrintText2.class(テキストファイルは PrintText2.java)を実行する。そうすると、出力として、ブラウザ上に HTML文章ではなく、普通の日本語テキストテキストが表示される。
プログラム PrintText2.java の説明:
processRequestメソッドの
response.setContentType("text/plain; charset=UTF-8");によって、Content-TypeがMIMEタイプである、"text/plain"と設定されるので、 出力が単なるテキストメッセージとみなされる。
出力として、Printerオブジェクトのprintlnメソッドの引数として与えられる メッセージは、
out.println("これはテキストです。"); out.println(" この行はインデントしています。"); out.println(" ・箇条書きにしてみました。"); out.println(" ・同じく箇条書きです。"); out.println("テキスト終わりです。"); out.close();のように表現され、ブラウザに整形表示される。
ブラウザは、Servletからテキストデータを受け取り、MIMEの テキストデータと解釈して表示をおこなう。
問題-1
HelloWorld2.java
をIDEとしてNetBeansを
使って実行して、文字化けしていることを確認せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-2
HelloWorld3.java
をIDEとしてNetBeansを
使って実行して、日本語のテキストがうまく表示していることを確認せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-3
PrintText1.java
をIDEとしてNetBeansを
使って実行してみよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-4
PrintText2.java
をIDEとしてNetBeansを
使って実行してみよ。そして、ブラウザの表示結果を、PrintText1.java
と比較せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。