MVC+DAO设计模式下的设计流程

这里总结一下MVC+DAO的设计流程。通过MVC+DAO的设计模式,可以使项目在设计过程中结构更为明晰,并且能够方便的进行修改。MVC是一个分层模型,即模型、视图、控制器。DAO是一个数据库访问模型,隔离数据库操作。

博客地址:http://blog.csdn.net/tao_sun


环境说明:

数据库:mysql

开发语言:JSP + Servlet + Java

服务器:tomcat 7.x


包规划:

entity放置与数据库中的表相对应的实体类
dao放置DAO设计模式下实现访问数据库的接口
dao.impl放置DAO对应的接口实现类
servlet放置Servlet
util工具包

设计流程综述:

0.设计数据库以及视图页面(VIEW)

1.设计数据库的工具类

2.设计符合java bean标准的entity类 (MODEL)

3.设计访问数据库的DAO接口

4.设计实现DAO接口的实现类

5.创建Servlet响应请求(CONTROLLER)


例子:以一个简单的登录页面设计为例

0.设计数据库以及视图页面

数据库设计:

CREATE TABLE `NewTable` (
`id`  int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT ,
`name`  varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
`password`  varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL ,
PRIMARY KEY (`id`)
)

页面视图:

index.jsp的核心代码如下:

    <form action="/iMath/servlet/AdminServlet?method=login" method="post">
    	<table border='1' align="center">
    		<caption>USER LOGIN</caption>
    		<tr>
    			<th>username</th>
    			<th><input type="text" name="username" /></th>
    		</tr>
    		<tr>
    			<th>password</th>
    			<th><input type="password" name="password" /></th>
    		</tr>
    		<tr>
    			<td colspan="2" align="center"><input type="submit" value="submit" /></td>
    		</tr>
    	</table>
    </form>
核心代码就是一个form表单,用于提供视图,为用户提供输入的接口。核心是指定action和method属性。这应该是最简单的一步,下面的工作则进入真正的代码编写阶段。

转发页面:

message.jsp核心代码如下:其实就句话

  <body>
   ${message}
  </body>


1.设计数据库的工具类

这步的操作应该是大同小异的,目的只是抽取公共代码,简化程序流程。

dbConfig.properties 文件存放数据库的配置文件,这么做的优点的是可以项目编译后也能方便的修改数据库配置的相关信息。

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/imath?useUnicode=true&characterEncoding=utf-8
user = root
password =1234

DBUtil类设计:该类用实现建立数据库连接和关闭数据库连接的公共操作。

代码如下:

package cn.imath.util;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public final class DBUtil {
    private static String driver;  
    private static String url;  
    private static String user;  
    private static String password;  
    
    /**
     * load the property file
     */
    static{
        Properties props = new Properties();  
        //get the class loader
        InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("cn/imath/util/dbConfig.properties");  
        try {  
            props.load(is);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        driver = props.getProperty("driver");  
        url = props.getProperty("url");  
        user = props.getProperty("user");  
        password = props.getProperty("password");
    }
    
    /**
     * register the driver
     */
    static{
    	try {
			Class.forName(driver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    }
    
    /**
     * OPEN THE DATABASE CONNECTION
     * @return
     */
    public static Connection getConn(){
    	Connection conn = null;
    	try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			e.printStackTrace();
		}
    	return conn;
    }
    
    /**
     * CLOSE THE DATABASE CONNECTION
     * @param rs
     */
	public static void closeAll(ResultSet rs,Statement stmt,Connection conn){
		close(rs);
		close(stmt);
		close(conn);
	}
    
	
	
    public static void close(ResultSet rs){
    	if(rs!=null){
    		try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
    	}
    }
    
	public static void close(Statement stmt){
		if(stmt!=null){
			try {
				stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	public static void close(Connection conn){
		if(conn!=null){
			try {
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	

}
这里要注意的是:导入的包均为java.sql包。这里建立了两个核心方法,后面会经常用到 getConn() 和 closeAll()方法,分别用于取得数据库连接和关闭数据库连接。


2.设计符合java bean标准的entity类

这里的entity类对应于上面的admin表。因此设计Admin类如下:

package cn.imath.entity;

public class Admin {
	private int id;
	private String name;
	private String password;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	
}
entity类的设计是为了实现对数据的封装,只要对照数据库设计来就行,然后最好符合java bean的设计标准,用getter/setter实现访问。

3.设计访问数据库的DAO接口

dao接口的设计非常简单,目的是为后面的具体的业务方法提供一个模版。

AdminDao接口如下:

package cn.imath.dao;

import cn.imath.entity.Admin;

public interface AdminDao {
	
	/**
	 * LOGIN METHOD
	 * @param username
	 * @param password
	 * @return INSTANCE OF Admin
	 */
	public Admin login(String username,String password);
}


4.设计实现DAO接口的实现类

接下来设计上面DAO接口的实现类,用于实现具体的业务。这里就能体现上面模版的作用。

package cn.imath.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.imath.dao.AdminDao;
import cn.imath.entity.Admin;
import cn.imath.util.DBUtil;

public class AdminDaoImpl implements AdminDao {
	
	/**
	 * LOGIN METHOD
	 */
	public Admin login(String username, String password) {
		String sql = "select * from admin where name=? and password=? ";
		Connection conn = DBUtil.getConn();
		
		try {
			PreparedStatement pstmt = conn.prepareStatement(sql);
			//set the query parameters
			pstmt.setString(1,username);
			pstmt.setString(2, password);
			
			ResultSet rs = pstmt.executeQuery();
			
			if(rs.next()){
				int id = rs.getInt(1);
				Admin ad = new Admin();
				ad.setId(id);
				ad.setPassword(password);
				ad.setName(username);
				return ad;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return null;
	}

}
dao的实现类实现了具体的业务方法,封装了sql的相关操作。

5.创建Servlet响应请求

Servlet负责处理请求。

package cn.imath.servlet;

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;

import cn.imath.dao.AdminDao;
import cn.imath.dao.impl.AdminDaoImpl;
import cn.imath.entity.Admin;

public class AdminServlet extends HttpServlet {


	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String method = request.getParameter("method");
		if(method!=null){
			if("login".equals(method)){
				this.login(request,response);
			}
		}
		
	}

	private void login(HttpServletRequest request, HttpServletResponse response) {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		AdminDao dao = new AdminDaoImpl();
		Admin ad = dao.login(username, password); 
		if(ad!=null){
			request.setAttribute("message", "Login Success");
		}else{
			request.setAttribute("message", "Login Failed");
		}
		
		try {
			request.getRequestDispatcher("/message.jsp").forward(request, response);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
这里将login方法独立于doPost方法,这样有助于对功能的扩充。


这里介绍的只是MVC+DAO的设计流程,通过这种模式可以改进项目的设计,使项目结构更为清晰,有了合理的方法,具体的项目才不致太混乱。最后,说一下需要改进的地方:

1.数据库的连接控制,可以用连接池进行改进,如DBCP或C3P0

2.数据库操作可以用common dbutils进行改进


  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值