很多情況下,需要傳遞一些信息,從瀏覽器到Web服務器,最終到後台程序。瀏覽器使用兩種方法可將此信息傳遞到Web服務器,分彆為GET方法和POST方法。
GET方法發送編碼的用戶信息添加到頁麵請求。頁麵並已編碼的信息中作用 ?分離字符如下:
http://www.gitbook.net/hello?key1=value1&key2=value2
GET方法是默認的方法來傳遞信息,從瀏覽器到Web服務器,它會產生一個很長的字符串出現在瀏覽器的位置:框中。不要使用GET方法,如果你有密碼或其他敏感信息傳遞給服務器。GET方法有大小限製:能夠在一個請求字符串,隻有1024個字符。
這個信息被傳遞使用QUERY_STRING頭,將可以通過QUERY_STRING環境變量的servlet處理這種類型的請求使用doGet()方法。
將信息傳遞給後端的程序一般比較可靠的方法是POST方法。這些軟件包中的信息完全相同的方式為GET方法,而是把它發送一個文本字符串在?後,在URL中,它發送它作為一個單獨的消息。This 此消息的形式,可以處理分析和使用標準輸入到後台程序。servlet處理這種類型的請求使用doPost()方法。
Servlet的處理表單數據解析自動根據不同的情況使用下列方法:
getParameter(): 可以調用request.getParameter()方法的獲取表單參數的值。
getParameterValues(): 調用此方法,如果參數出現一次以上,並返回多個值,例如“複選框“。
getParameterNames(): 如果你想在當前請求的所有參數的完整列表,調用此方法。
下麵是一個簡單的URL,將傳遞兩個值HelloForm程序,使用GET方法。
http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI下麵的servlet程序來處理HelloForm.java通過Web瀏覽器的輸入,我們將使用getParameter()方法,這使得它很容易訪問傳遞的信息:
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Extend HttpServlet class -by www.gitbook.net 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-installation-directory>/webapps/ ROOT/WEB-INF/classes,創建web.xml文件中的條目,位於<Tomcat-installation-directory>/webapps/ROOT/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>
現在在瀏覽器的位置:框中輸入http://localhost:8080/HelloForm?first_name=ZARA&last_name=ALI,確保已經啟動Tomcat服務器,在瀏覽器上麵的命令請求前。這將產生以下結果:
Using GET Method to Read Form Data
|
下麵是一個簡單的例子,通過兩個值,使用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-installation-directory>/webapps /目錄根目錄。當你想訪問http://localhost:8080/Hello.htm,這裡是上述形式的實際輸出。
First Name:嘗試輸入First Name和Last名稱,然後單擊“提交”按鈕,在Tomcat運行在本地計算機上看到的結果。基於所提供的輸入的,它會產生類似的結果,如在上麵的例子中提到的。
讓我們在上麵的servlet做小的修改,以便它可以處理GET和POST方法。下麵的servlet程序來處理HelloForm.java通過Web瀏覽器輸入使用GET或POST方法。
// 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運行在本地計算機上看到的結果。
基於提供的輸入,將產生類似的結果,如在上述例子中提到。
複選框被使用時,須選擇一個以上的選項。
下麵是一個例子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>
這段代碼的結果是以下表格
Maths Physics Chemistry下麵的servlet程序來處理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
|
以下是通用的示例,它使用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); } }
現在,請嘗試下麵的表格上麵的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使用上述表單,將產生以下結果:
Param Name | Param Value(s) |
---|---|
maths | on |
chemistry | on |
你可以試試上麵的servlet讀取任何其他形式的數據等其他的對象,如文本框,單選按鈕或下拉框等