?? 0012.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋體}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1 {background-color: rgb(245,245,245)}
-->
</style>
<title>網絡新時代,軟件教程:操作系統 主頁制作 服務器 設計軟件 網絡技術 編程語言 文字編輯</title>
</head>
<body>
<p align="center"><script src="../../1.js"></script> </p>
<p align="center"><big><strong>第四篇:Servlets編程[參考原作]</strong></big></p>
<p> Servlets 執行 javax.servlet.Servlet interface. 當servlet編寫者可以通過直接implement
interface開發servlet, 但這樣通常沒有必要. 因為大多數servlet是針對用HTTP協議的web服務器,
這樣最通用開發servlet辦法是用 javax.servlet.http.HttpServlet 內. </p>
<p> HttpServlet 類通過extend GenericServlet基類執行 Servlet interface,
提供了處理HTTP協議的功能. 他的service方法支持標準HTTP/1.1請求. </p>
<p> 一般地, 用HttpServlet指定的類編寫的servlets可以多線程地并發運行
service方法. </p>
<p><b>與客戶端的交互性</b> </p>
<p> Servlet編寫者注意HttpServlet類有幾個欠缺的方法,你可以自己定義方法中內容,但是必須使用這些方法名稱以使servlet知道你想做什么,
</p>
<p>doGet, 用于處理 GET、有條件的GET 和頭部 HEAD請求 </p>
<p>doPost, 用戶處理 POST 請求 </p>
<p>doPut, 用于處理 PUT 請求 </p>
<p>doDelete, 用于處理 DELETE請求 </p>
<p> HttpServlet的service方法, 一般地, 當它接收到一個OPTIONS請求時,會調用doOptions
方法, 當接收一個TRACE請求是調用doTrace . doOptions缺省執行方式是自動決定什么樣的HTTP被選擇并且返回哪個信息.
</p>
<p> 在你使用這些方法時,必須帶兩個闡述.
第一個包含來自客戶端的數據 HttpServletRequest.
第二個參數包含客戶端的響應HttpServletResponse. 在下例中是這樣的情況.
</p>
<p> 一個HttpServletRequest對象提供到達HTTP 頭部數據,
也允許你獲取客戶端的數據. 怎樣獲取這些數據取決于HTTP端請求方法.
</p>
<p> 不管任何HTTP方式, 你可以用 getParameterValues 方法,
這個用來返回特定名稱的參數值. 對于用 HTTP GET 請求的方式, 這個
getQueryString 方法將會返回一個可以用來解剖分析的. </p>
<p> 對于用HTTP POST, PUT, 和 DELETE請求的方式,
你有兩種方法可以選擇. 如果是文本數據,你能通過getReader方法用BufferedReader獲取
; 如果是二進制數據, 能通過getReader 方法用 ServletInputStream獲取. </p>
<p> 為了響應客戶端, 一個HttpServletResponse對象提供返回數據給用戶的兩個方法.
你可以用getWriter 方法返回,或者 getOutputStream 方法以輸出流返回.
你應該用getWriter返回文本數據,而用getOutputStream返回二進制數據. </p>
<p> 在使用Writer 或 OutputStream之前, HTTP 頭部應該先被設置.
HttpServletResponse內提供這樣一個方法,之后可以用writer 或 outputstream
將響應主體部分發回用戶. 完成后要關閉 writer 或 output stream以便讓服務器知道響應已經完畢.
</p>
<p><b>一個HTTP Servlet處理GET和HEAD方法的例子</b> <br>
public class SimpleServlet extends HttpServlet { <br>
public void doGet(HttpServletRequest req, HttpServletResponse res)<br>
throws ServletException, IOException<br>
{<br>
// 首先設置頭部<br>
res.setContentType("text/html");<br>
// 用 writer方法返回響應數據<br>
PrintWriter out = res.getWriter();<br>
out.println("<HEAD><TITLE> SimpleServlet
Output</TITLE></HEAD><BODY>");<br>
out.println("<h1> SimpleServlet Output </h1>");<br>
out.println("<P>This is output is from SimpleServlet.");<br>
out.println("</BODY>");<br>
out.close();<br>
}<br>
<br>
public String getServletInfo() {<br>
return "A simple servlet";<br>
}<br>
<br>
}<br>
這個例子完整地現實了一個servlet. </p>
<p><b>一個HTTP Servlet處理POST方式的例子</b> </p>
<p>這里是個用HTML帶POST表單的例子:<br>
<html><br>
<head><title>JdcSurvey</title></head><br>
<body><br>
<form action=http://demo:8080/servlet/survey method=POST><br>
<input type=hidden name=survey value=Survey01Results><br>
<br>
<BR><BR>How Many Employees in your Company?<BR><br>
<BR>1-100<input type=radio name=employee value=1-100><br>
<BR>100-200<input type=radio name=employee value=100-200><br>
<BR>200-300<input type=radio name=employee value=200-300><br>
<BR>300-400<input type=radio name=employee value=300-400><br>
<BR>500-more<input type=radio name=employee value=500-more><br>
<br>
<BR><BR>General Comments?<BR><br>
<BR><input type=text name=comment><br>
<br>
<BR><BR>What IDEs do you use?<BR><br>
<BR>JavaWorkShop<input type=checkbox name=ide value=JavaWorkShop><br>
<BR>J++<input type=checkbox name=ide value=J++><br>
<BR>Cafe'<input type=checkbox name=ide value=Cafe'><br>
<br>
<BR><BR><input type=submit><input type=reset><br>
</form><br>
</body><br>
</html><br>
<br>
</p>
<p>這里的servlet將表單數據寫入一個文件,并且用一個thank you信息響應用戶.
這里servlet的方法,如下例: <br>
<br>
public void doPost(HttpServletRequest req, HttpServletResponse res)<br>
throws ServletException, IOException<br>
{<br>
// 首先設置響應的 "content type" 頭部<br>
res.setContentType("text/html");<br>
<br>
//得到響應的 PrintWriter以返回文本給客戶端.<br>
PrintWriter toClient = res.getWriter();<br>
<br>
try {<br>
//打開一個文件寫入Survey的結果.<br>
String surveyName = req.getParameterValues("survey")[0];<br>
FileWriter resultsFile = new FileWriter(resultsDir<br>
+ System.getProperty("file.separator")<br>
+ surveyName + ".txt", true);<br>
PrintWriter toFile = new PrintWriter(resultsFile);<br>
<br>
// 從客戶端得到表單數據 & 存貯在這個文件中<br>
toFile.println("<BEGIN>");<br>
Enumeration values = req.getParameterNames();<br>
while(values.hasMoreElements()) {<br>
String name = (String)values.nextElement();<br>
String value = req.getParameterValues(name)[0];<br>
if(name.compareTo("submit") != 0) {<br>
toFile.println(name + ": " + value);<br>
}<br>
}<br>
toFile.println("<END>");<br>
<br>
//關閉文件.<br>
resultsFile.close();<br>
<br>
// 用一個thank you返回客戶端<br>
toClient.println("");<br>
toClient.println("");<br>
toClient.println("Thank you for participating");<br>
toClient.println("");<br>
<br>
} catch(IOException e) {<br>
e.printStackTrace();<br>
toClient.println(<br>
"A problem occured while recording your answers. "<br>
+ "Please try again.");<br>
}<br>
<br>
// 關閉writer; 響應完成.<br>
toClient.close();<br>
}<br>
</p>
<p> 這個doPost方法是用getParameterNames和getParameterValues方法來從表單中獲取數據的.
因為它返回文本給客戶端, doPost 將調用 getWriter 方法.
在寫入響應主體部分之前,它設置了響應頭部字段的設置,
但響應完成后,關閉. </p>
<p><br>
<br>
[未完待續] </p>
<p align="center"><script src="../../2.js"></script> </p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -