Servlets-form-data
サーブレット-フォームデータ
ブラウザからWebサーバーに、そして最終的にはバックエンドプログラムに情報を渡す必要がある場合、多くの状況に出くわしたに違いありません。 ブラウザは、2つの方法を使用してこの情報をWebサーバーに渡します。 これらのメソッドは、GETメソッドとPOSTメソッドです。
GETメソッド
GETメソッドは、エンコードされたユーザー情報をページリクエストに追加して送信します。 ページとエンコードされた情報は、次のように*?*(疑問符)記号で区切られています-
http://www.test.com/hello?key1 = value1&key2 = value2
GETメソッドは、ブラウザからWebサーバーに情報を渡すデフォルトのメソッドであり、ブラウザのLocation:boxに表示される長い文字列を生成します。 サーバーに渡すパスワードまたはその他の機密情報がある場合は、GETメソッドを使用しないでください。 GETメソッドにはサイズ制限があります。リクエスト文字列には1024文字しか使用できません。
この情報はQUERY_STRINGヘッダーを使用して渡され、QUERY_STRING環境変数を介してアクセスでき、サーブレットは* doGet()*メソッドを使用してこのタイプのリクエストを処理します。
POSTメソッド
一般に、バックエンドプログラムに情報を渡すより信頼性の高い方法は、POSTメソッドです。 これは、GETメソッドとまったく同じ方法で情報をパッケージ化しますが、?の後にテキスト文字列として送信する代わりに (疑問符)をURLに含めて、個別のメッセージとして送信します。 このメッセージは、解析して処理に使用できる標準入力の形式でバックエンドプログラムに送信されます。 サーブレットは* doPost()*メソッドを使用してこのタイプのリクエストを処理します。
サーブレットを使用したフォームデータの読み取り
サーブレットは、状況に応じて次の方法を使用して、フォームデータの解析を自動的に処理します-
- * getParameter()*-request.getParameter()メソッドを呼び出して、フォームパラメーターの値を取得します。
- * getParameterValues()*-パラメーターが複数回表示され、チェックボックスなどの複数の値を返す場合、このメソッドを呼び出します。
- * getParameterNames()*-現在のリクエストのすべてのパラメータの完全なリストが必要な場合は、このメソッドを呼び出します。
URLを使用したGETメソッドの例
これは、GETメソッドを使用して2つの値をHelloFormプログラムに渡す簡単なURLです。
*http://localhost:8080/HelloForm?first_name = ZARA&last_name = ALI*
Webブラウザからの入力を処理する HelloForm.java サーブレットプログラムを以下に示します。 渡された情報へのアクセスを非常に簡単にする* getParameter()*メソッドを使用します-
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//Extend HttpServlet class
public class HelloForm extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Using GET Method to Read Form Data";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body>" +
"</html>"
);
}
}
環境が適切に設定されていると仮定して、HelloForm.javaを次のようにコンパイルします-
$ javac HelloForm.java
すべてがうまくいけば、上記のコンパイルは HelloForm.class ファイルを生成します。 次に、このクラスファイルを<Tomcat-installationdirectory>/webapps/ROOT/WEB-INF/classesにコピーし、<Tomcat-installation-directory>/webapps/ROOT/にある web.xml ファイルに次のエントリを作成する必要があります。 WEB-INF/
<servlet>
<servlet-name>HelloForm</servlet-name>
<servlet-class>HelloForm</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloForm</servlet-name>
<url-pattern>/HelloForm</url-pattern>
</servlet-mapping>
ブラウザのLocation:boxに_http://localhost:8080/HelloForm?first_name = ZARA&last_name = ALI_と入力し、ブラウザで上記のコマンドを実行する前に、Tomcatサーバーがすでに起動していることを確認します。 これは、次の結果を生成します-
Using GET Method to Read Form Data
- 名:ZARA
- 姓:ALI
フォームを使用したGETメソッドの例
次に、HTML FORMと送信ボタンを使用して2つの値を渡す簡単な例を示します。 同じサーブレットHelloFormを使用して、この入力を処理します。
<html>
<body>
<form action = "HelloForm" method = "GET">
First Name: <input type = "text" name = "first_name">
<br/>
Last Name: <input type = "text" name = "last_name"/>
<input type = "submit" value = "Submit"/>
</form>
</body>
</html>
このHTMLをHelloファイルに保存し、<Tomcat-installationdirectory>/webapps/ROOTディレクトリに配置します。 _http://localhost:8080/Hello_にアクセスすると、上記のフォームの実際の出力は次のようになります。
名前苗字:
名と姓を入力してから、送信ボタンをクリックして、Tomcatが実行されているローカルマシンで結果を確認してください。 提供された入力に基づいて、上記の例で述べたのと同様の結果が生成されます。
フォームを使用したPOSTメソッドの例
上記のサーブレットを少し変更して、GETメソッドとPOSTメソッドを処理できるようにします。 以下は、GETまたはPOSTメソッドを使用してWebブラウザから与えられた入力を処理する HelloForm.java サーブレットプログラムです。
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//Extend HttpServlet class
public class HelloForm extends HttpServlet {
//Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Using GET Method to Read Form Data";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>First Name</b>: "
+ request.getParameter("first_name") + "\n" +
" <li><b>Last Name</b>: "
+ request.getParameter("last_name") + "\n" +
"</ul>\n" +
"</body>"
"</html>"
);
}
//Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
次に、上記のサーブレットをコンパイルしてデプロイし、次のようにPOSTメソッドでHelloを使用してテストします-
<html>
<body>
<form action = "HelloForm" method = "POST">
First Name: <input type = "text" name = "first_name">
<br/>
Last Name: <input type = "text" name = "last_name"/>
<input type = "submit" value = "Submit"/>
</form>
</body>
</html>
上記のフォームの実際の出力は次のとおりです。姓と名を入力して[送信]ボタンをクリックし、Tomcatが実行されているローカルマシンで結果を確認します。
名前苗字:
提供された入力に基づいて、上記の例で述べたのと同様の結果が生成されます。
チェックボックスデータをサーブレットプログラムに渡す
チェックボックスは、複数のオプションを選択する必要がある場合に使用されます。
これは、2つのチェックボックスを持つフォームのサンプルHTMLコードCheckBoxです。
<html>
<body>
<form action = "CheckBox" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" checked = "checked"/> Maths
<input type = "checkbox" name = "physics" /> Physics
<input type = "checkbox" name = "chemistry" checked = "checked"/>
Chemistry
<input type = "submit" value = "Select Subject"/>
</form>
</body>
</html>
このコードの結果は次の形式です
数学物理化学
以下に示すのは、Webブラウザからチェックボックスボタンに指定された入力を処理するCheckBox.javaサーブレットプログラムです。
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
//Extend HttpServlet class
public class CheckBox extends HttpServlet {
//Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading Checkbox Data";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>Maths Flag : </b>: "
+ request.getParameter("maths") + "\n" +
" <li><b>Physics Flag: </b>: "
+ request.getParameter("physics") + "\n" +
" <li><b>Chemistry Flag: </b>: "
+ request.getParameter("chemistry") + "\n" +
"</ul>\n" +
"</body>"
"</html>"
);
}
//Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
上記の例では、次の結果が表示されます-
Reading Checkbox Data
- 数学フラグ::オン
- 物理フラグ::null
- 化学フラグ::オン
すべてのフォームパラメーターの読み取り
以下は、HttpServletRequestの* getParameterNames()*メソッドを使用して、使用可能なすべてのフォームパラメーターを読み取る一般的な例です。 このメソッドは、指定されていない順序でパラメーター名を含む列挙を返します
列挙ができたら、_hasMoreElements()_メソッドを使用して停止するタイミングを決定し、_nextElement()_メソッドを使用して各パラメーター名を取得することにより、標準的な方法で列挙をループできます。
//Import required java libraries
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
//Extend HttpServlet class
public class ReadParams extends HttpServlet {
//Method to handle GET method request.
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//Set response content type
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading All Form Parameters";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor = \"#f0f0f0\">\n" +
"<h1 align = \"center\">" + title + "</h1>\n" +
"<table width = \"100%\" border = \"1\" align = \"center\">\n" +
"<tr bgcolor = \"#949494\">\n" +
"<th>Param Name</th>"
"<th>Param Value(s)</th>\n"+
"</tr>\n"
);
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.print("<tr><td>" + paramName + "</td>\n<td>");
String[] paramValues = request.getParameterValues(paramName);
//Read single valued data
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.println("<i>No Value</i>");
else
out.println(paramValue);
} else {
//Read multiple valued data
out.println("<ul>");
for(int i = 0; i < paramValues.length; i++) {
out.println("<li>" + paramValues[i]);
}
out.println("</ul>");
}
}
out.println("</tr>\n</table>\n</body></html>");
}
//Method to handle POST method request.
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
さて、次の形式で上記のサーブレットを試してください-
<html>
<body>
<form action = "ReadParams" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" checked = "checked"/> Maths
<input type = "checkbox" name = "physics" /> Physics
<input type = "checkbox" name = "chemistry" checked = "checked"/> Chem
<input type = "submit" value = "Select Subject"/>
</form>
</body>
</html>
今、上記のフォームを使用してサーブレットを呼び出すと、次の結果が生成されます-
Reading All Form Parameters
Param Name | Param Value(s) |
---|---|
maths | on |
chemistry | on |
上記のサーブレットを試して、テキストボックス、ラジオボタン、ドロップダウンボックスなどの他のオブジェクトを持つ他のフォームのデータを読み取ることができます。