教育サーバーのページ
オンラインテキスト目次
システムプログラミング演習
これに対して、今回は、ブラウザ(クライアント)側から、 入力データを受け渡して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