Servlet開胃酒中介紹了Servlet的基本流程和設置方式。這裡,我們將看一些Servlet實例。這些實例都是HTTP通信(參考HTTP協議:http://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html)中的常見問題。我們通過操作request和response,來實現HTTP協議的功能。
Servlet的目的是動態生成頁面。比如下面的例子:
package foo; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class TestPage extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { PrintWriter out = response.getWriter(); Date now = new Date(); // Date & Time String page = "<html><body><p>" + now +"</p></body></html>"; out.println(page); } }
上面,我們調用response的getWriter()方法,向回復中寫入文本,即回復的主體部分。關於Java的讀寫,可參考Java IO基礎。
有時我們主體部分不是文本,這時我們需要OutputStream類型的寫入器,通過調用response的getOutputStream()方法來獲得。
我們利用java.util.Date()提供的功能,來動態的生成日期和時間顯示。效果如下:
HTTP請求有POST方法。Servlet通過doPost()方法來處理POST請求。POST方法的目的是向服務器提交數據,特別是HTML的FORM元素中包含的數據。
我們先來編寫一個包含有FORM的HTML頁面:
<html> <body> <form action="MyForm" method="post"> Username: <input type="text" name="user"><br> <input type="submit" value="Submit"> </form> </body> </html>
查看本欄目
頁面將提交給MyForm這個URL處理。提交的數據為text類型的user輸入。
下面是TestForm.java代碼,該代碼編譯成的Servlet將對應於MyForm這個URL(在web.xml中設置對應關系,參考Servlet開胃酒)
package foo; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class TestForm extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String username = request.getParameter("user"); // get "user" input PrintWriter out = response.getWriter(); String page = "<html><body><p>Submitted: " + username +"</p></body></html>"; out.println(page); } }
在上面的代碼中,我們改寫的是doPost()方法。此外,我們調用request的getParameter()方法,來獲得提交的數據,即user的參數值。我們隨後顯示了提交的數據。在真實使用情境下,我們可以對該數據進行其他的操作,比如放入數據庫。
顯示結果如下:
查看本欄目
我們看到,HTTP協議在Servlet中的操作,主要是通過request和response對象實現的。這兩個對象分別實施了HttpServletRequest接口和HttpServletResponse接口。HttpServletRequest接口繼承自ServletRequest接口,HttpServletResponse接口繼承自ServeletResponse接口。
下面列舉一些HttpServletRequest和HttpServletResponse的常用方法。
HttpServletRequest的方法 (官方參考:http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html)
獲得頭信息
String host = request.getHeader("Host");
獲得請求方法
String method = request.getMethod();
獲得請求中的cookies
Cookie[] cookies = request.getCookies();
讀取請求中的非文本資源,需要InputStream
InputStream input = request.getInputStream();
HttpServletResponse的方法 (官方參考:http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html)
設置MIME類型
response.setContentType("image/jpeg");
重新定向
response.sendRedirect("http://www.google.com");
設置頭信息
response.setHeader("Server","Apache-Coyote/1.1");
設置ContentLength
response.setContentLength();
設置狀態碼
response.setStatus(200);
HttpServletRequest和HttpServletResponse是HTTP協議在Servlet中的具體實施。通過調用它們,我們可以在Java內部來使用HTTP協議。對HTTP協議本身的了解,將有助於我們更好的使用這兩個接口。
作者:Vamei 出處:http://www.cnblogs.com/vamei