MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件里面,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。
下面講解簡單的登錄操作:
程序流程圖:
在本程序中用戶輸入的登陸信息提交給Servlet進行接收,Servlet接收到請求內容后首先對其合法性進行檢驗(例如:輸入的內容是否為空或者長度是否滿足要求等),如果驗證失敗,則將錯誤信息傳遞給登陸頁顯示,如果數據合法,則調用DAO層完成數據庫的驗證,根據驗證的結構跳轉到“登陸成功”或登陸失敗的頁面,在本程序中,為了操作便捷,將登陸成功或失敗的顯示頁都統一設置成登陸頁。
MVC登陸程序清單:
No. |
頁面名稱 |
文件類型 |
描述 |
1 |
User |
JavaBean |
用戶登陸的VO操作類 |
2 |
DatabaseConnection |
JavaBean |
負責數據庫的連接和關閉操作 |
3 |
IUserDAO |
JavaBean |
定義登陸操作的DAO接口 |
4 |
UserDAOImpl |
JavaBean |
DAO接口的真實實現類,完成具體的登陸驗證 |
5 |
UserDAOProxy |
JavaBean |
定義代理操作,負責數據庫的打開和關閉並且調用真實主題 |
6 |
DAOFactory |
JavaBean |
工廠類,取得DAO接口的實例 |
7 |
LoginServlet |
Servlet |
接收請求參數,進行參數驗證,調用DAO完成具體的登陸驗證,並根據DAO的驗證結果返回登陸信息 |
8 |
login.jsp |
JSP |
提供用戶輸入的表單、可以顯示用戶登陸成功或失敗的信息 |

