- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MVC+DAO设计模式下的设计流程详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
DAO设计 :
DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置.
在该层主要完成对象-关系映射的建立,通过这个映射,再通过访问业务对象即可实现对数据库的访问,使得开发中不必再用SQL语句编写复杂的数据库访问程序,这样就简化了对数据库的访问,提高了开发效率。同时通过对象-关系映射的配置,可以建立业务对象之间的复杂关系,如一对多、多对1、一对1、多对多等关系。这样就不再需要在数据库中建立表之间的复杂联系,使得业务对象之间的关系和数据库相分离,简化了数据库的建立和维护。在这一层中主要使用Hibernate框架来实现.
针对以上问题,产生了基于MVC模式Model层的DAO模式(Data Access Object),主要由工厂类(Factory)、代理类(Proxy)、实现类(DAOImpl)、DAO接口和值对象类(VO)以及数据库连接类组成.
这里总结一下MVC+DAO的设计流程。通过MVC+DAO的设计模式,可以使项目在设计过程中结构更为明晰,并且能够方便的进行修改。MVC是一个分层模型,即模型、视图、控制器。DAO是一个数据库访问模型,隔离数据库操作.
环境说明:
数据库: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.设计数据库以及视图页面 。
数据库设计:
1
2
3
4
5
6
|
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的核心代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
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核心代码如下:其实就句话 。
1
2
3
|
<
body
>
${message}
</
body
>
|
1.设计数据库的工具类 。
这步的操作应该是大同小异的,目的只是抽取公共代码,简化程序流程.
dbConfig.properties 文件存放数据库的配置文件,这么做的优点的是可以项目编译后也能方便的修改数据库配置的相关信息.
1
2
3
4
|
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/imath?useUnicode=true&characterEncoding=utf-8
user = root
password =1234
|
DBUtil类设计:该类用实现建立数据库连接和关闭数据库连接的公共操作.
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
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类如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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接口如下:
1
2
3
4
5
6
7
8
9
10
11
|
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接口的实现类,用于实现具体的业务。这里就能体现上面模版的作用.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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负责处理请求.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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进行改进 。
总结 。
以上就是本文关于MVC+DAO设计模式下的设计流程详解的全部内容,希望对大家有所帮助。有什么问题,可以随时留言指出。感谢大家! 。
原文链接:http://blog.csdn.net/tao_sun/article/details/19124853 。
最后此篇关于MVC+DAO设计模式下的设计流程详解的文章就讲到这里了,如果你想了解更多关于MVC+DAO设计模式下的设计流程详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
首先是一些背景;我们正在开发一个数据仓库,并对我们的 ETL 过程使用哪些工具进行一些研究。该团队非常以开发人员为中心,每个人都熟悉 C#。到目前为止,我已经看过 RhinoETL、Pentaho (
我需要具有管理员权限的进程。从this问题和答案来看,似乎没有比启动单独进程更好的方法了。因为我宁愿有一个专用于该过程的过程,而不是仅为此方法在第二个过程中启动我的原始应用程序–我以为我会在VS201
我有这个函数来压平对象 export function flattenObject(object: Object, prefix: string = "") { return Object.key
我正在开发一个基于java的Web应用程序,它要求我使用来自SIP( session 启动协议(protocol))消息的输入生成序列图。我必须表示不同电话和相应服务器之间的调用流程。我可以利用任何工
这是我的代码: Process p=Runtime.getRuntime().exec("something command"); String s; JFrame frame = new JFram
我对 istio 的 mTLS 流程有点困惑。在bookinginfo 示例中,我看到服务通过http 而不是https 进行调用。如果服务之间有 mTLS 那么服务会进行 http 调用吗? 是否可
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
之前做过一个简单的纸牌游戏,对程序的整体流程有自己的想法。我最关心的是卡片触发器。 假设我们有一张名为“Guy”的牌,其效果为“每当你打出另一张牌时,获得 2 点生命”。我将如何将其合并到我的代码中?
我有 4 个 Activity 。 A、B、C 和 D。 用户可以从每个 Activity 开始任何 Activity 。 即 Activity A 有 3 个按钮来启动 B、C 和 D。以同样的方式
我做了一个简单的路由器类,简化后看起来像这样 // @flow import { Container } from 'unstated' type State = { history: Objec
我有两个 Activity ,比如 A1 和 A2。顺序为 A1->A2我从 A1 开始 A2 而没有在 A1 中调用 finish() 。在 A2 中按下后退按钮后,我想在 A1 中触发一个功能。但
我正在考虑在我的下一个项目中使用 BPEL。我试用了 Netbeans BPEL 设计器,我对它很满意。但在我决定使用 BPEL 之前,我想知道它对测试驱动开发的适用程度。不幸的是,我对那个话题知之甚
我需要将两个表格堆叠在一起,前后都有内容。我无法让后面的内容正常流动。堆叠的 table 高度可变。 HTML 结构: ... other content ...
我是 Hibernate 的新手。我无法理解 Hibernate 的流程。请澄清我的疑问。 我有“HibernateUtil.java ”和以下语句 sessionFactory = new Anno
早上好 我开始使用 Ruby,想创建一个小工具来获取我的公共(public) IP 并通过电子邮件发送。我遇到了字符串比较和无法处理的 if/else block 的基本问题。 代码非常简单(见下文)
我目前正尝试在我的团队中建立一个开发流程并阅读有关 GitFlow 的信息。它看起来很有趣,但我可以发现一些问题。 让我们假设以下场景: 我们完成了 F1、F2 和 F3 功能,并将它们 merge
我已经使用 git flow 有一段时间了。我很想了解一个特定的用例。 对于我的一个项目,我有一张新网站功能的门票。此工单取决于许多子任务。我想为主工单创建一个功能分支,然后为每个子任务创建一个脱离父
简介 "终结"一般被分为确定性终结(显示清除)与非确定性终结(隐式清除) 确定性终结主要 提供给开发人员一个显式清理的方法,比如try-finally,using。
你怎么知道在一个程序中已经发现并解决了尽可能多的错误? 几年前我读过一篇关于调试的文档(我认为这是某种 HOWTO)。其中,该文档描述了一种技术,其中编程团队故意将错误添加到代码中并将其传递给 QA
我是一名优秀的程序员,十分优秀!