- 零基礎學Struts
- 卜炟等編著
- 3424字
- 2019-04-24 11:12:47
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>密  ;碼:</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”,這時頁面將自動跳轉回登錄頁。
- AngularJS Testing Cookbook
- INSTANT MinGW Starter
- Git高手之路
- 自然語言處理Python進階
- SQL經典實例(第2版)
- Keras深度學習實戰(zhàn)
- Angular開發(fā)入門與實戰(zhàn)
- HTML5 APP開發(fā)從入門到精通(微課精編版)
- 軟件工程基礎與實訓教程
- OpenCV Android Programming By Example
- Learning Bootstrap 4(Second Edition)
- Mastering VMware Horizon 7(Second Edition)
- Visual Basic程序設計基礎
- Offer來了:Java面試核心知識點精講(框架篇)
- Java EE程序設計與開發(fā)實踐教程