MVC原理及案例分析

关于MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。


以简单的登录功能为案例,简单分析MVC的具体实现

项目执行的流程


项目文件中各个层次的作用

具体代码实现:

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录</title>
</head>
<body><form action="LoginServlet" method="post">用户名:<input type="text" name="uname"><br/>密码:&nbsp;&nbsp;&nbsp;<input type="password" name="upwd"><br/><input type="submit" value="登录"></form>
</body>
</html>

Welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>登陆成功!!
</body>
</html>

LoginServlet.java

package org.zxm.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.zxm.Dao.LoginDao;
import org.zxm.entity.Login;//控制器层,用于接收view层的请求,并分发给Model处理
public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//post请求方式设置编码request.setCharacterEncoding("UTF-8");//接受用户名和密码String name = request.getParameter("uname");String pwd = request.getParameter("upwd");//封装Login login = new Login(name,pwd);//将用户名和密码传递到登录功能里面(LoginDao)//调用模型层的登录功能int result = LoginDao.login(login);if(result > 0) {//重定向response.sendRedirect("Welcome.jsp");}else {response.sendRedirect("login.jsp");}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

LoginDao.java

/*** */
package org.zxm.Dao;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import org.zxm.entity.Login;/*** @author 11441*模型层,用于处理登录(查询数据库)*/
public class LoginDao {//用于登录的login方法//在方法参数中传入login类型public static int login(Login login) {//登录成功与否的标识//boolean flag = false;int flag = -1;  //-1系统异常 0:用户名或密码有误 1:登陆成功int result = -1;Connection connection = null;PreparedStatement prepareStatement = null;ResultSet rs = null;try {//加载驱动Class.forName("com.mysql.jdbc.Driver");//获取连接connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1", "root", "root");//访问数据库String sql = "select count(*) from login where username = ? and pwd = ?";prepareStatement = connection.prepareStatement(sql);prepareStatement.setString(1, login.getUsername());prepareStatement.setString(2, login.getPwd());rs = prepareStatement.executeQuery();if(rs.next()) {result = rs.getInt(1);}if(result  > 0) {//登陆成功return 1;}else {//登陆失败,用户名或密码有误return 0;}} catch (ClassNotFoundException e) {e.printStackTrace();//登陆失败,系统异常return -1;} catch (SQLException e) {e.printStackTrace();//登陆失败,系统异常return -1;} catch (Exception e) {e.printStackTrace();//登陆失败,系统异常return -1;}finally {try {if(rs != null) rs.close();if(prepareStatement != null)  prepareStatement.close();if(connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}   }
}

Login.java

/*** */
package org.zxm.entity;/*** @author 11441**/
public class Login {private int id;private String username;private String pwd;public Login(String username, String pwd) {this.username = username;this.pwd = pwd;}public Login() {}public Login(int id, String username, String pwd) {this.id = id;this.username = username;this.pwd = pwd;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;}
}

总结:

MVC模式的优点:

  1. 按照M:Model V:View C:Controller进行分层,有利于代码的维护,提高了代码重用率,更好的实现开发中的分工
  2. 有益于后期代码的维护,降低了成本

MVC模式的缺点:

  1. 增加了复杂性
  2. 运行效率降低

