1. 程式人生 > >MVC設計模式實現登陸程式

MVC設計模式實現登陸程式

一: MVC簡介:

MVC模式(Model-View-Controller)是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分:模型(Model)、檢視(View)和控制器(Controller)。

MVC模式的目的:實現一種動態的程式設計,使後續對程式的修改和擴充套件簡化,並且使程式某一部分的重複利用成為可能。除此之外,此模式通過對複雜度的簡化,使程式結構更加直觀。軟體系統通過對自身基本部分分離的同時也賦予了各個基本部分應有的功能。專業人員可以通過自身的專長分組:

  • (控制器Controller)- 負責轉發請求,對請求進行處理。
  • (檢視View) - 介面設計人員進行圖形介面設計。
  • (模型Model) - 程式設計師編寫程式應有的功能(實現演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實現具體的功能)。
  • 模型(Model) 用於封裝與應用程式的業務邏輯相關的資料以及對資料的處理方法。“模型”有對資料直接訪問的權力,例如對資料庫的訪問。“模型”不依賴“檢視”和“控制器”,也就是說,模型不關心它會被如何顯示或是如何被操作。但是模型中資料的變化一般會通過一種重新整理機制被公佈。為了實現這種機制,那些用於監視此模型的檢視必須事先在此模型上註冊,從而,檢視可以瞭解在資料模型上發生的改變。(比較:觀察者模式軟體設計模式))
  • 檢視(View)能夠實現資料有目的的顯示(理論上,這不是必需的)。在檢視中一般沒有程式上的邏輯。為了實現檢視上的重新整理功能,檢視需要訪問它監視的資料模型(Model),因此應該事先在被它監視的資料那裡註冊。
  • 控制器(Controller)起到不同層面間的組織作用,用於控制應用程式的流程。它處理事件並作出響應。“事件”包括使用者的行為和資料模型上的改變。

二: MVC登陸程式流程圖:


三:MVC登陸程式清單


四:具體類的設計(DAO+MVC)

模型類:

4.1: User類:

<span style="font-size:18px;">package shiyeqiang.vo; //value object   
  

public class User {  
 //本程式定義了僱員類,以及一序列的setter、getter方法,  
    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;
	} 
}  </span>

4.2:DatabaseConnection類:
<span style="font-size:18px;">package shiyeqiang.dbc;  
  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.SQLException;  
  
public class DatabaseConnection {  
    // 該類主要是用於完成資料庫的開啟以及關閉操作  
    // 在構造方法完成開啟,close()方法完成關閉,所有異常直接丟擲,交給呼叫處 處理  
    private static final String DBDRIVER = "org.gjt.mm.mysql.Driver"; // 定義mysql中的資料庫驅動程式  
    private static final String DBURL = "jdbc:mysql://localhost:3306/mldn"; // 定義資料庫的連線地址,其中mldn為資料庫的名稱  
    private static final String DBUSER = "root"; // 定義資料庫的連線使用者名稱  
    private static final String DBPASS = "sqladmin"; // 定義資料庫的連線密碼  
    private Connection conn = null; // 資料庫連線  
  
    public DatabaseConnection() throws Exception {  
        // 在構造方法內,進行資料庫的連線操作  
        try {  
            Class.forName(DBDRIVER); // 載入驅動  
            conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);// 試圖建立到給定資料庫  
        } catch (Exception e) { // 為了方便,直接丟擲Exception異常  
            throw e;  
        }  
  
    }  
  
    public Connection getConnection() { // 取得資料庫的連線  
        return this.conn;  
    }  
  
    public void close() throws SQLException {  
        if (this.conn != null) {  
            try {  
                this.conn.close();  
            } catch (SQLException e) {  
                throw e;  
            }  
        }  
    }  
}  </span>

4.3:IUserDAO類
<span style="font-size:18px;">package shiyeqiang.dao;  
  
import java.util.List;  
  
import shiyeqiang.vo.User; //匯入僱員類所在的VO包  
  
public interface IUserDAO { // 定義DAO操作的標準;  
  

   // findById:表示根據員工編號查詢,返回的是Emp物件  
    public boolean findLogin(User user) throws Exception;  
  
}  </span>

4.4:UserDAOImpl類:
<span style="font-size:18px;">package shiyeqiang.dao.impl;
import java.sql.*;
import shiyeqiang.vo.User;
import shiyeqiang.dao.IUserDAO;
//為真實的實現類,完成具體的登入驗證
public class UserDAOImpl implements IUserDAO
{    
    private Connection conn=null; //定義資料庫的連線操作
    private PreparedStatement ps=null; //定義資料庫的執行操作
  
