首先是View视图层:作为视图来说,它并不去真正的处理逻辑或者获取数据,也不关心逻辑如何处理,数据从何而来,它的任务就是将数据展现给用户,然后从用户处获取到想要提交给服务器的数据。也就是用户交互的部分。
然后是Controller控制层:作为控制层,它也不是执行逻辑的地方,但是它能接收从视图层从用户那获取的相关参数或者数据,然后分配给模型层的具体类去执行相关的操作,就像一个部门经理,也许他并不知道如何去做一件事情,但是他肯定知道谁最适合做这件事情并分配任务下去(这是非常重要的一个能力!)。所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。
最后是Model模型层:作为模型层,它会按照控制层分配的任务执行业务逻辑,如果涉及到数据库的使用,也会进行数据的存储、获取或修改。而且,它会向控制层返回执行的结果,然后由控制层把结果转给视图层去展示。
下面展示使用MVC模式开发的工程的代码:
首先要强调的是使用MVC模式是最好进行分包管理,并对每一层进行接口约束,然后使用实现类XXXXImple去书写各层代码
接口:UserController
[Java] 纯文本查看 复制代码
package com.itheima.user.controller;
import com.itheima.user.domain.User;
/*
* Controller控制层的约束接口
* 约束登录的方法名 login()
*/
public interface UserController {
//登录
public abstract boolean login(User user);
}
UserControllerImple实现类
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.controllerImpl;
import com.itheima.user.controller.UserController;
import com.itheima.user.domain.User;
import com.itheima.user.serviceImpl.UserServiceImpl;
public class UserControllerImpl implements UserController{
//创建业务层对象
private UserServiceImpl userService = new UserServiceImpl();
@Override
public boolean login(User user) {
//继续将user对象传递给Service业务层
boolean flag = userService.login(user);
//将接收到的结果返回给上一层View层
return flag;
}
}
UserDao
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.dao;
import com.itheima.user.domain.User;
/*
* Dao层约束接口
* 用于约束Dao层的登录方法 login()
*/
public interface UserDao {
//登录
public abstract boolean login(User user);
}
UserDaoImple
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.daoImpl;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ArrayHandler;
import com.itheima.user.dao.UserDao;
import com.itheima.user.domain.User;
import com.itheima.user.utils.JDBCUtils;
public class UserDaoImpl implements UserDao{
//创建QueryRunner对象
private QueryRunner qr = new QueryRunner(JDBCUtils.getDataSource());
@Override
public boolean login(User user) {
try {
//拼写sql语句
String sql = "SELECT * FROM users WHERE username=? AND password=?";
Object[] params = {user.getUsername(),user.getPassword()};
//执行sql语句
Object[] result = qr.query(sql, new ArrayHandler(), params);
//对数组长度做判断
if(result.length == 0) {
return false;
}else {
return true;
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("查询数据表失败");
}
}
}
JavaBean
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.domain;
//JavaBean对象,也就是实体类,可以叫model,entry,domain。主要是封装数据
public class User {
private int uid;
private String username;
private String password;
public User() {
super();
}
public User(int uid, String username, String password) {
super();
this.uid = uid;
this.username = username;
this.password = password;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
UserService:
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.service;
import com.itheima.user.domain.User;
/*
* Service业务层接口
* 用于约束业务层的登录方法 login()
*/
public interface UserService {
//登录
public abstract boolean login(User user);
}
UserServiceImple
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.serviceImpl;
import com.itheima.user.daoImpl.UserDaoImpl;
import com.itheima.user.domain.User;
import com.itheima.user.service.UserService;
public class UserServiceImpl implements UserService{
//创建Dao层对象
UserDaoImpl userDao = new UserDaoImpl();
@Override
public boolean login(User user) {
//将user对象继续传递给Dao层
boolean flag = userDao.login(user);
//将结果返回给上一层控制层
return flag;
}
}
JDBCUtils:
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.serviceImpl;
import com.itheima.user.daoImpl.UserDaoImpl;
import com.itheima.user.domain.User;
import com.itheima.user.service.UserService;
public class UserServiceImpl implements UserService{
//创建Dao层对象
UserDaoImpl userDao = new UserDaoImpl();
@Override
public boolean login(User user) {
//将user对象继续传递给Dao层
boolean flag = userDao.login(user);
//将结果返回给上一层控制层
return flag;
}
}
View层:
[AppleScript] 纯文本查看 复制代码
package com.itheima.user.view;
import java.util.Scanner;
import com.itheima.user.controllerImpl.UserControllerImpl;
import com.itheima.user.domain.User;
/*
* View层
* 显示信息
* 接收用户的数据
*/
public class UserView {
//创建控制层对象
private static UserControllerImpl userController = new UserControllerImpl();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//将用户名和密码封装成一个User对象
User user = new User(0, username, password);
//调用Controller控制层方法login()方法,将user对象进行传递
boolean flag = userController.login(user);
//如果flag是true,登录成功
if(flag) {
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
}
}
databaseproperties配置文件
[AppleScript] 纯文本查看 复制代码
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/itheima
username=root
password=root
initialSize=10
maxActive=10
maxIdle=5
minIdle=2
那么MVC的架构模式到底有什么好处呢?
1.低耦合性
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。
2.高重用性和可适用性
随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何 WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是 一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这 些表示所需要的命令是改变视图层的实现方式,而控制层和模型层无需做任何改变。
3.较低的生命周期成本
MVC使开发和维护用户接口的技术含量降低。
4.快速的部署
使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
5.可维护性
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
6.有利于软件工程化管理