HttpServlet
先來複習一下上一節提到的類結構圖:
可以看到,HttpServlet繼承了GenericServlet,不過它也是一個抽象類別, 不能直接使用,只能繼承它。
HttpServlet中常用的方法有兩個:
doGet
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
當瀏覽器用GET方式訪問時,該方法被調用。
doPost
void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
當瀏覽器用POST方式訪問時,該方法被調用。
這兩個函數內部的處理方法基本上與上一節介紹的GenericServlet.service()函數相同。
另外其他的HTTP請求也都有相應的方法:
HTTP請求類別 |
HttpServlet的方法 |
GET |
doGet() |
POST |
doPost() |
HEAD |
doHead() |
PUT |
doPut() |
DELETE |
doDelete() |
HttpServletRequest
doGet()
和doPost()
函數的兩個參數為HttpServletRequest
和HttpServletResponse
對象。
HttpServletRequest
介面表示瀏覽器請求,你可以通過這個類擷取瀏覽器發送到伺服器的任何資訊。 對於PHP程式員來說,這個類有點類似於$_GET
、$_POST
、$_SERVER
等幾個變數的內容。 它的常用方法如下:
getParameter
String getParameter(String name)
擷取指定變數名name所對應的參數值。該方法實際上為父介面javax.servlet.ServletRequest
的方法。如果是GET請求則擷取查詢字串後的參數,POST請求則擷取<form>表單中的參數。類似於PHP的$_GET
和$_POST
數組。
getParameterValues
String[] getParameterValues(String name)
這個方法與getParameter()
類似。當你要擷取<input type=”check”>這類會返回多個值的表單屬性時,就應當用這個方法。
getMethod
String getMethod()
返回字串"GET"
或"POST"
。
getRequestURI
String getRequestURI()
擷取請求的URI(不包括查詢字串)。相當於PHP的$_SERVER['REQUEST_URI']
。
getServletPath
String getServletPath()
擷取Servlet的路徑。相當於PHP的$_SERVER['PHP_SELF']
。
getPathInfo
String getPathInfo()
擷取PathInfo。相當於PHP的$_SERVER['PATH_INFO']
。
setCharacterEncoding
void setCharacterEncoding(String new)
佈建要求的編碼。需要處理漢字時務必要通過該方法設定正確的字元編碼,否則將無法正確讀取瀏覽器發過來的文字。
還有好多有用的方法大家可以自己去參考介面文檔。
HttpServletResponse
HttpServletResponse介面則用於控制伺服器發送給用戶端的內容,相當於PHP的echo
、header
等函數。
setContentType
void setContentType(String type)
設定傳回值的類型。通常的HTML內容可設定為"text/html; charset=UTF-8"
等,而動態產生的圖片則可以設定為"image/gif"
等。輸出漢字之前,務必要通過該方法指定輸出的字元編碼。相當於在PHP中寫 header("Content-Type: image/gif")
。
ServletOutputStream
ServletOutputStream getOutputStream() throws IOException
向用戶端發送位元據時,需要通過此方法擷取輸出資料流。
getWriter
PrintWriter getWriter() throws IOException
向用戶端發送文本資料時,需要通過此方法擷取輸出資料流。
樣本程式
上一節建立Servlet時,我們先產生了Java代碼,再將其添加到web.xml的Servlet節中。 實際上可以直接在web.xml的Servlet節中建立Servlet,Eclicpse會自動幫我們產生Java代碼。
我們這次將建立一個表單提交程式,通過一個HTML表單提交資料,然後在Servlet中讀出資料並顯示出來。
首先按右鍵WebContent目錄,選擇New->HTML,建立一個HTML文檔,命名為 htmlpost.html。 下一步是選擇HTML模板,直接用預設值即可。
然後編輯 htmlpost.html,可參考本節的原始碼。原始碼下載:
httppost_jb51net.zip
按右鍵Deployment Descriptor中的Servlets,選擇New->Servlet。
按照下圖的樣子,在Java package處輸入包名 com.idv2.learnjsp,在 Class name處輸入類名 HttpPost,單擊Next。
出現Servlet映射的配置介面,輸入適當的Description。注意下方的 URL Mappings,這個就是從瀏覽器訪問該Servlet時使用的URL。
下一步選擇建立的類的屬性,通常選擇預設即可。 不過我們的Servlet只需要處理POST方法,所以下方的重載列表中只需選擇doPost即可。
最後單擊Finish,即可完成Servlet的建立,並且Eclipse會自動在Java代碼的src目錄中產生HttpPost.java檔案的架構。
編輯java代碼,可以參考下面的原始碼下載。
httppost_jb51net.zip
其實這段代碼的主要內容就是通過 getParameter 或者 getParameterValues 方法來擷取用戶端提交的資料。其程式碼片段如下;
複製代碼 代碼如下:
// 字元集
request.setCharacterEncoding("UTF-8");
// 從表單中獲得資料
out.println(" <li>使用者名稱: " + request.getParameter("username"));
out.println(" <li>密碼: " + request.getParameter("password"));
out.println(" <li>確認密碼: " + request.getParameter("confpass"));
// 擷取複選框的表單選項
String interests[] = request.getParameterValues("interests");
out.println(" <li>興趣愛好: <br/>");
if (interests != null) {
for (int i = 0; i < interests.length; i++) {
out.println(interests[i] + "<br/>");
}
}