- Servlet/JSP深入詳解
- 孫鑫
- 4573字
- 2019-01-01 14:48:29
2.2 幾個實例
在這一節,我們將通過三個例子來幫助讀者更好地理解Servlet的開發與部署過程,以及Servlet中主要接口與類的使用。在講解實例時,我們將通過一步一步地操作來完成整個實例。
2.2.1 實例一:WelcomeServlet
在本例中,我們將編寫一個帶表單的HTML頁面,表單中提供了一個文本輸入控件,讓用戶輸入他/她的姓名,然后提交給Servlet進行處理。在Servlet中,我們從提交的表單信息中取出用戶姓名,然后加上歡迎信息輸出到客戶端。歡迎信息作為Servlet的初始化參數在web.xml文件中配置。
實例的開發主要有下列步驟。
開發步驟
Step1:編寫welcome.html
用記事本或者UltraEdit等文本編輯工具(讀者也可以使用專門的網頁編輯軟件)編寫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協議的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()方法得到初始化參數greeting的值,這個調用和第18行注釋的代碼是等價的。從HttpServlet繼承的getInitParameter()方法實際上也是調用ServletConfig對象的getInitParameter()方法來得到初始化參數的。
由于用戶可能會輸入中文用戶名,因此我們在代碼的第24行設置請求正文使用的字符編碼是gb2312。
前面我們介紹過,HttpServletRequest對象封裝了客戶端的請求信息,要獲取請求中某個參數的值,可以調用HttpServletRequest對象的getParameter()方法,傳遞參數的名字。在代碼的第25行,我們調用req.getParameter("username")獲取到用戶輸入的用戶名。注意getParameter()方法的參數“username”和表單中用于輸入用戶姓名的文本輸入控件的名字“username”必須是一樣的。
第26行,我們用取出的用戶名構造一個歡迎字符串。第28行,設置響應內容的MIME類型為text/html。第32~38行,都是在輸出HTML代碼,第36行,將歡迎信息放到<body>元素的開始標簽和結束標簽之間輸出。第35行,關閉out對象。
Step3:編譯WelcomeServlet.java
打開命令提示符,進入%CATALINA_HOME%\webapps\ch02\src目錄,然后執行:
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的配置,完整的內容如例2-5所示。
例2-5 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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>
新增加的內容以粗體顯示。我們在<servlet>元素內部使用<init-param>子元素來為WelcomeServlet配置的初始化參數,在例2-4的init()方法中,有這樣一句代碼:
greeting = getInitParameter("greeting");
這句代碼的作用就是獲取此處配置的greeting初始化參數的值。
注意,在Servlet 2.2和Servlet 2.3規范中,web.xml文件使用DTD來定義文檔的結構。在Servlet 2.2規范中,web.xml的文檔類型聲明如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
在Servlet 2.3規范中,web.xml的文檔類型聲明如下:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
因為是用DTD來定義web.xml文檔的結構,所以元素出現的次序是有嚴格限制的,在這兩個版本中,<servlet>元素必須出現在<servlet-mapping>元素之前。而從Servlet 2.4規范開始,web.xml文件改為用XML Schema來定義文檔的結構,其中一個好處就是元素出現的次序不再有嚴格的限定。如果我們開發的Web應用程序需要運行在支持低版本的Servlet規范的Web服務器中運行,那么需要將web.xml文件修改為如例2-6所示。
例2-6 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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>
注意文件中元素出現的順序。
Step5:訪問WelcomeServlet
啟動Tomcat服務器,打開IE瀏覽器,在地址欄中輸入:
http://localhost:8080/ch02/welcome.html
出現頁面后,在文本輸入控件中輸入用戶姓名,如圖2-8所示。

圖2-8 welcome.html頁面
單擊“提交”按鈕,你將看到如圖2-9所示的頁面。

