Java Servlet和JSP教程(4)(轉)

發表於2007-08-11
Java Servlet和JSP教程(4)(轉)[@more@]

4 表單

4.1 表單資料概述

如果你曾經使用過Web搜尋引擎,或者瀏覽過線上書店、股票價格、機票資訊,或許會留意到一些古怪的URL,比如“ user=Marty+Hall&origin=bwi&dest=lax”。這個URL中位於問號後面的部分,即“user= Marty+Hall&origin=bwi&dest=lax”,就是表單資料,這是將Web頁面資料傳送給伺服器程式的最常用方法。對於GET請求,表單資料附加到URL的問號後面(如上例所示);對於POST請求,表單資料用一個單獨的行傳送給伺服器。

以前,從這種形式的資料提取出所需要的表單變數是CGI程式設計中最麻煩的事情之一。首先,GET請求和POST請求的資料提取方法不同:對於GET請求,通常要透過QUERY_STRING環境變數提取資料;對於POST請求,則一般透過標準輸入提取資料。第二,程式設計師必須負責在“&”符號處截斷變數名字-變數值對,再分離出變數名字(等號左邊)和變數值(等號右邊)。第三,必須對變數值進行URL反編碼操作。因為傳送資料的時候,字母和數字以原來的形式傳送,但空格被轉換成加號,其他字元被轉換成“%XX”形式,其中XX是十六進位制表示的字元ASCII(或者ISO Latin-1)編碼值。例如,如果HTML表單中名為“users”的域值為“~hall, ~gates, and ~mcnealy”,則實際向伺服器傳送的資料為 “users=%7Ehall%2C+%7Egates%2C+and+%7Emcnealy”。最後,即第四個導致解析表單資料非常困難的原因在於,變數值既可能被省略(如“param1=val1&param2=&param3=val3”),也有可能一個變數擁有一個以上的值,即同一個變數可能出現一次以上(如“param1=val1&param2=val2&param1=val3”)。

Java Servlet的好處之一就在於所有上述解析操作都能夠自動完成。只需要簡單地呼叫一下HttpServletRequest的getParameter方法、在呼叫引數中提供表單變數的名字(大小寫敏感)即可,而且GET請求和POST請求的處理方法完全相同。

getParameter方法的返回值是一個字串,它是引數中指定的變數名字第一次出現所對應的值經反編碼得到得字串(可以直接使用)。如果指定的表單變數存在,但沒有值, getParameter返回空字串;如果指定的表單變數不存在,則返回null。如果表單變數可能對應多個值,可以用 getParameterValues來取代getParameter。getParameterValues能夠返回一個字串陣列。

最後,雖然在實際應用中Servlet很可能只會用到那些已知名字的表單變數,但在除錯環境中,獲得完整的表單變數名字列表往往是很有用的,利用 getParamerterNames方法可以方便地實現這一點。getParamerterNames返回的是一個Enumeration,其中的每一項都可以轉換為呼叫getParameter的字串。

4.2 例項:讀取三個表單變數

下面是一個簡單的例子,它讀取三個表單變數param1、param2和param3,並以HTML列表的形式列出它們的值。請注意,雖然在傳送應答內容之前必須指定應答型別(包括內容型別、狀態以及其他HTTP頭資訊),但Servlet對何時讀取請求內容卻沒有什麼要求。

另外,我們也可以很容易地把Servlet做成既能處理GET請求,也能夠處理POST請求,這隻需要在doPost方法中呼叫doGet方法,或者覆蓋 service方法(service方法呼叫doGet、doPost、doHead等方法)。在實際程式設計中這是一種標準的方法,因為它只需要很少的額外工作,卻能夠增加客戶端編碼的靈活性。

如果你習慣用傳統的CGI方法,透過標準輸入讀取POST資料,那麼在Servlet 中也有類似的方法,即在HttpServletRequest上呼叫getReader或者getInputStream,但這種方法對普通的表單變數來說太麻煩。然而,如果是要上載檔案,或者POST資料是透過專門的客戶程式而不是HTML表單傳送,那麼就要用到這種方法。

注意用第二種方法讀取POST資料時,不能再用getParameter來讀取這些資料。

ThreeParams.java

package hall;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.*;

public class ThreeParams extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");

PrintWriter out = response.getWriter();

String title = "讀取三個請求引數";

out.println(ServletUtilities.headWithTitle(title) +

"

" +

"

" + title + "

" +

"

    " +

    "
  • param1: "

    + request.getParameter("param1") + "

    " +

    "
  • param2: "

    + request.getParameter("param2") + "

    " +

    "
  • param3: "

    + request.getParameter("param3") + "

    " +

    "

" +

"

相關文章