MVC原理及案例分析相关推荐

  1. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

  2. 《大型网站技术架构:核心原理与案例分析》笔记05

    <大型网站技术架构:核心原理与案例分析>笔记05 网站的课扩展性架构: 扩展性:指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力.表现在系统基础设施稳定不需要经常变更,应用之间 ...

  3. 一文讲透大型网站架构模式核心原理与案例分析

    什么是模式?每一个模式描述了一个在我们周围不断发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复的工作. 也许互联网产品不是随便复制就能成功的,创新的产品更能为用户创造价 ...

  4. 阅读《大型网站技术架构:核心原理与案例分析》第五、六、七章

    阅读<大型网站技术架构:核心原理与案例分析>第五.六.七章,结合我们的系统,分析如何增加相应的功能,提高系统的可用性和易用性. 这三章主要讲述的是网站的可用性.伸缩性和可扩展性. 高可用架 ...

  5. 读书笔记:大型网站技术架构-核心原理与案例分析

    李智慧<大型网站技术架构-核心原理与案例分析> 性能 可用性 伸缩性 扩展性 安全性 总结 这本书组织的很不错,语言精练,篇幅也不长,对网站架构的要点讲的狠清楚透彻,思路清晰.主要围绕架构 ...

  6. 图解通信原理与案例分析-26: 5G NR是如何支持海量机器类通信mMTC的?移动通信对物联网的支持

    前言: 移动通信最初是解决人与人之间的语音通信,后来发展成了人与人之间的文本通信, 到了4G LTE,已经很好的解决了人与人之间的视频通信. 到了5G,人与人之间的高速率的数据通信在LTE的基础之上得 ...

  7. 读书笔记之 大型网站技术架构(核心原理与案例分析)

    前言 坚持看了十几天的书,终于完成了毕业后第一次静下心来,利用业务时间看书并做笔记的成就了.废话不多说,这回看的是一直很膜拜的李智慧大神写的大型网站技术架构-核心原理与案例分析. 简短的读后感 极其推 ...

  8. 分布式计算,大型网站技术架构:核心原理与案例分析

    这个回答,非常详细. 但是,大部分内容,都来自"大型网站技术架构:核心原理与案例分析". 最近,初步看了这本书,觉得写得太好了,比较系统和全面. 不过,我还是不喜欢吹B" ...

  9. 图解通信原理与案例分析-35:以太网MAC层的通信原理--MAC帧格式与调度策略:载波侦听与冲突检测CSMA/CD、载波侦听与冲突避免(信道空闲保证)CSMA/CA、流控

    以太网协议已经是非常成熟的通信技术,本文旨在在汇总以太网MAC层的协议,以便于与其他通信技术的MAC层作为比较,如4G LTE, 5G NR,特别是LTE在非授权频谱上的通信LAA LBT, 就是借鉴 ...

最新文章

  1. 分布式概念-分布式系统是什么?
  2. angular5 ng-content使用方法
  3. 初识MongoDB(四)
  4. 计算机专业本科开题报告,计算机本科毕业论文开题报告
  5. camera(19)---camera 客观测试 Imatest教程
  6. python进阶13并发之九多进程和数据共享
  7. Linux查看占用mem的进程脚本
  8. linux shell 随机字符生成单词
  9. 味美多网址导航php,味多美网址导航源码程序按来路自动显示 2010.0329
  10. linux网络Netfilter与iptables技术
  11. mysql mpm_部署zabbix监控mysql (三) MPM插件介绍和部署
  12. Chrome浏览器升级后提示崩溃
  13. 计算机word打开,电脑word打不开怎么办
  14. 【中亦安图】清算/报表/日终跑批程序之性能优化案例(5)
  15. springboot学习(七十三) springboot中使用springdoc替换swagger(springfox)
  16. 域名故事:史上超贵的域名成交记录
  17. Python解压缩ZIP格式
  18. AE C# 图片和文本标注(通过查询)
  19. 技巧:win10的另一种美化字体的方式,使用noMeiryoUI
  20. 各种json工具包的比较:

热门文章

  1. 剑指Offer - 面试题15. 二进制中1的个数(位运算)
  2. php实现文字向左跑马灯,js实现文字跑马灯效果
  3. lisp 中望cad 选项卡_这些高效插件,学CAD的基本用过两种以上
  4. 天玑720支持鸿蒙系统吗,天玑720属于骁龙多少 天玑720处理器相当于骁龙几
  5. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)
  6. Calibration: 一个工业价值极大,学术界却鲜有研究的问题!
  7. 阿里P8架构师谈:Dubbo的详细介绍、设计思路、以及4大适用场景
  8. 论文浅尝 | 基于复杂查询图编码的知识库问答
  9. Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放
  10. 随笔-机器如何学习我们的知识?