圖2-9 以GET方式提交后WelcomeServlet輸出的響應信息
注意IE瀏覽器的地址欄部分,因為welcome.html頁面采用的表單提交方法是get,所以提交的數據被附加到請求URL的末端,作為查詢字符串發送到服務器端。采用get方法提交表單,和我們直接在瀏覽器的地址欄中輸入附加了查詢字符串的URL的效果是一樣的。在本例中,我們也可以通過直接輸入如下形式的URL來提交數據:
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()方法的默認實現是返回狀態代碼為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瀏覽器的地址欄部分,因為現在welcome.html頁面采用的表單提交方法是post,提交的數據作為請求正文的內容發送到服務器端,所以在URL中就看不到附加的請求數據了。通常在提交表單時,如果數據量較小,而又沒有安全性的考慮(例如,提交的數據中沒有密碼等敏感信息),可以采用get方法提交表單。如果數據量較大,或者有安全方面的考慮,則應該采用post方法提交表單。
一旦你修改過Servlet類,要記著重新啟動Tomcat,否則,對請求進行響應的仍然是已經駐留在內存中的先前的Servlet實例。如果要讓運行中的Tomcat服務器自動加載修改過Servlet類,可以參看第3.1節。
2.2.2 實例二:OutputInfoServlet
在本例中,我們將編寫一個Servlet,用于獲取請求中的消息報頭,并將這些報頭的名稱和值輸出到客戶端。此外,我們還利用ServletRequest接口中定義的方法獲取客戶端和服務器端的IP地址及端口號,并將這些信息輸出到客戶端。在這個Servlet中,我們還設置了響應的實體報頭。實例的開發主要有下列步驟。
開發步驟
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行,設置響應內容的MIME類型為text/html,因為響應內容中包含了中文,所以設置字符編碼方式為gb2312。要注意的是,這一句代碼必須放在第20行代碼的前面,否則將無法設置響應的字符編碼,out對象將使用默認的字符編碼ISO-8859-1。此外,還要注意的是在text/html和“;”之間不能有空格,即不能寫成text/html ;charset=gb2312,否則瀏覽器將不能正確識別響應的內容類型。第22行,通過請求對象的getHeaderNames()方法調用,得到請求中包含的所有消息報頭的名字的枚舉集合。第29~34行,輸出一個表格,設置表格的標題和表頭。第36~44行,循環取出枚舉集合中消息報頭的名字,然后利用報頭的名字調用請求對象的getHeader()方法得到對應的值,將報頭的名字和值分別放到表格的單元格中。第48~71行,輸出另一個表格,表格的內容是客戶端和服務器端的IP地址和端口號。第53行,調用請求對象的getRemoteAddr()方法得到發送請求的客戶端的IP地址。第58行,調用請求對象的getRemotePort()方法得到發送請求的客戶端的端口號,這個方法是在Servlet 2.4規范中新增的方法。第63行,調用getLocalAddr()方法得到接收到請求的服務器端的IP地址,這個方法是在Servlet 2.4規范中新增的方法。第68行,調用請求對象的getLocalPort()方法得到接收到請求的服務器端的端口號,這個方法是在Servlet 2.4規范中新增的方法。
Step2:編譯OutputInfoServlet.java
打開命令提示符,進入%CATALINA_HOME%\webapps\ch02\src目錄,然后執行:
javac -d ..\WEB-INF\classes OutputInfoServlet.java
在WEB-INF\classes\org\sunxin\ch02\servlet目錄中生成類文件OutputInfoServlet.class。
Step3:部署OutputInfoServlet
編輯WEB-INF目錄下的web.xml文件,添加對本例中的Servlet的配置,完整的內容如例2-9所示。
例2-9 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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>
新增加的內容以粗體顯示。
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實體報頭。這個實體報頭的信息是給客戶端軟件(通常是瀏覽器)看的,在頁面中并不會體現出來。為了查看這句代碼調用是否正確設置了Content-Type實體報頭,我們可以利用telnet工具去訪問本例中的OutputInfoServlet。
首先確保Tomcat服務器正常啟動了。打開命令提示符,輸入telnet localhost 8080,回車后,輸入:
GET /ch02/info HTTP/1.1 Host: localhost
注意書寫與空格。然后連續兩個回車,你將看到如圖2-13所示的畫面。

