MVC设计模式
![](https://box.kancloud.cn/2016-02-22_56caa830ef7ee.gif)
写了几天代码,然后对之前学到的知识,进行反思,写出来放在QQ空间上和博客上,目的是互相学习,然后希望可以得到编程高手的补充!这是我转载加修改的博客。
这是我做了2、3天左右的JavaWeb管理系统,bean package放JavaBean类,dao package放数据库操作方法的接口类。daoimpl是实现dao接口的类。factory package是dao工厂类。util package是工具包类,里面有数据库连接类和 分页类。servlet package是servlet类,是整个JavaWeb项目的控制类。view文件夹里全是.jsp文件。
学习MVC设计模式之前,先学习DAO设计模式。下面是我转的博客,是个挺不错的例子
DAO设计模式:
1、DAO简介:
DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。
2、DAO各部分详解:
DAO设计模式包括以下5个主要部分:
(1)、数据库连接类;
数据库连接类的主要功能是连接数据库并获得连接对象,以及关闭数据库。通过数据库连接类可以大大的简化开发,在需要进行数据库连接时,只需常见该类的实例,并调用其中的方法就可以获得数据库连接对象和关闭数据库,不必再进行重复操作。例:
~~~
Package com.javaweb.dao1
Import java.sql.*;
Public class DataBaseConnection{
Private final String DBDRIVER = “com.mysql.jdbc.Driver”;
Private final String DBURL = “jdbc:mysql://localhost:3306/javaweb”;
Private final String DBUSER = “root””;
Private final String DBPASSWORD = “585762”;
Private Connection conn = null;
Public DataBaseConnection(){
Try{
Class.forName(DBDRIVER);
This.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);
}catch(Exception e){
System.out.println(“加载数据库驱动失败!”);
}
}
Public Connection getConnection(){
Return conn;
}
Public void close(){
Try{
Conn.close();
}catch(){
System.out.println(“数据库连接关闭失败!”);
}
}
}
~~~
Package com.javaweb.dao1Import java.sql.*;Public class DataBaseConnection{ Private final String DBDRIVER = “com.mysql.jdbc.Driver”; Private final String DBURL = “jdbc:mysql://localhost:3306/javaweb”; Private final String DBUSER = “root””; Private final String DBPASSWORD = “585762”; Private Connection conn = null; Public DataBaseConnection(){ Try{ Class.forName(DBDRIVER); This.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); }catch(Exception e){ System.out.println(“加载数据库驱动失败!”); } } Public Connection getConnection(){ Return conn; } Public void close(){ Try{ Conn.close(); }catch(){ System.out.println(“数据库连接关闭失败!”); } }}
(2)、VO类:
VO类是一个包含属性和表中字段完全对应的类,并在该类中提供setter和getter方法来设置并获取该类中的属性。例:
~~~
Package com.javaweb.dao1
Public classs User{
Private int userid;
Private String username;
Private String password;
Public int getUserid(){
Return userid;
}
Public void setUserid(int userid){
Return userid;
}
Public String getUsername(){
Return username;
}
Public void setUsername(String username){
Return username;
}
Public String getUserpassword(){
Return userpassword;
}
Public void setUserid(String userpassword){
Return userpassword;
}
}
~~~
Package com.javaweb.dao1Public classs User{ Private int userid; Private String username; Private String password; Public int getUserid(){ Return userid; } Public void setUserid(int userid){ Return userid; } Public String getUsername(){ Return username; } Public void setUsername(String username){ Return username; } Public String getUserpassword(){ Return userpassword; } Public void setUserid(String userpassword){ Return userpassword; }}
(3)、DAO接口:
DAO接口中定义了所有的用户操作,如添加记录、删除记录及查询记录等。不过因为是借口,所以仅仅是定义,需要子类实现。例:
~~~
Package com.javaweb.dao1;
Import java.util.*;
Public class UserDAO{
public void insert(User user)throw Exception;
Public void update(User user)throw Exception;
Public void delete(int userid)throw Exception;
Public User queryById(int userid)throw Exception;
Public List queryAll()throw Exception;
}
~~~
Package com.javaweb.dao1;Import java.util.*;Public class UserDAO{ public void insert(User user)throw Exception; Public void update(User user)throw Exception; Public void delete(int userid)throw Exception; Public User queryById(int userid)throw Exception; Public List queryAll()throw Exception;}
(4)、DAO实现类:
DAO实现类实现了DAO接口,并实现了接口中定义的所有方法。
(5)、DAO工厂类:
在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才能完成数据库操作。这时就必须知道具体的子类,对于后期的修改非常不方便。
使用DAO工厂类,可以比较方便地对代码进行管理,而且可以很好地解决后期修改的问题,通过该DAO工厂类的一个静态方法来获取DAO实现类实例。这时如果要替换DAO实现类,只需要修改该Dao工厂类中的方法代码,而不必邀修改所有的操作数据库代码。例:
~~~
Package com.javaweb.dao1;
Public class DAOFactory{
Public static UserDAO getUserDAOInstance(){
Return new UserDAOImpl();
}
}
~~~
Package com.javaweb.dao1;Public class DAOFactory{ Public static UserDAO getUserDAOInstance(){ Return new UserDAOImpl(); }}
3、使用DAO完成数据库操作:
(1)、添加记录:
(2)、更新记录:
(3)、删除记录:
(4)、查询记录:
**MVC模式**(Model-View-Controller)是[软件工程](http://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B "软件工程")中的一种[软件架构](http://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E6%9E%B6%E6%9E%84 "软件架构")模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式最早由[Trygve Reenskaug](http://zh.wikipedia.org/w/index.php?title=Trygve_Reenskaug&action=edit&redlink=1 "Trygve Reenskaug(页面不存在)")在1978年提出[[1]](http://zh.wikipedia.org/wiki/MVC#cite_note-1) ,是[施乐帕罗奥多研究中心](http://zh.wikipedia.org/wiki/%E5%B8%95%E7%BE%85%E5%A5%A7%E5%A4%9A%E7%A0%94%E7%A9%B6%E4%B8%AD%E5%BF%83 "帕罗奥多研究中心")(Xerox PARC)在20世纪80年代为程序语言[Smalltalk](http://zh.wikipedia.org/wiki/Smalltalk "Smalltalk")发明的一种软件设计模式。**MVC模式**的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:
- (控制器Controller)- 负责转发请求,对请求进行处理。
- (视图View) - 界面设计人员进行图形界面设计。
- (模型Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。
**图**。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。
**模型**:
模型表示企业数据和业务规则。在MVC的三个部件中,**模型拥有最多的处理任务**。例如它可能用象EJBs和ColdFusionComponents这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说**模型与数据格式无关,这样一个模型能为多个视图提供数据**。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。
**控制器**
控制器**接受用户的输入并调用模型和视图去完成用户的需求**。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
**优点:**
在最初的[JSP](http://zh.wikipedia.org/wiki/JSP "JSP")网页中,像[数据库](http://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93 "数据库")查询语句这样的数据层代码和像[HTML](http://zh.wikipedia.org/wiki/HTML "HTML")这样的表示层代码混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心地计划和不断的尝试。MVC从根本上强制性地将它们分开。尽管构造MVC应用程序需要一些额外的工作,但是它带给我们的好处是毋庸置疑的。
首先,多个视图能共享一个模型。如今,同一个Web应用程序会提供多种用户界面,例如用户希望既能够通过浏览器来收发[电子邮件](http://zh.wikipedia.org/wiki/%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6 "电子邮件"),还希望通过手机来访问[电子邮箱](http://zh.wikipedia.org/wiki/%E7%94%B5%E5%AD%90%E9%82%AE%E7%AE%B1 "电子邮箱"),这就要求Web网站同时能提供[Internet](http://zh.wikipedia.org/wiki/Internet "Internet")界面和[WAP](http://zh.wikipedia.org/wiki/WAP "WAP")界面。在MVC设计模式中,模型响应用户请求并返回响应数据,视图负责格式化数据并把它们呈现给用户,业务逻辑和表示层分离,同一个模型可以被不同的视图重用,所以大大提高了代码的可重用性。
其次,控制器是自包含(self-contained)指高独立内聚的对象,与模型和视图保持相对独立,所以可以方便的改变应用程序的数据层和业务规则。例如,把数据库从[MySQL](http://zh.wikipedia.org/wiki/MySQL "MySQL")移植到[Oracle](http://zh.wikipedia.org/wiki/Oracle "Oracle"),或者把[RDBMS](http://zh.wikipedia.org/wiki/RDBMS "RDBMS")数据源改变成[LDAP](http://zh.wikipedia.org/wiki/LDAP "LDAP")数据源,只需改变控制器即可。一旦正确地实现了控制器,不管数据来自数据库还是[LDAP](http://zh.wikipedia.org/wiki/LDAP "LDAP")服务器,视图都会正确地显示它们。由于MVC模式的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的少互扰性的构件。
此外,控制器提高了应用程序的灵活性和可配置性。控制器可以用来连接不同的模型和视图去完成用户的需求,也可以构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择适当的模型进行处理,然后选择适当的的视图将处理结果显示给用户。
**MVC的优点
1.低耦合性**
**视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码**,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
**2.高重用性和可适用性**
随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变。
**3.较低的生命周期成本**
MVC使开发和维护用户接口的技术含量降低。
**4.快速的部署**
使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
**5.可维护性**
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
**6.有利于软件工程化管理**
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。