2.2 幾個實例在這一節(jié),我們將通過三個例子來幫助讀者更好地理解Servlet的開發(fā)與部署過程,以及Servlet中主要接口與類的使用。在講解實例時,我們將通過一步一步地操作來完成整個實例。 2.2.1 實例一:WelcomeServlet在本例中,我們將編寫一個帶表單的HTML頁面,表單中提供了一個文本輸入控件,讓用戶輸入他/她的姓名,然后提交給Servlet進行處理。在Servlet中,我們從提交的表單信息中取出用戶姓名,然后加上歡迎信息輸出到客戶端。歡迎信息作為Servlet的初始化參數(shù)在web.xml文件中配置。 實例的開發(fā)主要有下列步驟。 Step1:編寫welcome.html用記事本或者UltraEdit等文本編輯工具(讀者也可以使用專門的網(wǎng)頁編輯軟件)編寫welcome. html,將編寫好的welcome.html文件放到%CATALINA_HOME%\webapps\ch02目錄下。完整的代碼如例2-3所示。 例2-3 welcome.html <html> <head> <title>歡迎您!</title> </head> <body> <form action="welcome" method="get"> 請輸入用戶名:<input type="text" name="username"><br> <input type="submit" value="提交"> </form> </body> </html> 在HTML代碼中,我們先假定對此表單進行處理的Servlet是welcome,表單采用的提交方法是get。 Step2:編寫WelcomeServlet類為了簡化Servlet的編寫,Servlet API給我們提供了支持HTTP協(xié)議的javax.servlet.http.HttpServlet類,我們只需要從HttpServlet類派生一個子類,在子類中完成相應的功能就可以了。 編寫WelcomeServlet類,從HttpServlet類繼承,重寫doGet()方法。將編寫好的WelcomeServlet.java源文件放到%CATALINA_HOME%\ webapps\ch02\src目錄下。完整的源代碼如例2-4所示。 例2-4 WelcomeServlet.java 1. package org.sunxin.ch02.servlet; 2. 3. import java.io.IOException; 4. import java.io.PrintWriter; 5. 6. import javax.servlet.ServletException; 7. import javax.servlet.http.HttpServlet; 8. import javax.servlet.http.HttpServletRequest; 9. import javax.servlet.http.HttpServletResponse; 10. 11. public class WelcomeServlet extends HttpServlet 12. { 13. private String greeting; 14. 15. public void init() 16. { 17. greeting = getInitParameter("greeting"); 18. //greeting = getServletConfig().getInitParameter("greeting"); 19. } 20. 21. public void doGet(HttpServletRequest req, HttpServletResponse resp) 22. throws ServletException,IOException 23. { 24. req.setCharacterEncoding("gb2312"); 25. String username=req.getParameter("username"); 26. String welcomeInfo=greeting + ", " + user; 27. 28. resp.setContentType("text/html"); 29. 30. PrintWriter out=resp.getWriter(); 31. 32. out.println("<html><head><title>"); 33. out.println("Welcome Page"); 34. out.println("</title></head>"); 35. out.println("<body>"); 36. out.println(welcomeInfo); 37. out.println("</body></html>"); 38. out.close(); 39. } 40. } 例2-4代碼的第17行,我們調用getInitParameter()方法得到初始化參數(shù)greeting的值,這個調用和第18行注釋的代碼是等價的。從HttpServlet繼承的getInitParameter()方法實際上也是調用ServletConfig對象的getInitParameter()方法來得到初始化參數(shù)的。 由于用戶可能會輸入中文用戶名,因此我們在代碼的第24行設置請求正文使用的字符編碼是gb2312。 前面我們介紹過,HttpServletRequest對象封裝了客戶端的請求信息,要獲取請求中某個參數(shù)的值,可以調用HttpServletRequest對象的getParameter()方法,傳遞參數(shù)的名字。在代碼的第25行,我們調用req.getParameter("username")獲取到用戶輸入的用戶名。注意getParameter()方法的參數(shù)“username”和表單中用于輸入用戶姓名的文本輸入控件的名字“username”必須是一樣的。 第26行,我們用取出的用戶名構造一個歡迎字符串。第28行,設置響應內(nèi)容的MIME類型為text/html。第32~38行,都是在輸出HTML代碼,第36行,將歡迎信息放到<body>元素的開始標簽和結束標簽之間輸出。第35行,關閉out對象。 Step3:編譯WelcomeServlet.java打開命令提示符,進入%CATALINA_HOME%\webapps\ch02\src目錄,然后執(zhí)行: javac -d ..\WEB-INF\classes WelcomeServlet.java 在WEB-INF\classes\org\sunxin\ch02\servlet目錄中生成類文件WelcomeServlet.class。 Step4:部署WelcomeServlet類用記事本或UltraEdit打開%CATALINA_HOME%\webapps\ch02\WEB-INF目錄下的web.xml文件,添加對本例中的Servlet的配置,完整的內(nèi)容如例2-5所示。 例2-5 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-app_2_5.xsd">
<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.HelloWorldServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping>
<servlet> <servlet-name>WelcomeServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.WelcomeServlet </servlet-class> <init-param> <param-name>greeting</param-name> <param-value>Welcome you</param-value> </init-param> </servlet>
<servlet-mapping> <servlet-name>WelcomeServlet</servlet-name> <url-pattern>/welcome</url-pattern> </servlet-mapping> </web-app> 新增加的內(nèi)容以粗體顯示。我們在<servlet>元素內(nèi)部使用<init-param>子元素來為WelcomeServlet配置的初始化參數(shù),在例2-4的init()方法中,有這樣一句代碼: greeting = getInitParameter("greeting"); 這句代碼的作用就是獲取此處配置的greeting初始化參數(shù)的值。 注意,在Servlet 2.2和Servlet 2.3規(guī)范中,web.xml文件使用DTD來定義文檔的結構。在Servlet 2.2規(guī)范中,web.xml的文檔類型聲明如下: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java./j2ee/dtds/web-app_2_2.dtd"> 在Servlet 2.3規(guī)范中,web.xml的文檔類型聲明如下: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java./dtd/web-app_2_3.dtd"> 因為是用DTD來定義web.xml文檔的結構,所以元素出現(xiàn)的次序是有嚴格限制的,在這兩個版本中,<servlet>元素必須出現(xiàn)在<servlet-mapping>元素之前。而從Servlet 2.4規(guī)范開始,web.xml文件改為用XML Schema來定義文檔的結構,其中一個好處就是元素出現(xiàn)的次序不再有嚴格的限定。如果我們開發(fā)的Web應用程序需要運行在支持低版本的Servlet規(guī)范的Web服務器中運行,那么需要將web.xml文件修改為如例2-6所示。 例2-6 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-app_2_5.xsd">
<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.HelloWorldServlet </servlet-class> </servlet> <servlet> <servlet-name>WelcomeServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.WelcomeServlet </servlet-class> <init-param> <param-name>greeting</param-name> <param-value>Welcome you</param-value> </init-param> </servlet>
<servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>WelcomeServlet</servlet-name> <url-pattern>/welcome</url-pattern> </servlet-mapping>
</web-app> 注意文件中元素出現(xiàn)的順序。 Step5:訪問WelcomeServlet啟動Tomcat服務器,打開IE瀏覽器,在地址欄中輸入: http://localhost:8080/ch02/welcome.html 出現(xiàn)頁面后,在文本輸入控件中輸入用戶姓名,如圖2-8所示。 單擊“提交”按鈕,你將看到如圖2-9所示的頁面。
圖2-8 welcome.html頁面 圖2-9 以GET方式提交后WelcomeServlet輸出的響應信息 注意IE瀏覽器的地址欄部分,因為welcome.html頁面采用的表單提交方法是get,所以提交的數(shù)據(jù)被附加到請求URL的末端,作為查詢字符串發(fā)送到服務器端。采用get方法提交表單,和我們直接在瀏覽器的地址欄中輸入附加了查詢字符串的URL的效果是一樣的。在本例中,我們也可以通過直接輸入如下形式的URL來提交數(shù)據(jù): http://localhost:8080/ch02/welcome?username=zhangsan Step6:將提交方法改為post將例2-3的welcome.html中的表單提交方法改為post,如下: <form action="welcome" method="post"> 保存后,打開瀏覽器,在地址欄中輸入http://localhost:8080/ch02/welcome.html,輸入用戶名后,單擊“提交”按鈕,你將看到如圖2-10所示的頁面。 圖2-10 WelcomeServlet無法處理post請求,返回HTTP 405錯誤信息 這是因為我們在WelcomeServlet類中沒有重寫doPost()方法,而HttpServlet類的doPost()方法的默認實現(xiàn)是返回狀態(tài)代碼為405的HTTP錯誤,表示對于指定資源的請求方法不被允許。如果要對post請求做出響應,需要在WelcomeServlet這個類中覆蓋基類的doPost()方法。我們修改例2-4的WelcomeServlet.java,如例2-7所示。 例2-7 修改后的WelcomeServlet.java package org.sunxin.ch02.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class WelcomeServlet extends HttpServlet { private String greeting;
public void init() { greeting = getInitParameter("greeting"); //greeting = getServletConfig().getInitParameter("greeting"); }
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { req.setCharacterEncoding("gb2312"); String username=req.getParameter("username"); String welcomeInfo=greeting + ", " + username;
resp.setContentType("text/html");
PrintWriter out=resp.getWriter();
out.println("<html><head><title>"); out.println("Welcome Page"); out.println("</title></head>"); out.println("<body>"); out.println(welcomeInfo); out.println("</body></html>"); out.close(); }
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { doGet(req,resp); } } 在doPost()方法中,直接調用了doGet()方法對post請求進行處理,這樣,不管是get請求還是post請求,處理結果都是一樣的。 按照Step3所示的方式編譯WelcomeServlet.java。重啟Tomcat服務器,在瀏覽器的地址欄中輸入http://localhost:8080/ch02/welcome. html,輸入用戶名后,單擊“提交”按鈕,你將看到如圖2-11所示的頁面。 圖2-11 post方式提交后WelcomeServlet輸出的響應信息 注意IE瀏覽器的地址欄部分,因為現(xiàn)在welcome.html頁面采用的表單提交方法是post,提交的數(shù)據(jù)作為請求正文的內(nèi)容發(fā)送到服務器端,所以在URL中就看不到附加的請求數(shù)據(jù)了。通常在提交表單時,如果數(shù)據(jù)量較小,而又沒有安全性的考慮(例如,提交的數(shù)據(jù)中沒有密碼等敏感信息),可以采用get方法提交表單。如果數(shù)據(jù)量較大,或者有安全方面的考慮,則應該采用post方法提交表單。 一旦你修改過Servlet類,要記著重新啟動Tomcat,否則,對請求進行響應的仍然是已經(jīng)駐留在內(nèi)存中的先前的Servlet實例。如果要讓運行中的Tomcat服務器自動加載修改過Servlet類,可以參看第3.1節(jié)。 2.2.2 實例二:OutputInfoServlet在本例中,我們將編寫一個Servlet,用于獲取請求中的消息報頭,并將這些報頭的名稱和值輸出到客戶端。此外,我們還利用ServletRequest接口中定義的方法獲取客戶端和服務器端的IP地址及端口號,并將這些信息輸出到客戶端。在這個Servlet中,我們還設置了響應的實體報頭。實例的開發(fā)主要有下列步驟。 Step1:編寫OutputInfoServlet類將編寫好的OutputInfoServlet.java源文件放到%CATALINA_HOME%\webapps\ ch02\src目錄下。完整的源代碼如例2-8所示。 例2-8 OutputInfoServlet.java 1. package org.sunxin.ch02.servlet; 2. 3. import java.io.IOException; 4. import java.io.PrintWriter; 5. import java.util.Enumeration; 6. 7. import javax.servlet.ServletException; 8. import javax.servlet.http.HttpServlet; 9. import javax.servlet.http.HttpServletRequest; 10. import javax.servlet.http.HttpServletResponse; 11. 12. public class OutputInfoServlet extends HttpServlet 13. { 14. public void doGet(HttpServletRequest req, HttpServletResponse resp) 15. throws ServletException,IOException 16. { 17. 18. resp.setContentType("text/html;charset=gb2312"); 19. 20. PrintWriter out=resp.getWriter(); 21. 22. Enumeration headNames=req.getHeaderNames(); 23. 24. out.println("<html><head>"); 25. out.println("<title>Info Page</title>"); 26. out.println("</head>"); 27. out.println("<body><center>"); 28. 29. out.println("<table border=1 align=center>"); 30. out.println("<caption>Servlet接收到的HTTP消息報頭的信息</caption>"); 31. out.println("<tr bgcolor=#999999>"); 32. out.println("<th>消息報頭的名字</th>"); 33. out.println("<th>消息報頭的值</th>"); 34. out.println("</tr>"); 35. 36. while(headNames.hasMoreElements()) 37. { 38. String name=(String)headNames.nextElement(); 39. String value=req.getHeader(name); 40. out.println("<tr>"); 41. out.println("<td>"+name+"</td>"); 42. out.println("<td>"+value+"</td>"); 43. out.println("</tr>"); 44. } 45. 46. out.println("</table><p>"); 47. 48. out.println("<table border=1 align=center>"); 49. out.println("<caption>其他訪問信息</caption>"); 50. 51. out.println("<tr>"); 52. out.println("<td>客戶端的IP地址</td>"); 53. out.println("<td>"+req.getRemoteAddr()+"</td>"); 54. out.println("</tr>"); 55. 56. out.println("<tr>"); 57. out.println("<td>客戶端的端口號</td>"); 58. out.println("<td>"+req.getRemotePort()+"</td>"); 59. out.println("</tr>"); 60. 61. out.println("<tr>"); 62. out.println("<td>服務器端的IP地址</td>"); 63. out.println("<td>"+req.getLocalAddr()+"</td>"); 64. out.println("</tr>"); 65. 66. out.println("<tr>"); 67. out.println("<td>服務器端的端口號</td>"); 68. out.println("<td>"+req.getLocalPort()+"</td>"); 69. out.println("</tr>"); 70. 71. out.println("</table>"); 72. 73. out.println("</center></body></html>"); 74. out.close(); 75. } 76. } 在程序代碼的第18行,設置響應內(nèi)容的MIME類型為text/html,因為響應內(nèi)容中包含了中文,所以設置字符編碼方式為gb2312。要注意的是,這一句代碼必須放在第20行代碼的前面,否則將無法設置響應的字符編碼,out對象將使用默認的字符編碼ISO-8859-1。此外,還要注意的是在text/html和“;”之間不能有空格,即不能寫成text/html ;charset=gb2312,否則瀏覽器將不能正確識別響應的內(nèi)容類型。第22行,通過請求對象的getHeaderNames()方法調用,得到請求中包含的所有消息報頭的名字的枚舉集合。第29~34行,輸出一個表格,設置表格的標題和表頭。第36~44行,循環(huán)取出枚舉集合中消息報頭的名字,然后利用報頭的名字調用請求對象的getHeader()方法得到對應的值,將報頭的名字和值分別放到表格的單元格中。第48~71行,輸出另一個表格,表格的內(nèi)容是客戶端和服務器端的IP地址和端口號。第53行,調用請求對象的getRemoteAddr()方法得到發(fā)送請求的客戶端的IP地址。第58行,調用請求對象的getRemotePort()方法得到發(fā)送請求的客戶端的端口號,這個方法是在Servlet 2.4規(guī)范中新增的方法。第63行,調用getLocalAddr()方法得到接收到請求的服務器端的IP地址,這個方法是在Servlet 2.4規(guī)范中新增的方法。第68行,調用請求對象的getLocalPort()方法得到接收到請求的服務器端的端口號,這個方法是在Servlet 2.4規(guī)范中新增的方法。 Step2:編譯OutputInfoServlet.java打開命令提示符,進入%CATALINA_HOME%\webapps\ch02\src目錄,然后執(zhí)行: javac -d ..\WEB-INF\classes OutputInfoServlet.java 在WEB-INF\classes\org\sunxin\ch02\servlet目錄中生成類文件OutputInfoServlet.class。 Step3:部署OutputInfoServlet編輯WEB-INF目錄下的web.xml文件,添加對本例中的Servlet的配置,完整的內(nèi)容如例2-9所示。 例2-9 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-app_2_5.xsd">
<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.HelloWorldServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping>
<servlet> <servlet-name>WelcomeServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.WelcomeServlet </servlet-class> <init-param> <param-name>greeting</param-name> <param-value>Welcome you</param-value> </init-param> </servlet>
<servlet-mapping> <servlet-name>WelcomeServlet</servlet-name> <url-pattern>/welcome</url-pattern> </servlet-mapping>
<servlet> <servlet-name>OutputInfoServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.OutputInfoServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>OutputInfoServlet</servlet-name> <url-pattern>/info</url-pattern> </servlet-mapping> </web-app> 新增加的內(nèi)容以粗體顯示。 Step4:訪問OutputInfoServlet啟動Tomcat服務器,打開IE瀏覽器,在地址欄中輸入http://localhost:8080/ch02/info,你將看到如圖2-12所示的頁面。 圖2-12 使用IE訪問OutputInfoServlet Step5:查看在響應中設置的實體報頭在本例(例2-8)的代碼中,第18行我們調用: resp.setContentType("text/html;charset=gb2312"); 將會設置HTTP響應的Content-Type實體報頭。這個實體報頭的信息是給客戶端軟件(通常是瀏覽器)看的,在頁面中并不會體現(xiàn)出來。為了查看這句代碼調用是否正確設置了Content-Type實體報頭,我們可以利用telnet工具去訪問本例中的OutputInfoServlet。 首先確保Tomcat服務器正常啟動了。打開命令提示符,輸入telnet localhost 8080,回車后,輸入: GET /ch02/info HTTP/1.1 Host: localhost 注意書寫與空格。然后連續(xù)兩個回車,你將看到如圖2-13所示的畫面。 圖2-13 使用telnet工具查看Content-Type實體報頭的設置信息 注意圖2-13中圓角矩形框中的內(nèi)容,說明代碼中對setContentType()方法的調用確實設置了Content-Type實體報頭。 2.2.3 實例三:LoginServlet在本例中,我們將編寫一個登錄頁面,用戶輸入用戶名和密碼后,將表單提交給LoginServlet進行處理。在LoginServlet中,判斷用戶名和密碼是否正確,如果正確,利用重定向向用戶返回成功登錄頁面;如果失敗,則向用戶返回一個HTTP錯誤消息。實例的開發(fā)主要有下列步驟。 Step1:編寫login.htmllogin.html用于向用戶顯示登錄表單。在%CATALINA_HOME%\webapps\ch02目錄下新建login.html,內(nèi)容如例2-10所示。 例2-10 login.html <html> <head> <title>登錄頁面</title> </head> <body> <form action="login" method="post"> <table> <tr> <td>請輸入用戶名:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>請輸入密碼:</td> <td><input type="password" name="password"></td> </tr> <tr> <td><input type="reset" value="重填"></td> <td><input type="submit" value="登錄"></td> </tr> </table> </form> </body> </html> 在HTML代碼中,我們先假定對此表單進行處理的Servlet是login,因為提交的數(shù)據(jù)中包含了用戶的密碼,所以表單的提交方法我們采用post。 Step2:編寫success.htmlsuccess.html用于向用戶顯示歡迎信息。在%CATALINA_HOME%\webapps\ch02目錄下新建success.html,內(nèi)容如例2-11所示。 例2-11 success.html <html> <head> <title>登錄成功</title> </head> <body> 登錄成功,歡迎進入孫鑫的個人網(wǎng)站(www.sunxin.org)! </body> </html> Step3:編寫LoginServlet類在%CATALINA_HOME%\webapps\ch02\src目錄下新建LoginServlet.java,代碼如例2-12所示。 例2-12 LoginServlet.java 1. package org.sunxin.ch02.servlet; 2. 3. import java.io.IOException; 4. 5. import javax.servlet.ServletException; 6. import javax.servlet.http.HttpServlet; 7. import javax.servlet.http.HttpServletRequest; 8. import javax.servlet.http.HttpServletResponse; 9. 10. public class LoginServlet extends HttpServlet 11. { 12. public void doGet(HttpServletRequest req, HttpServletResponse resp) 13. throws ServletException,IOException 14. { 15. 16. resp.setContentType("text/html;charset=gb2312"); 17. 18. String name=req.getParameter("username"); 19. String pwd=req.getParameter("password"); 20. 21. if(name!=null && pwd!=null && name.equals("zhangsan") && 22. pwd.equals("1234")) 23. { 24. resp.sendRedirect("success.html"); 25. } 26. else 27. { 28. resp.sendError(HttpServletResponse.SC_SERVICE_ UNAVAILABLE,"服務器忙,請稍后再登錄!"); 29. } 30. 31. } 32. 33. public void doPost(HttpServletRequest req,HttpServletResponse resp) 34. throws ServletException,IOException 35. { 36. doGet(req,resp); 37. } 38. } 在代碼的第18~19行,調用請求對象的getParameter()方法得到用戶名和密碼。第21行首先判斷name和pwd是否為空,這是為了避免出現(xiàn)空指針異常,如果用戶直接在瀏覽器的地址欄中輸入URL訪問這個Servlet而沒有附加username和password查詢字符串,name和pwd將為null;接下來判斷名字是否是zhangsan,密碼是否是1234。第24行,判斷為真,調用響應對象的sendRedirect()方法將用戶請求重定向到success.html頁面。第28行,判斷為假,調用響應對象的sendError()方法發(fā)送HTTP錯誤代碼503(在HttpServletResponse接口中定義為靜態(tài)常量SC_SERVICE_UNAVAILABLE),告訴用戶“服務器忙,請稍后再登錄”。 Step4:編譯LoginServlet.java打開命令提示符,進入%CATALINA_HOME%\webapps\ch02\src目錄,然后執(zhí)行: javac -d ..\WEB-INF\classes LoginServlet.java 在WEB-INF\classes\org\sunxin\ch02\servlet目錄中生成類文件LoginServlet.class。 Step5:部署LoginServlet編輯WEB-INF目錄下的web.xml文件,添加對本例中的Servlet的配置,完整的內(nèi)容如例2-13所示。 例2-13 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java./xml/ns/javaee" xmlns:xsi="http://www./2001/XMLSchema-instance" xsi:schemaLocation="http://java./xml/ns/javaee http://java./xml/ns/javaee/web-app_2_5.xsd">
<servlet> <servlet-name>HelloWorldServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.HelloWorldServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorldServlet</servlet-name> <url-pattern>/helloworld</url-pattern> </servlet-mapping>
<servlet> <servlet-name>WelcomeServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.WelcomeServlet </servlet-class> <init-param> <param-name>greeting</param-name> <param-value>Welcome you</param-value> </init-param> </servlet>
<servlet-mapping> <servlet-name>WelcomeServlet</servlet-name> <url-pattern>/welcome</url-pattern> </servlet-mapping>
<servlet> <servlet-name>OutputInfoServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.OutputInfoServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>OutputInfoServlet</servlet-name> <url-pattern>/info</url-pattern> </servlet-mapping>
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class> org.sunxin.ch02.servlet.LoginServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> </web-app> 新增加的內(nèi)容以粗體顯示。 Step6:訪問LoginServlet啟動Tomcat服務器,打開IE瀏覽器,在地址欄中輸入http://localhost:8080/ ch02/login.html,出現(xiàn)頁面后,在文本輸入控件中輸入zhangsan,在口令輸入控件中輸入1234,單擊“提交”按鈕,將看到如圖2-14所示的頁面。 注意圖2-14瀏覽器地址欄中的URL。 圖2-14 登錄成功頁面 回到http://localhost:8080/ch02/login.html頁面,重新輸入其他的用戶名或密碼,單擊“提交”按鈕,將看到如圖2-15所示的頁面。 圖2-15 用戶名或密碼錯誤,LoginServlet輸出HTTP 503錯誤消息 注意圖2-15中圓角矩形框中的內(nèi)容,向用戶顯示的這些錯誤消息是我們在響應對象的sendError()方法中指定的。 請讀者注意,在本例中,用戶輸入了錯誤的用戶名或密碼,LoginServlet向用戶發(fā)送HTTP 503錯誤,這只是為了演示sendError()方法的使用,在實際開發(fā)過程中,應該給用戶一個更友好的提示“用戶名或密碼錯誤,請重新輸入”,或者“拒絕此用戶登錄”。 |
|