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

1.1 MVC思想概述

下面通過一個登錄案例概述一下MVC思想。

1.1.1 簡單的登錄案例

在學習框架之前必須很好地掌握Java Web的基礎知識(如JSP、Servlet、JDBC),這樣學習框架才不會吃力,才會覺得順手。

下面來使用JSP編寫一個簡單的登錄項目,判斷用戶是否合法,如果合法就顯示登錄成功,否則就顯示登錄失敗。暫時不需要使用數據庫,這里使用固定的用戶名和密碼。

步驟如下。

(1)首先新建Web項目,其實就是一個普通的文件夾,不過在這個文件夾中包含一個名為“WEBINF”的文件夾,并且在它之下有一個“web.xml”的文件?!皐eb.xml”代碼如下。

          <? xml version="1.0" encoding="UTF-8"? >
          <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="
          http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="
          http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
            <welcome-file-list>
              <welcome-file>index.jsp</welcome-file>
            </welcome-file-list>
          </web-app>

(2)分析該項目。項目中包含一個用戶登錄頁、一個用來接收用戶請求信息并判斷用戶信息合法語法的登錄判斷頁、一個登錄成功顯示頁、一個登錄失敗顯示頁。

用戶登錄頁包含一個簡單的表單,表單中包含兩個文本域,分別用來接收用戶輸入的用戶名和密碼,還包括兩個按鈕,分別用來提交表單和重置表單。登錄頁“l(fā)ogin.jsp”代碼如下。

        <%@page contentType="text/html; charset=gb2312"%>
        <html>
        <head>
            <title>用戶登錄</title>
        </head>
        <body>
        <center>
            <h2>用戶登錄</h2>
            <%--登錄表單--%>
            <form action="login_conf.jsp" method="post">
            <table>
                  <tr>
                        <td>用戶名:</td>
                        <%--接收用戶輸入的用戶名,其name屬性為uname--%>
                        <td><input type="text" name="uname"></td>
                  </tr>
                  <tr>
                        <%--接收用戶輸入的密碼,其name屬性為upassword--%>
                        <td>&nbsp; &nbsp;碼:</td>
                        <td><input type="password" name="upassword"></td>
                  </tr>
                  <tr>
                        <td colspan="2">
                        <%--登錄按鈕和重置按鈕--%>
                        <input type="submit" value="登錄">
                        <input type="reset" value="重置">
                        </td>
                  </tr>
            </table>
            </form>
        </center>
        </body>
        </html>

(3)登錄判斷頁首先接受用戶登錄頁傳遞的用戶信息,并對用戶信息進行判斷。如果合法則跳轉到用戶登錄成功頁,如果非法則跳轉到用戶登錄失敗頁。登錄判斷頁“l(fā)ogin_conf.jsp”代碼如下。

        <%@page contentType="text/html; charset=gb2312"%>
        <html>
        <head>
            <title>登錄判斷</title>
        </head>
        <body>
            <%
              // 接收請求的內容
              String name = request.getParameter("uname") ;
              String password = request.getParameter("upassword") ;
        %>
        <%
              // 判斷用戶名及密碼
              if("xiaoqiang".equals(name)&&"xiaoqiang".equals(password)){
                      // 合法用戶
        %>
                      <jsp:forward page="login_success.jsp"/>
        <%
              } else {
                      // 非法用戶
        %>
                      <jsp:forward page="login_failure.jsp"/>
        <%
              }
        %>
  </body>
  </html>

(4)登錄成功頁和登錄失敗頁代碼只是簡單地顯示信息,用來提示是否登錄成功。其中登錄成功頁“l(fā)ogin_success.jsp”代碼如下。

        <%@page contentType="text/html; charset=gb2312"%>
        <html>
        <head>
            <title>登錄成功</title>
        </head>
        <body>
        <center>
            <h2>登錄成功</h2>
        </center>
        </body>
        </html>

登錄失敗頁“l(fā)ogin_failure.jsp”代碼如下。

        <%@page contentType="text/html; charset=gb2312"%>
        <html>
        <head>
            <title>登錄失敗</title>
        </head>
        <body>
        <center>
            <h2>登錄失敗</h2>
        </center>
        </body>
        </html>

(5)部署該項目。打開Tomcat安裝目錄下的conf文件夾,打開其中的“server.xml”文件。在文件的最下面的“</host>”標簽之前添加如下代碼。

        <Context path="/01"docBase="E:\BookDemo\ch01\01"reloadable="true"crossContext="true">
        </Context>