    public UserDAOImpl(Connection conn){ //在建構函式裡面完成資料庫的連線操作
	 this.conn=conn;
	}
	
	public boolean findLogin(User user) throws Exception{
	   boolean flag=false;
	   try{
       String sql="select name from user where userid=? and password=?";
	   this.ps=this.conn.prepareStatement( sql); 
	   this.ps.setString(1,user.getUserid()); 
	   this.ps.setString(2, user.getPassword()); 
        ResultSet  rs=this.ps.executeQuery();//執行查詢操作
		if(rs.next()){
		flag=true;
		user.setName(rs.getString(1)); //將結果集中的資料取出來儲存在user中
		}
	   }catch(Exception e){
	      throw e;
	   }finally{
	     if(this.ps!=null){
			 try{
               this.ps.close();
			 }catch(Exception e){
			   throw e;
			 }
		 }
	   }
	   return flag;
	}
}</span>

4.5:UserDAOProxy類:
<span style="font-size:18px;">package shiyeqiang.dao.proxy;
import shiyeqiang.dao.*;
import shiyeqiang.vo.*;
import shiyeqiang.dao.impl.*;
import shiyeqiang.dbc.*;
public class UserDAOProxy  implements IUserDAO{
	
   //為代理類,呼叫真實主題類,並且負責資料庫的開啟以及關閉的操作
    //並且代理類,以及真實主題的實現類,均是實現了相同的
  //代理類的資料成員中有真實主題類
   private IUserDAO dao=null; //真實主題實現類
  //建構函式開啟,
  //因為代理類還要負責資料庫的開啟以及關閉的操作
    private DatabaseConnection dbc=null;

	public UserDAOProxy(){
		try{
			this.dbc=new DatabaseConnection();
		}catch(Exception e){
		  e.printStackTrace();
		}
	  this.dao=new UserDAOImpl(this.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;
	 }
   
}
</span>

4.6: DAOFactory類:
<span style="font-size:18px;">package shiyeqiang.factory;    
import shiyeqiang.dao.proxy.*;  
import shiyeqiang.dao.*;  
public class DAOFactory { // 取得DAO介面的例項化物件  
    public static IUserDAO getIUserDAOInstance() throws Exception {  
  
        return new UserDAOProxy(); // 取得代理類的例項  
    }  
}  </span>

4.7:LoginServlet類: 控制類,負責轉發請求,對請求進行處理!!!
<span style="font-size:18px;">package shiyeqiang.servlet;
import java.util.*;
import javax.servlet.http.*; 
import javax.servlet.*; 
import java.io.*;
import shiyeqiang.vo.User;
import shiyeqiang.factory.*;
import shiyeqiang.dao.proxy.*;
public class LoginServlet extends HttpServlet{

   public void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
		String path = "login.jsp" ;
		String userid = req.getParameter("userid") ;
		String userpass = req.getParameter("usepass") ;
		List<String> info = new ArrayList<String>() ;	// 收集錯誤
		if(userid==null || "".equals(userid)){
			info.add("使用者id不能為空!") ;
		}
		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) ;
	}

}</span>

LoginServlet類的配置:web.xml中配置如下:
<span style="font-size:18px;"><servlet>   
      <servlet-name>login</servlet-name>
      <servlet-class>shiyeqiang.servlet.LoginServlet</servlet-class> 
  </servlet>

<servlet-mapping>   
      <servlet-name>login</servlet-name>
      <url-pattern>/login/LoginServlet</url-pattern>  
 </servlet-mapping></span>
4.8:login.jsp: 檢視顯示,介面顯示
<span style="font-size:18px;"><%@page contentType="text/html" pageEncoding="GBK"%>
<%@page import="java.util.*"%>
<html>
  <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> iterator=info.iterator();
	  while(iterator.hasNext()){
	    String str=iterator.next();
%>
<h1><%=str%></h1>
<%
	  }
	}
 %>
 <form action="LoginServlet" method="post"  onSubmit="return validate(this)">
 使用者名稱:<input type="text" name="userid"><br>
 密; 碼:<input type="password" name="usepass"><br>
 <input type="submit" value="登入">
 <input type="reset" value="重置">
 </form>
 </body>
</html>
</span>

使用Mysql資料庫,資料庫名稱為mldn,該資料庫中的表名稱為:user,其中含有三個屬性,分別為:(userid,name,password)。