官术网_书友最值得收藏!

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()方法的使用,在實際開發過程中,應該給用戶一個更友好的提示“用戶名或密碼錯誤,請重新輸入”,或者“拒絕此用戶登錄”。

主站蜘蛛池模板: 双鸭山市| 周至县| 唐山市| 忻城县| 策勒县| 清流县| 岐山县| 六安市| 天全县| 太白县| 彭山县| 东方市| 兴仁县| 宣城市| 天柱县| 聂荣县| 延庆县| 景谷| 新乐市| 垣曲县| 喀什市| 马公市| 边坝县| 肇庆市| 外汇| 曲麻莱县| 余姚市| 临西县| 岫岩| 都兰县| 禹州市| 峨边| 遂川县| 甘谷县| 沙田区| 廊坊市| 金平| 南溪县| 萝北县| 遂宁市| 曲沃县|