歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

程序開發:MVC設計模式與應用

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.linuxidc.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.linuxidc.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.linuxidc.dao ;
import com.mvc.linuxidc.vo.User;
public interface IUserDAO {
   
    public boolean findLogin(User user) throws Exception ;
}

 

package com.mvc.linuxidc.dao.impl ;

import com.mvc.linuxidc.dao.*;
import com.mvc.linuxidc.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.linuxidc.factory ;
import com.mvc.linuxidc.dao.*;
import com.mvc.linuxidc.dao.proxy.*;
/**
 *
 * @author 偶my耶
 *    工廠接口
 */
public class DAOFactory {
    public static IUserDAO getIUserDAOInstance(){
        return new UserDAOProxy() ;
    }
}

UserDAOProxy.java

package com.mvc.linuxidc.dao.proxy ;
import com.mvc.linuxidc.dbc.DatabaseConnection;
import com.mvc.linuxidc.dao.IUserDAO;
import com.mvc.linuxidc.dao.impl.UserDAOImpl;
import com.mvc.linuxidc.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.linuxidc.servlet ;
import java.io.* ;
import java.util.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;

import com.mvc.linuxidc.factory.DAOFactory;
import com.mvc.linuxidc.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.linuxidc.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>
    密&nbsp;&nbsp;碼:<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的操作結果進行跳轉

Copyright © Linux教程網 All Rights Reserved