教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
これに対して、今回は、ブラウザ(クライアント)側から、 入力データを受け渡してServletを呼び出すことを理解しよう。
ブラウザ(クライアント)側からサーバ側にデータを受け渡す方法 としては、大きく分けて以下の2つがある。
ここでは、後者の一方、HTMLフォームを利用して、HTMLページ上で 入力したデータを受け渡す方法を理解しよう。
以下のFormInput1.htmlでは、Formタグのaction属性の値には、送信ボタン が押された時に、テキスト入力フィールドに入力された文字列を Servletである/servlet/FormInput1.javaに渡すことを指定している。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>フォームからの入力</TITLE> </HEAD> <BODY> <FORM action='/servlet/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 javax.servlet.*;
import javax.servlet.http.*;
public class FormInput1 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
* <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にシフトJISを指定
response.setContentType("text/html; charset=Shift_JIS");
java.io.PrintWriter out = response.getWriter();
// まず最初の部分のメッセージを表示
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アプリケーションの
ルートディレクトリ下の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にシフトJISを指定 response.setContentType("text/html; charset=Shift_JIS"); java.io.PrintWriter out = response.getWriter(); // まず最初の部分のメッセージを表示 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(); }の中の
String name = request.getParameter("yourName");では、HTMLフォームで入力された文字列をgetParameterメソッドにより 取得する。このメソッドの引数には、テキスト入力フィールドの名前を指定する。 指定された名前により、どの入力フィールドの値を取得できるかが決定される。
次のFormInput2.htmlでは、Formタグのaction属性の値には、送信ボタン が押された時に、テキスト入力フィールドに入力された文字列を Servletである/servlet/FormInput2.javaに渡すことを指定している。 なお、HTMLフォームから入力されたデータは、GETメソッドによりServlet に送信される。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>フォームからの入力 その2</TITLE> </HEAD> <BODY> <FORM action='/servlet/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 javax.servlet.*; import javax.servlet.http.*; public class FormInput2 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 { // 日本語を表示するので、charsetにシフトJISを指定 response.setContentType("text/html; charset=Shift_JIS"); java.io.PrintWriter out = response.getWriter(); // まず最初の部分のメッセージを表示 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"); // フォームからのデータを受け取る String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); // 文字コード変換を実行 out.print(namejp); 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アプリケーションの ルートディレクトリ下の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にシフトJISを指定 response.setContentType("text/html; charset=Shift_JIS"); java.io.PrintWriter out = response.getWriter(); // まず最初の部分のメッセージを表示 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"); // フォームからのデータを受け取る String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); // 文字コード変換を実行 out.print(namejp); out.print(" さんですね。"); // 残りのメッセージを表示 out.println("</body>"); out.println("</html>"); out.close(); }の中の
String name = request.getParameter("yourName"); // フォームからのデータを受け取る String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); // 文字コード変換を実行では、HTML入力フォームからデータを受け取る。さらに、ISO-8859-1でコード化 された文字列をいったんバイナリデータに変換し、次に、そのバイナリデータ を本来コード化されている文字コードにより解釈し直して、文字列を作り直している。 "JISAutoDetect"は、入力がどの文字コードで記述されているかを自動的に判定 する。
FormParam.html
では、Formタグのaction属性の値には、送信ボタン
が押された時に、テキスト入力フィールドに入力された文字列を
Servletである/servlet/FormParam.javaに渡すことを指定している。
HTMLフォームから入力されたデータは、POSTメソッドによりFormParam.javaに送信される。
FormParam.java
は、指定したWebサーバのホスト名と取得したい
HTMLファイルを引数で指定して、Webサーバからのレスポンスを標準出力に表示する
プログラムである。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <TITLE>フォームからのいろいろな入力</TITLE> </HEAD> <BODY> <FORM method=POST action='/servlet/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</TD><TD> <OPTION value='combo2' selected>コンボボックス2</TD><TD> <OPTION value='combo3' selected>コンボボックス3</TD></TR> </SELECT> <TR><TH>リストボックス</TH><TD> <SELECT name='listbox' size='3'> <OPTION value='list1' selected>リストボックス1</TD><TD> <OPTION value='list2'>リストボックス2</TD><TD> <OPTION value='list3'>リストボックス3</TD></TR> </SELECT> <TR><TH>複数選択リストボックス</TH><TD> <SELECT name='multilist' size='3' multiple> <OPTION value='multilist1' selected>複数選択リストボックス1</TD><TD> <OPTION value='multilist2'>複数選択リストボックス2</TD><TD> <OPTION value='multilist3' selected>複数選択リストボックス3</TD></TR> </SELECT> <TR><TH>コマンドボタン</TH><TD><INPUT type=SUBMIT name='submit' value='送信'></TD><TD> <TR><TH>リセットボタン</TH><TD><INPUT type=RESET name='reset' value='リセット'></TD><TD> </FORM> </BODY> </HTML>
上述したFormParam.htmlでは、テキスト入力フィールド、 パスワード入力、非表示テキスト、ラジオボタン、 チェックボックス、コンボボックス、リストボックス、 複数選択リストボックス、コマンドボタン(送信)、 リセットボタン(リセット)のフォーム構成要素 を表示する。
import javax.servlet.*; import javax.servlet.http.*; public class FormParam 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=Shift_JIS"); java.io.PrintWriter out = response.getWriter(); 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++) { String value = new String(values[i].getBytes("8859_1"), "JISAutoDetect"); 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"; } }
たとえば、コンパイル済みのServletファイルFormParam.class(テキストファイルは FormParam.java)をWebサーバが動いているホストlocalhostの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 { response.setContentType("text/html; charset=Shift_JIS"); java.io.PrintWriter out = response.getWriter(); 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++) { String value = new String(values[i].getBytes("8859_1"), "JISAutoDetect"); out.println("<li>" + name + "=" + value); } 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++) { String value = new String(values[i].getBytes("8859_1"), "JISAutoDetect"); out.println("<li>" + name + "=" + value); }では、名前に対する値の文字コードを変換して、"名前=値"の形式で出力する。
問題-1
FormInput1.java
をIDEとしてSun ONEを
使って実行してみよ。また、日本語を入力した場合には、文字化けが
起こっていることを確認せよ。
ただし、Sun ONEのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-2
FormInput2.java
をIDEとしてSun ONEを
使って実行してみよ。日本語を入力した場合には、文字化けが
起こらずに日本語が表示されていることを確認せよ。
ただし、Sun ONEのServletテンプレートを使って、デフォルトの Servletクラスを作成、これを修正してプログラムを作成すること。
問題-3
FormInput2.java
をSun ONEを
使って実行してみよ。ただし、HTMLフォームとServletの通信方式を
POSTメソッドとすること。実行結果から、GETメソッドとPOSTメソッド
の違いを説明しなさい。
ただし、Sun ONEのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-4
FormParam.java
をSun ONEを
使って実行してみよ。
ただし、Sun ONEのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-5
FormParam.java
をSun ONEを
使って実行してみよ。その際のHTMLフォームとServletの通信方式を
GETメソッドとすること。実行結果から、GETメソッドとPOSTメソッド
の違いを説明しなさい。
ただし、Sun ONEのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-6
Kuku.java
を作成
しなさい。なお、プログラムの実行方法としては、ブラウザにURLを指定する
方法とHTMLフォームからGETメソッドを使う方法を利用しなさい。
ただし、Sun ONEのServletテンプレートを使って、デフォルトのServletクラスを 作成、これを修正してプログラムを作成すること。
問題-7