1.1 定义
MVC指MVC模式的某种框架,它强制性地使应用程序的输入、处理和输出分开。
使用MVC应用程序被分成三个核心部件:模型、视图、控制器。
视图 V
视图是用户看到并与之交互的界面。对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet和Web services.
MVC好处是它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,只是作为一种输出数据并允许用户操纵的方式。
模型 M
事务模型层,完成业务处理。模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。
控制器 C
控制器接受用户的输入并调用模型和视图去完成用户的需求,所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
1.2 MVC架构的工作流程
首先我们需要去建立实体类(一般会建立一个entity层去集中放置实体类)去对对应数据库中的表,而实体类的不同属性就对应不同的表的不同列;比如说:数据库有个user表,字段有long类型的id,string类型的姓名,那么entity中的user类也必须是含有这两个字段的,且类型必须一致。不过数据库存的是long类型,user类里的属性是string类型。
然后是去写Dao层,Dao主要作用就是控制后端与数据库的交互连接,一般Dao层中放置的都是接口类;
接着就是写Service层,一般来说Service层会有接口类与其相对应的实现类,Service层中的接口类中一般会写一些操作方法,然后由其对应的实现类去具体实现;
最后再由Controller层注入对应的Service层接口对象,通过对应注解和路径来与前端进行交互数据。
1.3 细节补充:
(一).DAO:
1.DAO包设计规范:
DAO包是有DAO接口和DAO实现类和描述类组成,在开发中会多件一个包测试DAO包
DAO的命名:
公司域名倒写.项目名.DAO --> 主包
例子:
com.qfedu.项目名称.domain --> 存储到是domain文件
com.qfedu.项目名称.dao --> 存储dao的接口 -->封装了处理数据库的方法
com.qfedu.项目名称.dao.impl --> 存储dao包下的实现类
com.qfedu.项目名称.test --> 存储的是测试文件 --> 项目开发完成必须删除
2.DAO包的作用:
在实际业务处理过程中,往往需要进行多次的数据库访问。这些访问的性质往往是相同的。采用Dao层可以对数据库访问进行封装,避免进行重复性的数据库访问开发操作。同时也降低了维护的成本。
例如:张三给李四转账3000元,那么需要进行的操作如下:
1.确认张三这个账户是否是存在的
2.确认李四这个账户是否是存在的
3.查询张三账户余额
4.查询李四账户余额
5.更新张三账户余额
6.更新李四账户余额
在这个例子中,就进行了多次的重复性的数据库访问,例如前两个操作,就是"select count (*) from account where name=?",这样会严重影响到开发效率。
(二).Service:
Service层的作用:
1.封装的具体业务实现方法,来提高业务复用性
2.负责将参与本次业务实现的Dao层中事务进行管理
不过其实有一个很有疑问的点就是Service层是不是可有可无,其实作为我个人观点来说的话,小型项目,业务逻辑不复杂的情况下,不用Service层其实并没有什么关系,毕竟Dao层实现了和数据库的交互,Controller层则实现了与前端的交互,这样已经基本打通了前后端,但是遇到大型项目的前提下,还是需要Service层去进行逻辑处理的,确实是需要分情况而言。
(三). Controller:
即控制器的作用。
(四).util:
util是utiliy的缩写,意为多用途的,工具性质的包。
这个包中主要存放了:集合类(如ArrayList,HashMap等),随机数产生类,属性文件读取类,定时器类等类。这些类极大方便了Java编程,日常java编程中,经常要用到这些类。
一个实例:数据库连接工具 DBUtil.java
就是一个工具类,定义了关闭资源与事务处理的方法
package com.bjsxt.util;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
/**
* JDBC的公共类
*
* @author Administrator
*
*/
public class DBUtil {
private static Connection conn = null;
private static PreparedStatement pstmt = null;
private static ResultSet rs=null;
/**
* 创建一个连接
* @return
*/
public static Connection getConnection() {
try {
/*Class.forName("oracle.jdbc.driver.OracleDriver");
// 获取连接
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:orcl", "bjsxt", "bjsxt");*/
Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
// 数据库连接池
conn = DriverManager.getConnection("proxool.test");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库资源
* @param rs
* @param stmt
* @param conn
*/
public static void closeAll() {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 执行insert、update、delete 三个DML操作
* @param sql
* @param prams
* @return
*/
public static int executeUpdate(String sql, Object[] prams) {
conn = getConnection();
int n = 0;
try {
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < prams.length; i++) {
pstmt.setObject(i + 1, prams[i]);
}
n = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return n;
}
/**
* 执行查询所返回的Resultset对象
**/
public static ResultSet executeQuery (String sql, Object[] prams) {
conn = getConnection();
try {
pstmt = conn.prepareStatement(sql);
for (int i = 0; i < prams.length; i++) {
pstmt.setObject(i + 1, prams[i]);
}
rs = pstmt.executeQuery();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return rs;
}
}