其中docBase屬性用來指定項目所在目錄,path屬性用來指定虛擬路徑,也就是通過瀏覽器訪問時的路徑地址。

1.1.2 測試案例

下面一起運行這個程序,看是否實現了項目的要求。

步驟如下。

(1)運行Tomcat服務器,啟動Tomcat服務(如果Tomcat為安裝版本),或者打開Tomcat的安裝目錄下的bin目錄,找到“startup.bat”,雙擊運行該批處理來運行Tomcat服務器。

(2)打開瀏覽器,訪問登錄頁地址“http://localhost:8080/01/login.jsp”,頁面顯示效果如圖1.1所示。

(3)在表單中填寫用戶信息,這里是隨意填寫的一個用戶信息。單擊“登錄”按鈕進行提交。頁面提交到登錄判斷頁。

因為用戶信息是隨意填寫的,所以登錄判斷頁判斷該用戶為非法用戶。登錄判斷頁會執(zhí)行下面這段代碼。

        <jsp:forward page="login_failure.jsp"/>

因此將執(zhí)行服務器端跳轉到登錄失敗頁(如圖1.2所示)。

(4)輸入正確的用戶信息,單擊“登錄”按鈕進行提交。頁面提交到登錄判斷頁,頁面顯示效果如圖1.3所示。

圖1.1 用戶登錄頁

圖1.2 登錄失敗頁

圖1.3 登錄成功頁

輸入的是正確的用戶信息,所以登錄判斷頁判斷該用戶為合法用戶。因此登錄判斷頁會執(zhí)行下面這段代碼。

        <jsp:forward page="login_success.jsp"/>

因此將執(zhí)行服務器端跳轉到登錄成功頁。但是這里發(fā)現一個問題,直接瀏覽“l(fā)ogin_success.jsp”頁面就可以顯示成功,根本就不用登錄,因此必須在登錄成功頁加上判斷。

修改代碼步驟如下。

(1)修改登錄判斷頁“l(fā)ogin_conf.jsp”。如果判斷為合法用戶,則將在request范圍中添加屬性login,并將屬性值設置為true,修改代碼如下所示。

        <%@page contentType=”text/html; charset=gb2312”%>
        <html>
        <head>
            <title>登錄判斷</title>
        </head>
        <body>
            <%
                    // 接收請求的內容
                    String name = request.getParameter("uname") ;
                    String password = request.getParameter("upassword") ;
            %>
            <%
                    // 判斷用戶名及密碼
                    if("xiaoqiang".equals(name)&&"xiaoqiang".equals(password)){
                            // 合法用戶
                            //request范圍中添加屬性login,其屬性值為true
                            request.setAttribute("login", "true");
            %>
                            <jsp:forward page="login_success.jsp"/>
            <%
                    } else {
                            // 非法用戶
            %>
                            <jsp:forward page="login_failure.jsp"/>
            <%
                    }
            %>
        </body>
        </html>

(2)修改登錄成功頁“l(fā)ogin_success.jsp”。在該頁面中添加對request范圍內login屬性的判斷,如果該屬性存在并且其屬性值為true才顯示用戶登錄成功,否則將跳轉到登錄頁,代碼如下所示。

        <%@page contentType="text/html; charset=gb2312"%>
        <html>
        <head>
            <title>登錄成功</title>
        </head>
        <body>
        <center>
            <%
                    if(request.getAttribute("login") ! = null && request.getAttribute("login").equals("true")){
            %>
            <h2>登錄成功</h2>
            <%
                    } else {
            %>
                    <jsp:forward page="login.jsp"></jsp:forward>
            <%
                    }
              %>
          </center>
          </body>
          </html>

打開瀏覽器,直接訪問登錄成功頁“http://localhost:8080/01/login_success.jsp”。這時頁面并沒有顯示登錄成功,而是直接跳轉回了“l(fā)ogin.jsp”用戶登錄頁。這樣就能夠避免用戶直接進入成功頁。不過代碼中還有很多地方需要改進,如直接通過JSP來進行業(yè)務邏輯的判斷,其實這樣是非常不好的?!發(fā)ogin_conf.jsp”頁面完成的是判斷和跳轉功能,完全可以使用Servlet來進行操作,而不是使用JSP。下面講解MVC設計模式,并通過使用MVC設計模式來改進這個項目。

1.1.3 Model 1和Model 2

