- Servlet 教程
- Servlet - 首頁
- Servlet - 概述
- Servlet - 環境設定
- Servlet - 生命週期
- Servlet - 示例
- Servlet - 表單資料
- Servlet - 客戶端請求
- Servlet - 伺服器響應
- Servlet - HTTP 程式碼
- Servlet - 編寫過濾器
- Servlet - 異常
- Servlet - 處理 Cookie
- Servlet - 會話跟蹤
- Servlet - 資料庫訪問
- Servlet - 檔案上傳
- Servlet - 處理日期
- Servlet - 頁面重定向
- Servlet - 點選計數器
- Servlet - 自動重新整理
- Servlet - 傳送電子郵件
- Servlet - 打包
- Servlet - 除錯
- Servlet - 國際化
- Servlet - 註解
- Servlet 有用資源
- Servlet - 常見問題解答
- Servlet - 快速指南
- Servlet - 有用資源
- Servlet - 討論
Servlet - 表單資料
您可能遇到過許多需要將一些資訊從瀏覽器傳遞到 Web 伺服器,最終傳遞到後端程式的情況。瀏覽器使用兩種方法將此資訊傳遞到 Web 伺服器。這些方法是 GET 方法和 POST 方法。
GET 方法
GET 方法傳送編碼的使用者資訊,並將其附加到頁面請求中。頁面和編碼的資訊由?(問號)符號分隔,如下所示:
http://www.test.com/hello?key1 = value1&key2 = value2
GET 方法是將資訊從瀏覽器傳遞到 Web 伺服器的預設方法,它會生成一個長字串,該字串顯示在瀏覽器的 Location: 框中。如果您需要將密碼或其他敏感資訊傳遞到伺服器,切勿使用 GET 方法。GET 方法有大小限制:請求字串中只能使用 1024 個字元。
此資訊使用 QUERY_STRING 標頭傳遞,並且可以透過 QUERY_STRING 環境變數訪問,Servlet 使用doGet() 方法處理此類請求。
POST 方法
將資訊傳遞到後端程式的一種通常更可靠的方法是 POST 方法。此方法以與 GET 方法完全相同的方式打包資訊,但它不是在 URL 中問號 (?) 後面作為文字字串傳送,而是將其作為單獨的訊息傳送。此訊息以標準輸入的形式到達後端程式,您可以對其進行解析並用於處理。Servlet 使用doPost() 方法處理此類請求。
使用 Servlet 讀取表單資料
Servlet 根據情況自動處理表單資料的解析,使用以下方法:
getParameter() - 您呼叫 request.getParameter() 方法以獲取表單引數的值。
getParameterValues() - 如果引數出現多次並返回多個值(例如複選框),則呼叫此方法。
getParameterNames() - 如果您希望獲取當前請求中所有引數的完整列表,則呼叫此方法。
使用 URL 的 GET 方法示例
以下是一個簡單的 URL,它將使用 GET 方法將兩個值傳遞給 HelloForm 程式。
https://:8080/HelloForm?first_name = ZARA&last_name = ALI下面是HelloForm.java Servlet 程式,用於處理 Web 瀏覽器提供的輸入。我們將使用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-安裝目錄>/webapps/ROOT/WEB-INF/classes 中,並在位於<Tomcat-安裝目錄>/webapps/ROOT/WEB-INF/ 中的web.xml 檔案中建立以下條目:
<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: 框中鍵入https://:8080/HelloForm?first_name=ZARA&last_name=ALI,並確保在瀏覽器中執行上述命令之前已啟動 Tomcat 伺服器。這將生成以下結果:
Using GET Method to Read Form Data
- First Name: ZARA
- Last Name: ALI
使用表單的 GET 方法示例
這是一個簡單的示例,它使用 HTML 表單和提交按鈕傳遞兩個值。我們將使用相同的 Servlet 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.htm 的檔案中,並將其放在<Tomcat-安裝目錄>/webapps/ROOT 目錄中。當您訪問https://:8080/Hello.htm時,這是上述表單的實際輸出。
嘗試輸入名字和姓氏,然後單擊提交按鈕以檢視 Tomcat 正在執行的本地計算機上的結果。根據提供的輸入,它將生成與上述示例中提到的類似結果。
使用表單的 POST 方法示例
讓我們對上述 Servlet 進行一些修改,以便它可以處理 GET 和 POST 方法。以下是HelloForm.java Servlet 程式,用於使用 GET 或 POST 方法處理 Web 瀏覽器提供的輸入。
// 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);
}
}
現在編譯並部署上述 Servlet,並使用 Hello.htm 和 POST 方法對其進行測試,如下所示:
<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 正在執行的本地計算機上的結果。
根據提供的輸入,它將生成與上述示例中提到的類似結果。
將複選框資料傳遞到 Servlet 程式
當需要選擇多個選項時,使用複選框。
以下是用 HTML 編寫的示例程式碼 CheckBox.htm,它包含一個有兩個複選框的表單:
<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>
此程式碼的結果是以下表單:
下面是CheckBox.java Servlet 程式,用於處理 Web 瀏覽器為複選框按鈕提供的輸入。
// 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
- Maths Flag : : on
- Physics Flag: : null
- Chemistry Flag: : on
讀取所有表單引數
以下是一般示例,它使用getParameterNames() 方法從 HttpServletRequest 讀取所有可用的表單引數。此方法返回一個 Enumeration,其中包含以未指定順序排列的引數名稱。
一旦我們有了 Enumeration,我們就可以透過使用hasMoreElements() 方法確定何時停止以及使用nextElement() 方法獲取每個引數名稱來以標準方式迴圈遍歷 Enumeration。
// 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);
}
}
現在,使用以下表單嘗試上述 Servlet:
<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>
現在使用上述表單呼叫 Servlet 將生成以下結果:
Reading All Form Parameters
Param Name Param Value(s) maths on chemistry on
您可以嘗試使用上述 Servlet 讀取任何其他表單的資料,這些表單包含其他物件,例如文字框、單選按鈕或下拉框等。
