教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
これに対して、今回は、ブラウザ(クライアント)側から、 入力データを受け渡してServletを呼び出すことを理解しよう。
ブラウザ(クライアント)側からサーバ側にデータを受け渡す方法 としては、大きく分けて以下の2つがある。
ここでは、後者の一方、HTMLフォームを利用して、HTMLページ上で 入力したデータを受け渡す方法を理解しよう。
以下のFormInput1.htmlでは、Formタグのaction属性の値には、送信ボタン が押された時に、テキスト入力フィールドに入力された文字列を ServletであるFormInput1.javaに渡すことを指定している。
<!DOCTYPE HTML> <HTML> <HEAD> <TITLE>フォームからの入力</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </HEAD> <BODY> <FORM action='FormInput1' method=get> あなたのお名前は:<INPUT type='text' name='yourName' value=''> <BR> <INPUT type='submit' name='button' value='入力'> </FORM> </BODY> </HTML>
次のプログラム FormInput1.java
は、HTMLフォームから入力されたデータを
受け取って表示する。HTMLフォームから入力されたデータは、GETメソッドによりServlet
に送信される。
このプログラムでは、渡された文字列をgetParameterメソッドにより取得して、そのまま
表示する。メソッドの引数には、入力フィールドの名前を指定する。指定された名前により、
どの入力フィールドの値を取得できるかが決定される。
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 FormInput1 extends HttpServlet {
/** Processes requests for both HTTP GET
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 {
// 日本語を表示するので、charsetにUTF-8を指定
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
// まず最初の部分のメッセージを表示
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>フォームからの入力を受け取るサーブレット</title>");
out.println("</head>");
out.println("<body>");
out.println("フォームからの入力を受け取るサーブレット<hr>");
// フォームからのデータを受け取って表示
out.println("あなたのお名前は:");
String name = request.getParameter("yourName");
// フォームからのデータを受け取る
out.print(name);
out.print(" さんですね。");
// 残りのメッセージを表示
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";
}
}
たとえば、コンパイル済みのServletファイルFormInput1.class(テキストファイルは
FormInput1.java)をWebサーバが動いているホストlocalhostのWebアプリケーションの
ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに
格納する。HTMLファイルであるFormInput.html1は、Webアプリケーションのルート
ディレクトリ下に格納する。
Servletを実行するためには、FormInput1.htmlを実行する。これにより、ブラウザが起動し、
HTMLフォームが表示される。ブラウザ上からデータを入力して送信ボタンを押すと、
その文字列がそのまま表示される。
プログラム FormInput1.javaの説明:
以下のprocessRequestメソッド
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // 日本語を表示するので、charsetにUTF-8を指定 response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); // まず最初の部分のメッセージを表示 out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>フォームからの入力を受け取るサーブレット</title>"); out.println("</head>"); out.println("<body>"); out.println("フォームからの入力を受け取るサーブレット<hr>"); // フォームからのデータを受け取って表示 out.println("あなたのお名前は:"); String name = request.getParameter("yourName"); // フォームからのデータを受け取る out.print(name); out.print(" さんですね。"); // 残りのメッセージを表示 out.println("</body>"); out.println("</html>"); out.close(); }の中の
response.setContentType("text/html; charset=UTF-8");では、日本語を出力するために、responseオブジェクトに対して setContentTypeメソッドを指定して呼び出している。
String name = request.getParameter("yourName");では、HTMLフォームで入力された文字列をgetParameterメソッドにより 取得する。このメソッドの引数には、テキスト入力フィールドの名前を指定する。 指定された名前により、どの入力フィールドの値を取得できるかが決定される。
次のFormInput2.htmlでは、Formタグのaction属性の値には、送信ボタン が押された時に、テキスト入力フィールドに入力された文字列を ServletであるFormInput2.javaに渡すことを指定している。 なお、HTMLフォームから入力されたデータは、GETメソッドによりServlet に送信される。
<!DOCTYPE HTML> <HTML> <HEAD> <TITLE>フォームからの入力 その2</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </HEAD> <BODY> <FORM action='FormInput2' method=get> あなたのお名前は(日本語可):<INPUT type='text' name='yourName' value=''> <BR> <INPUT type='submit' name='button' value='入力'> </FORM> </BODY> </HTML>
上述したFormInput2.javaでは、テキスト入力フィールドに日本語を 入力すると、字化けしてしまう。これは、Servletが想定している文字 コードとブラウザに入力された文字列の文字コードが一致しないため である。そこで、FormInput2.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; public class FormInput2 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 { // 日本語を表示するので、charsetにUTF-8を指定 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); // まず最初の部分のメッセージを表示 out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>フォームからの入力を受け取るサーブレット その2</title>"); out.println("</head>"); out.println("<body>"); out.println("フォームからの入力を受け取るサーブレット その2<hr>"); // フォームからのデータを受け取って表示 out.println("あなたのお名前は:"); String name = request.getParameter("yourName"); out.print(name); out.print(" さんですね。"); // 残りのメッセージを表示 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"; } }たとえば、コンパイル済みのServletファイルFormInput2.class(テキストファイルは FormInput2.java)をWebサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納する。HTMLファイルであるFormInput2.htmlは、Webアプリケーションの ルートディレクトリ下に格納する。 Servletを実行するためには、FormInput2.htmlを実行する。これにより、ブラウザが起動し、 HTMLフォームが表示される。ブラウザ上から日本語のデータを入力して送信ボタンを押すと、 その文字列がそのまま表示される。
プログラム FormInput2.java の説明:
以下のprocessRequestメソッド
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { // 日本語を表示するので、charsetにUTF-8を指定 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); // まず最初の部分のメッセージを表示 out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>フォームからの入力を受け取るサーブレット その2</title>"); out.println("</head>"); out.println("<body>"); out.println("フォームからの入力を受け取るサーブレット その2<hr>"); // フォームからのデータを受け取って表示 out.println("あなたのお名前は:"); String name = request.getParameter("yourName"); out.print(name); out.print(" さんですね。"); // 残りのメッセージを表示 out.println("</body>"); out.println("</html>"); out.close(); }の中の
request.setCharacterEncoding("UTF-8");では、日本語パラメータを受け取る時には、requestオブジェクトに対して setCharacterEncodingメソッドを呼び出して、パラメータのエンコーディングを 指定している。なお、一つでもパラメータの読み込みをおこなうと setCharacterEncodingメソッドは効かなくなるので、getParameterメソッドでは パラメータを取得する前にsetCharacterEncodingメソッドを呼び出す必要がある。
String name = request.getParameter("yourName"); // フォームからのデータを受け取るでは、HTML入力フォームからデータを受け取る。さらに、UTF-8でコード化 された文字列をそのまま表示する。
FormParam.html
では、Formタグのaction属性の値には、送信ボタン
が押された時に、テキスト入力フィールドに入力された文字列を
ServletであるFormParam.javaに渡すことを指定している。
HTMLフォームから入力されたデータは、POSTメソッドによりFormParam.javaに送信される。
FormParam.java
は、指定したWebサーバのホスト名と取得したい
HTMLファイルを引数で指定して、Webサーバからのレスポンスを標準出力に表示する
プログラムである。
<!DOCTYPE HTML> <HTML> <HEAD> <TITLE>フォームからのいろいろな入力</TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </HEAD> <BODY> <FORM method=POST action='FormParam'> <TABLE> <TR><TH>テキスト</TH><TD><INPUT type=TEXT name='text' value=''></TD></TR> <TR><TH>パスワード</TH><TD><INPUT type=PASSWORD name='password' value=''></TD></TR> <TR><TH>非表示テキスト</TH><TD><INPUT type=HIDDEN name='hidden' value='hiddenの値'></TD></TR> <TR><TH>テキストエリア</TH><TD><TEXTAREA name='textarea'></TEXTAREA></TD></TR> <TR><TH>ラジオボタン</TH><TD> <INPUT type=RADIO name='radio' value='radio1'>ラジオボタン1</TD><TD> <INPUT type=RADIO name='radio' value='radio2'>ラジオボタン2</TD></TR> <TR><TH>チェックボックス</TH><TD> <INPUT type=CHECKBOX name='checkbox' value='checkbox1'>チェックボックス1</TD><TD> <INPUT type=CHECKBOX name='checkbox' value='checkbox2'>チェックボックス2</TD><TD> <INPUT type=CHECKBOX name='checkbox' value='checkbox3'>チェックボックス3</TD></TR> <TR><TH>コンボボックス</TH><TD> <SELECT name='combobox'> <OPTION value='combo1' selected>コンボボックス1</OPTION> <OPTION value='combo2' selected>コンボボックス2</OPTION> <OPTION value='combo3' selected>コンボボックス3</OPTION></TD> </SELECT></TR> <TR><TH>リストボックス</TH><TD> <SELECT name='listbox' size='3' <OPTION value='list1' selected>リストボックス1</OPTION> <OPTION value='list2'>リストボックス2</OPTION> <OPTION value='list3'>リストボックス3</OPTION></TD> </SELECT></TR> <TR><TH>複数選択リストボックス</TH><TD> <SELECT name='multilist' size='3' multiple <OPTION value='multilist1' selected>複数選択リストボックス1</OPTION> <OPTION value='multilist2'>複数選択リストボックス2</OPTION> <OPTION value='multilist3' selected>複数選択リストボックス3</OPTION></TD> </SELECT></TR> <TR><TH>コマンドボタン</TH><TD><INPUT type=SUBMIT name='submit' value='送信'></TD></TR> <TR><TH>リセットボタン</TH><TD><INPUT type=RESET name='reset' value='リセット'></TD></TR> </TABLE> </FORM> </BODY> </HTML>
上述したFormParam.htmlでは、テキスト入力フィールド、 パスワード入力、非表示テキスト、ラジオボタン、 チェックボックス、コンボボックス、リストボックス、 複数選択リストボックス、コマンドボタン(送信)、 リセットボタン(リセット)のフォーム構成要素 を表示する。
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 FormParam 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 { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>入力されたパラメータを表示するサーブレット</title>"); out.println("</head>"); out.println("<body>"); out.println("<ul>"); java.util.Enumeration en = request.getParameterNames(); while (en.hasMoreElements()) { String name = (String)en.nextElement(); String values[] = request.getParameterValues(name); for (int i = 0; i < values.length; i++) { out.println("<li>" + name + "=" + values[i]); } 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"; } }
たとえば、コンパイル済みのServletファイルFormParam.class(テキストファイルは FormParam.java)をWebサーバが動いているホストlocalhostのWebアプリケーションの ルートディレクトリ下のbuild/web/WEB-INF/classes/パッケージ名 ディレクトリに 格納する。HTMLファイルであるFormParam.htmlは、Webアプリケーションの ルートディレクトリ下に格納する。 Servletを実行するためには、FormParam.htmlを実行する。これにより、ブラウザが起動し、 HTMLフォームが表示される。ブラウザ上から日本語のデータを入力したり、項目を選択して、 送信ボタンを押すと、送信されたデータがそのまま表示される。
プログラム FormParam.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"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>入力されたパラメータを表示するサーブレット</title>"); out.println("</head>"); out.println("<body>"); out.println("<ul>"); java.util.Enumeration en = request.getParameterNames(); while (en.hasMoreElements()) { String name = (String)en.nextElement(); String values[] = request.getParameterValues(name); for (int i = 0; i < values.length; i++) { out.println("<li>" + name + "=" + values[i]); } out.println("<hr>"); } out.println("</ul>"); out.println("</body>"); out.println("</html>"); out.close(); }の中の、
java.util.Enumeration en = request.getParameterNames();
では、getParameterNamesメソッドを用いて、Servlet(FormParam)に送信された、 HTMLフォームからの入力データ(名前とその値の組)の名前の一覧を取得する。
while (en.hasMoreElements()) { String name = (String)en.nextElement(); String values[] = request.getParameterValues(name); .................................................. .................................................. }では、Enumerationオブジェクトの中で未処理のデータがあれば、hasMoreElementsメソッドが trueを返し、未処理のデータがなくなってfalseを返すまで、ループを繰り返す。ループ内では、 nextElementメソッドで名前を取り出し、名前に対する値をすべて取得する。
for (int i = 0; i < values.length; i++) { out.println("<li>" + name + "=" + values[i]); }では、名前に対する値の文字コードを変換して、"名前=値"の形式で出力する。
問題-1
FormInput1.java
をIDEとしてNetBeansを
使って実行してみよ。また、日本語を入力した場合には、文字化けが
起こっていることを確認せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-2
FormInput2.java
をIDEとしてNetBeansを
使って実行してみよ。日本語を入力した場合には、文字化けが
起こらずに日本語が表示されていることを確認せよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-3
FormInput2.java
をNetBeansを
使って実行してみよ。ただし、HTMLフォームとServletの通信方式を
POSTメソッドとすること。実行結果から、GETメソッドとPOSTメソッド
の違いを説明しなさい。
ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-4
FormParam.java
をNetBeansを
使って実行してみよ。
ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-5
FormParam.java
をNetBeansを
使って実行してみよ。その際のHTMLフォームとServletの通信方式を
GETメソッドとすること。実行結果から、GETメソッドとPOSTメソッド
の違いを説明しなさい。
ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-6
Kuku.java
を作成
しなさい。
ただし、NetBeansのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-7