1. 程式人生 > >Servlet入門外2

Servlet入門外2

trace writer problem hat 表單 用戶 post swe t對象

Servlet入門外2
Servlets 執行 javax.servlet.Servlet interface. 當servlet編寫者可以通過直接implement interface開發servlet, 但這樣通常沒有必要. 因為大多數servlet是針對用HTTP協議的web服務器, 這樣最通用開發servlet辦法是用 javax.servlet.http.HttpServlet 內.

HttpServlet 類通過extend GenericServlet基類執行 Servlet interface, 提供了處理HTTP協議的功能. 他的service方法支持標準HTTP/1.1請求.

一般地, 用HttpServlet指定的類編寫的servlets可以多線程地並發運行 service方法.

2.1 與客戶端的交互性

Servlet編寫者註意HttpServlet類有幾個欠缺的方法,你可以自己定義方法中內容,但是必須使用這些方法名稱以使servlet知道你想做什麽,

doGet, 用於處理 GET、有條件的GET 和頭部 HEAD請求

doPost, 用戶處理 POST 請求

doPut, 用於處理 PUT 請求

doDelete, 用於處理 DELETE請求

HttpServlet的service方法, 一般地, 當它接收到一個OPTIONS請求時,會調用doOptions 方法, 當接收一個TRACE請求是調用doTrace . doOptions缺省執行方式是自動決定什麽樣的HTTP被選擇並且返回哪個信息.

在你使用這些方法時,必須帶兩個闡述. 第一個包含來自客戶端的數據 HttpServletRequest. 第二個參數包含客戶端的響應HttpServletResponse. 在下例中是這樣的情況.

一個HttpServletRequest對象提供到達HTTP 頭部數據, 也允許你獲取客戶端的數據. 怎樣獲取這些數據取決於HTTP端請求方法.

不管任何HTTP方式, 你可以用 getParameterValues 方法, 這個用來返回特定名稱的參數值. 對於用 HTTP GET 請求的方式, 這個 getQueryString 方法將會返回一個可以用來解剖分析的.

對於用HTTP POST, PUT, 和 DELETE請求的方式, 你有兩種方法可以選擇. 如果是文本數據,你能通過getReader方法用BufferedReader獲取 ; 如果是二進制數據, 能通過getReader 方法用 ServletInputStream獲取.

為了響應客戶端, 一個HttpServletResponse對象提供返回數據給用戶的兩個方法. 你可以用getWriter 方法返回,或者 getOutputStream 方法以輸出流返回. 你應該用getWriter返回文本數據,而用getOutputStream返回二進制數據.

在使用Writer 或 OutputStream之前, HTTP 頭部應該先被設置. HttpServletResponse內提供這樣一個方法,之後可以用writer 或 outputstream 將響應主體部分發回用戶. 完成後要關閉 writer 或 output stream以便讓服務器知道響應已經完畢.

2.2 一個HTTP Servlet處理GET和HEAD方法的例子



public class SimpleServlet extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
// 首先設置頭部
res.setContentType("text/html");

// 用 writer方法返回響應數據
PrintWriter out = res.getWriter();
out.println("<HEAD><TITLE> SimpleServlet Output</TITLE></HEAD><BODY>");
out.println("<h1> SimpleServlet Output </h1>");
out.println("<P>This is output is from SimpleServlet.");
out.println("</BODY>");
out.close();
}

public String getServletInfo() {
return "A simple servlet";
}

}

這個例子完整地現實了一個servlet.
2.3 一個HTTP Servlet處理POST方式的例子

這裏是個用HTML帶POST表單的例子:


<html>
<head><title>JdcSurvey</title></head>
<body>
<form action=http://demo:8080/servlet/survey method=POST>
<input type=hidden name=survey value=Survey01Results>

<BR><BR>How Many Employees in your Company?<BR>
<BR>1-100<input type=radio name=employee value=1-100>
<BR>100-200<input type=radio name=employee value=100-200>
<BR>200-300<input type=radio name=employee value=200-300>
<BR>300-400<input type=radio name=employee value=300-400>
<BR>500-more<input type=radio name=employee value=500-more>

<BR><BR>General Comments?<BR>
<BR><input type=text name=comment>

<BR><BR>What IDEs do you use?<BR>
<BR>JavaWorkShop<input type=checkbox name=ide value=JavaWorkShop>
<BR>J++<input type=checkbox name=ide value=J++>
<BR>Cafe‘<input type=checkbox name=ide value=Cafe‘>

<BR><BR><input type=submit><input type=reset>
</form>
</body>
</html>

這裏的servlet將表單數據寫入一個文件,並且用一個thank you信息響應用戶. 這裏servlet的方法,如下例:


public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
// 首先設置響應的 "content type" 頭部
res.setContentType("text/html");

//得到響應的 PrintWriter以返回文本給客戶端.
PrintWriter toClient = res.getWriter();

try {
//打開一個文件寫入Survey的結果.
String surveyName = req.getParameterValues("survey")[0];
FileWriter resultsFile = new FileWriter(resultsDir
+ System.getProperty("file.separator")
+ surveyName + ".txt", true);
PrintWriter toFile = new PrintWriter(resultsFile);

// 從客戶端得到表單數據 & 存貯在這個文件中
toFile.println("");
Enumeration values = req.getParameterNames();
while(values.hasMoreElements()) {
String name = (String)values.nextElement();
String value = req.getParameterValues(name)[0];
if(name.compareTo("submit") != 0) {
toFile.println(name + ": " + value);
}
}
toFile.println("");

//關閉文件.
resultsFile.close();

// 用一個thank you返回客戶端
toClient.println("");
toClient.println("");
toClient.println("Thank you for participating");
toClient.println("");

} catch(IOException e) {
e.printStackTrace();
toClient.println(
"A problem occured while recording your answers. "
+ "Please try again.");
}

// 關閉writer; 響應完成.
toClient.close();
}

這個doPost方法是用getParameterNames和getParameterValues方法來從表單中獲取數據的. 因為它返回文本給客戶端, doPost 將調用 getWriter 方法. 在寫入響應主體部分之前,它設置了響應頭部字段的設置, 但響應完成後,關閉.

Servlet入門外2