圖2-13 使用telnet工具查看Content-Type實體報頭的設置信息
注意圖2-13中圓角矩形框中的內容,說明代碼中對setContentType()方法的調用確實設置了Content-Type實體報頭。
2.2.3 實例三:LoginServlet
在本例中,我們將編寫一個登錄頁面,用戶輸入用戶名和密碼后,將表單提交給LoginServlet進行處理。在LoginServlet中,判斷用戶名和密碼是否正確,如果正確,利用重定向向用戶返回成功登錄頁面;如果失敗,則向用戶返回一個HTTP錯誤消息。實例的開發主要有下列步驟。
開發步驟
Step1:編寫login.html
login.html用于向用戶顯示登錄表單。在%CATALINA_HOME%\webapps\ch02目錄下新建login.html,內容如例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,因為提交的數據中包含了用戶的密碼,所以表單的提交方法我們采用post。
Step2:編寫success.html
success.html用于向用戶顯示歡迎信息。在%CATALINA_HOME%\webapps\ch02目錄下新建success.html,內容如例2-11所示。
例2-11 success.html
<html> <head> <title>登錄成功</title> </head> <body> 登錄成功,歡迎進入孫鑫的個人網站(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是否為空,這是為了避免出現空指針異常,如果用戶直接在瀏覽器的地址欄中輸入URL訪問這個Servlet而沒有附加username和password查詢字符串,name和pwd將為null;接下來判斷名字是否是zhangsan,密碼是否是1234。第24行,判斷為真,調用響應對象的sendRedirect()方法將用戶請求重定向到success.html頁面。第28行,判斷為假,調用響應對象的sendError()方法發送HTTP錯誤代碼503(在HttpServletResponse接口中定義為靜態常量SC_SERVICE_UNAVAILABLE),告訴用戶“服務器忙,請稍后再登錄”。
Step4:編譯LoginServlet.java
打開命令提示符,進入%CATALINA_HOME%\webapps\ch02\src目錄,然后執行:
javac -d ..\WEB-INF\classes LoginServlet.java
在WEB-INF\classes\org\sunxin\ch02\servlet目錄中生成類文件LoginServlet.class。
Step5:部署LoginServlet
編輯WEB-INF目錄下的web.xml文件,添加對本例中的Servlet的配置,完整的內容如例2-13所示。
例2-13 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/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>
新增加的內容以粗體顯示。
Step6:訪問LoginServlet
啟動Tomcat服務器,打開IE瀏覽器,在地址欄中輸入http://localhost:8080/ch02/login.html,出現頁面后,在文本輸入控件中輸入zhangsan,在口令輸入控件中輸入1234,單擊“提交”按鈕,將看到如圖2-14所示的頁面。

圖2-14 登錄成功頁面
注意圖2-14瀏覽器地址欄中的URL。
回到http://localhost:8080/ch02/login.html頁面,重新輸入其他的用戶名或密碼,單擊“提交”按鈕,將看到如圖2-15所示的頁面。

圖2-15 用戶名或密碼錯誤,LoginServlet輸出HTTP 503錯誤消息
注意圖2-15中圓角矩形框中的內容,向用戶顯示的這些錯誤消息是我們在響應對象的sendError()方法中指定的。
請讀者注意,在本例中,用戶輸入了錯誤的用戶名或密碼,LoginServlet向用戶發送HTTP 503錯誤,這只是為了演示sendError()方法的使用,在實際開發過程中,應該給用戶一個更友好的提示“用戶名或密碼錯誤,請重新輸入”,或者“拒絕此用戶登錄”。
- 企業級Java EE架構設計精深實踐
- 游戲程序設計教程
- 微信小程序入門指南
- Mastering Unity 2D Game Development(Second Edition)
- Python Data Structures and Algorithms
- Programming with CodeIgniterMVC
- Hands-On GUI Programming with C++ and Qt5
- C++語言程序設計
- JBoss:Developer's Guide
- Angular應用程序開發指南
- Practical Microservices
- 深度學習程序設計實戰
- HTML5移動前端開發基礎與實戰(微課版)
- Raspberry Pi Blueprints
- Wearable:Tech Projects with the Raspberry Pi Zero