A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 起个什么名字好 初级黑马   /  2017-12-4 14:52  /  2076 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 起个什么名字好 于 2017-12-4 16:19 编辑
MVC架构模式详解

MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。不同的技术人员可以通过自身的专长分组

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
(控制器Controller- 负责转发请求,对请求进行处理。
(视图View - 界面设计人员进行图形界面设计。
(模型Model - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。Model层一般又细分为
业务层(Service层)和数据访问对象层(Dao层)
MVC架构模式的示意图:

      


首先是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.有利于软件工程化管理




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马