JSP的功能
通過本道MVC程序,讀者可以清楚的感覺到,與最初的JSP開發(例如:JSP + JDBC或者是JSP + DAO)相比,現在的JSP頁面中的代碼已經減少了很多,只是簡單的完成了輸出,實際上在開發中,讀者一定要記住JSP中最好只包含以下三種類型的代碼:
接收屬性:接收從Servlet傳遞過來的屬性;
判斷語句:判斷傳遞到JSP中的屬性是否存在;
輸出內容:使用迭代或者是VO進行輸出。
一定要記住一點,在JSP頁面中唯一允許導入的包只能是java.util包,只要能把握住這一點,就可以開發出一個簡潔、清晰的JSP頁面。
理解了以上信息下面開始操作源代碼
User.java文件
package com.mvc.oumyye.vo ; /** * * @author 偶my耶 * 實體類 */ public class User { private String userid ; private String name ; private String password ; public void setUserid(String userid){ this.userid = userid ; } public void setName(String name){ this.name = name ; } public void setPassword(String password){ this.password = password ; } public String getUserid(){ return this.userid ; } public String getName(){ return this.name ; } public String getPassword(){ return this.password ; } }
DatabaseConnection.java
package com.mvc.oumyye.dbc ; import java.sql.* ; /** * * @author 偶my耶 * 數據庫連接 */ public class DatabaseConnection { private static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ; private static final String DBURL = "jdbc:mysql://localhost:3306/mytest" ; private static final String DBUSER = "root" ; private static final String DBPASSWORD = "root" ; private Connection conn = null ; public DatabaseConnection() throws Exception{ try{ Class.forName(DBDRIVER) ; this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ; }catch(Exception e){ throw e ; } } public Connection getConnection(){ return this.conn ; } public void close() throws Exception{ if(this.conn != null){ try{ this.conn.close() ; }catch(Exception e){ throw e ; } } } }
package com.mvc.oumyye.dao ; import com.mvc.oumyye.vo.User; public interface IUserDAO { public boolean findLogin(User user) throws Exception ; }
package com.mvc.oumyye.dao.impl ; import com.mvc.oumyye.dao.*; import com.mvc.oumyye.vo.User; import java.sql.* ; /** * * @author 偶my耶 * Dao實現類 */ public class UserDAOImpl implements IUserDAO { private Connection conn = null ; private PreparedStatement pstmt = null ; public UserDAOImpl(Connection conn){ this.conn = conn ; } public boolean findLogin(User user) throws Exception{ boolean flag = false ; String sql = "SELECT name FROM user WHERE userid=? AND password=?" ; this.pstmt = this.conn.prepareStatement(sql) ; this.pstmt.setString(1,user.getUserid()) ; this.pstmt.setString(2,user.getPassword()) ; ResultSet rs = this.pstmt.executeQuery() ; if(rs.next()){ user.setName(rs.getString(1)) ; flag = true ; } this.pstmt.close() ; return flag ; } }
DAOFactory.java
package com.mvc.oumyye.factory ; import com.mvc.oumyye.dao.*; import com.mvc.oumyye.dao.proxy.*; /** * * @author 偶my耶 * 工廠接口 */ public class DAOFactory { public static IUserDAO getIUserDAOInstance(){ return new UserDAOProxy() ; } }
UserDAOProxy.java
package com.mvc.oumyye.dao.proxy ; import com.mvc.oumyye.dbc.DatabaseConnection; import com.mvc.oumyye.dao.IUserDAO; import com.mvc.oumyye.dao.impl.UserDAOImpl; import com.mvc.oumyye.vo.User; /** * * @author 偶my耶 * 工廠類 實現業務操作 */ public class UserDAOProxy implements IUserDAO { private DatabaseConnection dbc = null ; private IUserDAO dao = null ; public UserDAOProxy(){ try{ this.dbc = new DatabaseConnection() ; }catch(Exception e){ e.printStackTrace() ; } this.dao = new UserDAOImpl(dbc.getConnection()) ; } public boolean findLogin(User user) throws Exception{ boolean flag = false ; try{ flag = this.dao.findLogin(user) ; }catch(Exception e){ throw e ; }finally{ this.dbc.close() ; } return flag ; } }
LoginServlet.java
package com.mvc.oumyye.servlet ; import java.io.* ; import java.util.* ; import javax.servlet.* ; import javax.servlet.http.* ; import com.mvc.oumyye.factory.DAOFactory; import com.mvc.oumyye.vo.User; /** * * @author 偶my耶 * Servlet */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ String path = "login.jsp" ; String userid = req.getParameter("userid") ; String userpass = req.getParameter("userpass") ; System.out.println(userid); System.out.println(userpass); List<String> info = new ArrayList<String>() ; if(userid==null || "".equals(userid)){ info.add("用戶名不能為空!!!") ; } if(userpass==null || "".equals(userpass)){ info.add("密碼不能為空!!") ; } if(info.size()==0){ User user = new User() ; user.setUserid(userid) ; user.setPassword(userpass) ; try{ if(DAOFactory.getIUserDAOInstance().findLogin(user)){ info.add("歡迎" + user.getName() + "登陸") ; } else { info.add("請重新登錄") ; } }catch(Exception e){ e.printStackTrace() ; } } req.setAttribute("info",info) ; req.getRequestDispatcher(path).forward(req,resp) ; } public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{ this.doGet(req,resp) ; } }
web.xml文件
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app 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" version="2.5"> <display-name>Welcome to Tomcat</display-name> <description> Welcome to Tomcat </description> <servlet> <servlet-name>login</servlet-name> <servlet-class> com.mvc.oumyye.servlet.LoginServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> </web-app>
login.jsp文件
<%@ page contentType="text/html" pageEncoding="GBK"%> <%@ page import="java.util.*"%> <html> <head><title></title></head> <body> <script language="javascript"> function validate(f){ if(!(/^\w{5,15}$/.test(f.userid.value))){ alert("用戶ID必須是5~15位!") ; f.userid.focus() ; return false ; } if(!(/^\w{5,15}$/.test(f.userpass.value))){ alert("密碼必須是5~15位!") ; f.userpass.focus() ; return false ; } } </script> <% request.setCharacterEncoding("GBK") ; %> <% List<String> info = (List<String>) request.getAttribute("info") ; if(info != null){ // 有信息返回 Iterator<String> iter = info.iterator() ; while(iter.hasNext()){ %> <h4><%=iter.next()%></h4> <% } } %> <form action="LoginServlet" method="post" onSubmit="return validate(this)"> 用戶ID:<input type="text" name="userid"><br> 密 碼:<input type="password" name="userpass"><br> <input type="submit" value="登陸"> <input type="reset" value="重置"> </form> </body> </html>
數據庫文件.sql
/*======================= 創建user數據表 =======================*/ CREATE TABLE user( userid VARCHAR(30) PRIMARY KEY , name VARCHAR(30) NOT NULL , password VARCHAR(32) NOT NULL ) ; /*======================= 插入測試數據 =======================*/ INSERT INTO user (userid,name,password) VALUES ('admin','administrator','admin') ;
效果圖:
MVC設計模式的好處:
JSP只負責顯示
DAO負責數據層操作
Servlet連接JSP和DAO,並根據JavaBean的操作結果進行跳轉