首先來看什么是Model 1模式。前面編寫的那個登錄項目為例就是用典型的基于Model 1模式來開發(fā)的,整個Web項目都是由JSP頁面構成的。其中登錄判斷頁“l(fā)ogin_conf.jsp”既要接受客戶端的請求,還必須對其用戶信息判斷進行跳轉。JSP頁面既要負責顯示還要負責控制,將控制邏輯和表現邏輯混在一起了。

使用Model 1模式開發(fā)代碼重用性非常低,對于功能相似的代碼只能選擇復制的方式,而不是直接調用。這樣使得整個JSP頁面充斥著功能類似的代碼。

使用Model 1模式開發(fā)程序擴展性也非常差,如果以后想要給程序擴展功能是非常困難的。假如在一個JSP頁面添加了某一功能,那么可能其他的很多頁面都需要變動,甚至整個Web應用都要修改。這種牽一發(fā)而動全身的應用,會使得后期工作異常的困難和煩瑣。

JSP頁面中大量充斥著Java腳本,這使得后期的維護非常困難。有時候一個地方出現錯誤就要到處去找。還有代碼重用性,筆者就是經常在使用復制、粘貼,已經成了一種習慣。

不過使用Model 1模式來開發(fā)比較簡單和方便。因此如果是小型的Web站點,后期的更新和維護工作不是很大,就可以采用Model 1模式來開發(fā)。

Model 2是基于MVC架構的設計模式。MVC包含3個基本部分,分別是Model(模型)、View(視圖)和Controller(控制器)。JSP只負責顯示,而控制器則由Servlet充當,模型由JavaBean充當。為了更好地明白Model 1和Model 2的區(qū)別,下面給出Model 1以及Model 2的程序流程圖,如圖1.4和圖1.5所示。

圖1.4 Model 1的程序流程圖

圖1.5 Model 2的程序流程圖

Model 1的程序流程比較容易理解。用戶提交信息給JSP頁面,JSP接受用戶提交的值,通過JavaBean連接數據庫并操作數據庫,然后將結果返回給用戶。

Model 2將JSP的功能簡化了,在Model 1中JSP負責的東西過多了。在Model 2中使用Servlet來充當控制器,而JSP只是充當顯示。至于為什么會這樣設計,是因為在JSP中進行接受參數和判斷還有跳轉等功能會用到大量的Java腳本代碼。過多的Java腳本代碼會使得頁面維護起來非常困難,而Servlet本來就是一個Java文件,這樣使用Servlet來接受參數和判斷還有跳轉等功能是非常合適的。用戶可以把Servlet看成是一個大管家,它負責所有的業(yè)務邏輯并通過JavaBean來操作數據庫以及決定顯示頁面。

通過分層的思想使得程序執(zhí)行更加清晰,各層都只負責自己的功能,不會出現混亂。而且如果程序后期需要增加功能或者進行維護都是非常方便的,下面來演示如何使用MVC設計模式來改進前面的登錄案例。

1.1.4 使用MVC設計模式改進代碼

如果要使用MVC設計模式,那么控制器就要使用Servlet。具體的邏輯判斷則交給業(yè)務邏輯組件來判斷,而業(yè)務邏輯組件判斷的結果則返回交給Servlet來判斷并實現跳轉。

步驟如下。

(1)新建一個Web項目,把上個項目中的“l(fā)ogin.jsp”、“l(fā)ogin_success.jsp”以及“l(fā)ogin_failure.jsp”復制到本項目中。

(2)新建業(yè)務邏輯組件類,類名為LoginCheck,包含一個isLogin方法,用來判斷用戶是否合法,代碼如下所示。

        public class LoginCheck {
              //判斷是否為合法用戶
              public boolean isLogin(String name, String password){
                    if("xiaoqiang".equals(name)&&"xiaoqiang".equals(password)){
                            return true;
                    }else{
                            return false;
                    }
              }
        }

