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