JSP - 表單處理



本章將討論 JSP 中的表單處理。您一定遇到過許多需要將一些資訊從瀏覽器傳遞到 Web 伺服器,最終傳遞到後端程式的情況。瀏覽器使用兩種方法將此資訊傳遞到 Web 伺服器。這些方法是 GET 方法和 POST 方法。

表單處理中的方法

現在讓我們討論表單處理中的方法。

GET 方法

GET 方法傳送附加到頁面請求的編碼使用者資訊。頁面和編碼資訊由 ? 字元分隔,如下所示:

http://www.test.com/hello?key1=value1&key2=value2

GET 方法是從瀏覽器傳遞資訊到 Web 伺服器的預設方法,它會生成一個長字串,該字串顯示在瀏覽器的位置欄中。如果要將密碼或其他敏感資訊傳遞到伺服器,建議最好不要使用 GET 方法。

GET 方法有大小限制:請求字串只能包含 1024 個字元

此資訊使用QUERY_STRING 標頭傳遞,並且可以透過 QUERY_STRING 環境變數訪問,可以使用請求物件的getQueryString()getParameter() 方法進行處理。

POST 方法

將資訊傳遞到後端程式的一種更可靠的方法通常是 POST 方法。

此方法打包資訊的方式與 GET 方法完全相同,但它不是在 URL 中 ? 後面傳送文字字串,而是將其作為單獨的訊息傳送。此訊息以標準輸入的形式到達後端程式,您可以對其進行解析並用於處理。

JSP 使用getParameter() 方法讀取簡單引數和getInputStream() 方法讀取來自客戶端的二進位制資料流來處理此類請求。

使用 JSP 讀取表單資料

JSP 根據情況使用以下方法自動處理表單資料解析:

  • getParameter() − 呼叫request.getParameter() 方法獲取表單引數的值。

  • getParameterValues() − 如果引數出現多次並返回多個值(例如複選框),則呼叫此方法。

  • getParameterNames() − 如果要獲取當前請求中所有引數的完整列表,則呼叫此方法。

  • getInputStream() − 呼叫此方法讀取來自客戶端的二進位制資料流。

使用 URL 的 GET 方法示例

以下 URL 將使用 GET 方法將兩個值傳遞給 HelloForm 程式。

https://:8080/main.jsp?first_name=ZARA&last_name=ALI

以下是處理 Web 瀏覽器提供的輸入的main.jsp JSP 程式。我們將使用getParameter() 方法,這使得訪問傳遞的資訊非常容易:

<html>
   <head>
      <title>Using GET Method to Read Form Data</title>
   </head>
   
   <body>
      <h1>Using GET Method to Read Form Data</h1>
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

現在在瀏覽器的位置欄中輸入https://:8080/main.jsp?first_name=ZARA&last_name=ALI。這將生成以下結果:

使用 GET 方法讀取表單資料

  • 名字:ZARA

  • 姓氏:ALI

使用表單的 GET 方法示例

以下是一個使用 HTML 表單和提交按鈕傳遞兩個值的示例。我們將使用相同的 JSP main.jsp 來處理此輸入。

<html>
   <body>
      
      <form action = "main.jsp" 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時,您將收到以下輸出。

名字
姓氏
< p>嘗試輸入名字和姓氏,然後單擊提交按鈕以檢視 Tomcat 執行的本地計算機上的結果。根據提供的輸入,它將生成與上述示例類似的結果。

使用表單的 POST 方法示例

讓我們對上面的 JSP 進行一些修改,以處理 GET 和 POST 方法。以下是處理 Web 瀏覽器使用 GET 或 POST 方法提供的輸入的main.jsp JSP 程式。

事實上,上面的 JSP 沒有變化,因為傳遞引數的唯一方法發生了變化,並且沒有將二進位制資料傳遞給 JSP 程式。檔案處理相關的概念將在單獨的章節中解釋,在該章節中我們需要讀取二進位制資料流。

<html>
   <head>
      <title>Using GET and POST Method to Read Form Data</title>
   </head>
   
   <body>
      <center>
      <h1>Using POST Method to Read Form Data</h1>
      
      <ul>
         <li><p><b>First Name:</b>
            <%= request.getParameter("first_name")%>
         </p></li>
         <li><p><b>Last  Name:</b>
            <%= request.getParameter("last_name")%>
         </p></li>
      </ul>
   
   </body>
</html>

以下是Hello.htm檔案的內容:

<html>
   <body>
      
      <form action = "main.jsp" 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>

現在讓我們將main.jsp和hello.htm放在<Tomcat 安裝目錄>/webapps/ROOT 目錄中。當您訪問https://:8080/Hello.htm時,您將收到以下輸出。

名字
姓氏

嘗試輸入名字和姓氏,然後單擊提交按鈕以檢視 Tomcat 執行的本地計算機上的結果。

根據提供的輸入,您將收到與上述示例類似的結果。

將複選框資料傳遞到 JSP 程式

當需要選擇多個選項時,使用複選框。

以下是包含兩個複選框的表單的示例HTML 程式碼,CheckBox.htm

<html>
   <body>
      
      <form action = "main.jsp" 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 瀏覽器為複選框按鈕提供的輸入的 main.jsp JSP 程式。

<html>
   <head>
      <title>Reading Checkbox Data</title>
   </head>
   
   <body>
      <h1>Reading Checkbox Data</h1>
      
      <ul>
         <li><p><b>Maths Flag:</b>
            <%= request.getParameter("maths")%>
         </p></li>
         <li><p><b>Physics Flag:</b>
            <%= request.getParameter("physics")%>
         </p></li>
         <li><p><b>Chemistry Flag:</b>
            <%= request.getParameter("chemistry")%>
         </p></li>
      </ul>
   
   </body>
</html>

以上程式將生成以下結果:

Reading Checkbox Data

  • Maths Flag :: on

  • Physics Flag:: null

  • Chemistry Flag:: on

讀取所有表單引數

以下是一個通用的示例,它使用 HttpServletRequest 的getParameterNames() 方法讀取所有可用的表單引數。此方法返回一個列舉,其中包含引數名稱,但順序未指定。

獲得列舉後,我們可以使用標準方式向下迴圈列舉,使用hasMoreElements() 方法確定何時停止,並使用nextElement() 方法獲取每個引數名稱。

<%@ page import = "java.io.*,java.util.*" %>

<html>
   <head>
      <title>HTTP Header Request Example</title>
   </head>

   <body>
      <center>
         <h2>HTTP Header Request Example</h2>
         <table width = "100%" border = "1" align = "center">
            <tr bgcolor = "#949494">
               <th>Param Name</th>
               <th>Param Value(s)</th>
            </tr>
            <%
               Enumeration paramNames = request.getParameterNames();
               while(paramNames.hasMoreElements()) {
                  String paramName = (String)paramNames.nextElement();
                  out.print("<tr><td>" + paramName + "</td>\n");
                  String paramValue = request.getHeader(paramName);
                  out.println("<td> " + paramValue + "</td></tr>\n");
               }
            %>
         </table>
      </center>
   
   </body>
</html>

以下是Hello.htm的內容:

<html>
   <body>
      
      <form action = "main.jsp" 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>

現在嘗試使用上面的 Hello.htm 呼叫 JSP;這將根據提供的輸入生成如下所示的結果:

讀取所有表單引數

引數名稱 引數值(s)
數學 已選中
化學 已選中

您可以嘗試使用上面的 JSP 讀取任何其他表單的資料,這些表單包含文字框、單選按鈕或下拉列表等其他物件。

廣告