(3)新建Servlet, Servlet類名為LoginConf。該Servlet接受用戶提交的參數,并通過實例化一個業(yè)務邏輯組件,然后通過調用業(yè)務邏輯組件中的isLogin返回值來分別對合法用戶和非法用戶執(zhí)行跳轉,代碼如下所示。

        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 LoginConf extends HttpServlet {
              public void doGet(HttpServletRequest request, HttpServletResponse response)
                          throws ServletException, IOException {
                    //接受用戶參數
                    String name = request.getParameter("uname");
                    String password = request.getParameter("upassword");
                    //new一個LoginCheck對象
                    LoginCheck lc = new LoginCheck();
                    //調用業(yè)務邏輯組件的判斷功能
                    if(lc.isLogin(name, password)){
                          //如果為合法用戶,在request范圍中添加屬性login,其屬性值為true,并跳轉到登錄成功頁
                          request.setAttribute("login", "true");
                          request.getRequestDispatcher("login_success.jsp").forward(request, response);
                    }else{
                          //如果為非法用戶則跳轉到登錄失敗頁
                          request.getRequestDispatcher("login_failure.jsp").forward(request, response);
                    }
              }
              public void doPost(HttpServletRequest request, HttpServletResponse response)
                          throws ServletException, IOException {
                    doGet(request, response);
              }
        }

(4)分別編譯LoginCheck類和LoginConf類,并將編譯后的class文件放入項目的WEB-INF文件夾下的classes文件夾中。

(5)配置Servlet,修改“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>LoginConf</servlet-name>
            <servlet-class>LoginConf</servlet-class>
          </servlet>
          <servlet-mapping>
            <servlet-name>LoginConf</servlet-name>
            <url-pattern>/LoginConf</url-pattern>
          </servlet-mapping>
        </web-app>

(6)修改“l(fā)ogin.jsp”,即頁面提交頁,使頁面跳轉到LoginConf,代碼如下所示。

        <form action="LoginConf"method="post">

(7)部署該項目。打開Tomcat安裝目錄下的conf文件夾,打開其中的“server.xml”文件。在文件的最下面的“</host>”標簽之前添加如下代碼。

        <Context path="/02"docBase="E:\BookDemo\ch01\02"reloadable="true"crossContext="true">
        </Context>

1.1.5 測試MVC改進代碼

下面運行這個程序,看是否實現了項目的要求(本實例參照第1.1.2節(jié)進行了改進)。

步驟如下。

(1)啟動Tomcat服務(如果Tomcat為安裝版本),或者打開Tomcat安裝目錄下的bin目錄,找到“startup.bat”,雙擊運行該批處理來運行Tomcat服務器。

(2)打開瀏覽器,訪問登錄頁地址“http://localhost:8080/02/login.jsp”,頁面顯示效果如圖1.6所示。

(3)在表單中填寫用戶信息,這里隨意地填寫一個用戶信息。單擊“登錄”按鈕進行提交。頁面提交到登錄判斷頁,頁面顯示效果如圖1.7所示。

因為用戶信息是隨意填寫的,所以登錄判斷頁判斷該用戶為非法用戶。在LoginConf的Servlet中調用業(yè)務邏輯組件LoginCheck的isLogin方法,返回的是“false”。在LoginConf中會執(zhí)行下列代碼。

          request.getRequestDispatcher("login_failure.jsp").forward(request, response);

因此將執(zhí)行服務器端跳轉到登錄失敗頁。

(4)輸入正確的用戶信息,用戶名和密碼都填寫“xiaoqiang”,單擊“登錄”按鈕進行提交。頁面提交到登錄判斷頁,頁面顯示效果如圖1.8所示。

圖1.6 用戶登錄頁

圖1.7 登錄失敗頁

圖1.8 登錄成功頁

輸入的是正確的用戶信息,所以登錄判斷頁判斷該用戶為合法用戶。在LoginConf的Servlet中調用業(yè)務邏輯組件LoginCheck的isLogin方法,返回的是“true”。在LoginConf中會執(zhí)行下列代碼。

          request.getRequestDispatcher("login_success.jsp").forward(request, response);

因此將執(zhí)行服務器端跳轉到登錄成功頁。

(5)直接訪問登錄成功頁地址“http://localhost:8080/02/login_success.jsp”,這時頁面將自動跳轉回登錄頁。

主站蜘蛛池模板: 德清县| 平和县| 马关县| 当阳市| 贡嘎县| 巍山| 河间市| 濮阳县| 龙口市| 澄迈县| 连州市| 万年县| 广东省| 汝城县| 清远市| 崇阳县| 东源县| 兴文县| 金沙县| 雷波县| 南康市| 邳州市| 锡林浩特市| 贵德县| 江口县| 金溪县| 图们市| 凤山市| 广安市| 东阳市| 循化| 静宁县| 洛阳市| 铜川市| 永和县| 增城市| 安多县| 石楼县| 西安市| 察哈| 泊头市|