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