MVC分层开发模式

MVC

  • 1. 什么是mvc开发模式
  • 2. 基于servlet手写mvc框架

1. 什么是mvc开发模式

  • mvc不是一种技术,只是一种开发模式
  • 使用分层开发模式能在大型项目中,让开发人员更好的协同工作
  • 便于项目的维护和扩展
    1. M: Model 模型层->数据库层->dao
    2. V: View 视图层->收集和展示用户数据->html/jsp
    3. C: Controller->数据封装->逻辑处理->流程控制->servlet/action/controller

2. 基于servlet手写mvc框架

  • 什么是框架?

是一种标准或者规范,使用别人写好的东西,按照他的制造好的轮子,他的流程,去开发我想要实现的功能,提高开发效率,降低开发成本。

  • 框架的分类,分为前后端框架
  1. 前端框架分为功能性的和美观性的
  2. 功能性的:
    jQuery,vue,angular 判断数据合法性,dom操作
  3. 美观性的:
    bootstrap,easyui,react,qucikui…
  • 什么是mvc框架

mvc是后端框架,专门用来解决controller与view层数据交互的问题,对这个交互过程中的各种操作进行规范和封装,让开发人员在开发web应用程序时对请求响应的控制更为方便(数据层的访问不属于mvc框架内)

  • mvc框架的职责
  1. 规范开发流程
  2. 对请求数据进行封装(如页面有100个表单 多个表单)
  3. 流程跳转的规范 (是转发,重定向,还是js跳转)
  • 工作流程图

  • ActionServlet好比一个大哥 (mvc框架的核心功能),大哥接收到老板的任务(接收到业务请求时),安排小弟(服务对象,实现业务的类)来完成任务,小弟最后执行任务(完成逻辑处理),把结果返回大哥,最后结果返回(流程控制)老板(客户端)。

  • 基于servlet的mvc框架核心成员

    1. ActionServlet servlet 接收特定的请求,mvc框架的入口
    2. Action接口service方法,规范所有小弟的服务方法
    3. 小弟xxxAction实现接口,完成逻辑处理,为客户端提供服务
    4. .properties键值对配置文件,描述业务请求与xxxAction类的路径 (反射根据业务请求,取到配置文件的服务类)
    5. 可封装response流,输出js代码跳转
  • 核心控制器ActionServlet

  1. 配置文件
  <servlet><servlet-name>ActionServlet</servlet-name><servlet-class>com.lovely.mvc.ActionServlet</servlet-class></servlet><servlet-mapping><servlet-name>ActionServlet</servlet-name><url-pattern>*.do</url-pattern> <!-- 如接收query.do 的业务请求--></servlet-mapping>
  1. action接口,规范服务类
package com.lovely.mvc;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public interface Action {// service服务方法接口,返回要跳转的页面urlpublic String service(HttpServletRequest req, HttpServletResponse resp);}
  1. 创建配置文件(核心控制器根据业务请求,跳到对应的服务类完成业务)

  2. 控制器代码

package com.lovely.mvc;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class ActionServlet extends HttpServlet {/*** 核心控制servlet* 根据访问方式 和 类的路径信息 到对应的servlet来处理*/private static final long serialVersionUID = 1L;private Properties property = null;@Overridepublic void init() throws ServletException {property = new Properties();// 加载配置文件InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/config.properties");try {property.load(in);} catch (IOException e) {e.printStackTrace();} finally {try {if (in != null)in.close();} catch (IOException e) {e.printStackTrace();}}}@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {String uri = req.getRequestURI();String key = uri.substring(uri.lastIndexOf("/") + 1, uri.lastIndexOf("."));System.out.println(uri + "\t" + key);// 根据请求对象 拿到对应的类 进行服务String value = property.get(key).toString();try {// 反射拿到类对象Class<?> c = Class.forName(value);// 创建action对象Action action = (Action) c.newInstance();String result = action.service(req, resp);if (result != null) {// 根据返回结果 决定是请求转发 还是重定向if (result.startsWith("forward")) {String path = result.split(":")[1];req.getRequestDispatcher(path).forward(req, resp);} else if (result.startsWith("redirect")) {String path = result.split(":")[1];resp.sendRedirect(req.getContextPath() + path);} else {// 写路径默认请求转发req.getRequestDispatcher(result).forward(req, resp);}				}} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}
  1. 提供服务对象类(以查询为例)
package com.lovely.action;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.lovely.dao.CommonDao;
import com.lovely.entity.Ticket;
import com.lovely.mvc.Action;public class QueryAction implements Action {@Overridepublic String service(HttpServletRequest req, HttpServletResponse resp) {CommonDao dao = new CommonDao();req.setAttribute("list", dao.queryAll(Ticket.class));// 返回转发的地址return "/list.jsp";}}
  • 以上就算一个基于servlet实现的mvc框架了,别人已经有更牛的框架,这里只是拿来分析。
  • 上面的代码,离不开数据库操作,请看
    反射和注解对dao层操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#_uploadify_mvc_version

jQuery Uploadify在ASP.NET MVC3中的使用 1、Uploadify简介 Uploadify是基于jQuery的一种上传插件&#xff0c;支持多文件、带进度条显示上传&#xff0c;在项目开发中常被使用。 Uploadify官方网址&#xff1a;http://www.uploadify.com/ 2、ASP.NET MVC3中的使用Uploadify 搭…

1010 一元多项式求导 (25分)

输入样例: 3 4 -5 2 6 1 -2 0 输出样例: 12 3 -10 1 6 0 # -*- coding: utf-8 -*-def get_derivation(lst):length len(lst)idx 0while idx < length:if lst[idx 1] ! 0:lst[idx] * lst[idx 1]lst[idx 1] - 1else:lst[idx] 0idx 2return lstif __name__ __main__…

VS2012 发布网站步骤

VS2012中发布网站的方式与以往有了不同&#xff0c;前面的版本发布如图 而2012点publish的时候弹出框有所不同&#xff0c;这边需要新建一个profile名字随便起&#xff0c;发布的方式有好几种&#xff0c; 当然不同的方式配置不同&#xff0c;用的最多的就是files system了 选择…

python 生成个性二维码

1. 效果 gif 图片二维码 带背景图二维码&#xff08;修改了&#xff09; 2. 依赖库 核心库myqr pip install myqr其它依赖库安装pip install pip install pillow, numpy, imageio3. 核心代码 我这里是F盘下的joy文件夹下面代码改变路径&#xff0c;图片名称参数即可 im…

1011 A+B 和 C (15分)

输入样例&#xff1a; 4 1 2 3 2 3 4 2147483647 0 2147483646 0 -2147483648 -2147483647 输出样例&#xff1a; Case #1: false Case #2: true Case #3: true Case #4: false # -*- coding: utf-8 -*-if __name__ __main__:n eval(input())input_list []for i in range…

SharePoint 2013:解决添加域名后每次都需要登录的问题

在SharePoint 2013中&#xff0c;当我们添加一个域名给SP后&#xff08;添加域名的方法请参考此文&#xff1a;http://www.cnblogs.com/jianyus/archive/2013/08/10/3249461.html &#xff09;&#xff0c;每次用域名访问都需要输入用户名和密码&#xff0c;即使该用户已经正确…

1012 数字分类 (20分)

输入样例 1&#xff1a; 13 1 2 3 4 5 6 7 8 9 10 20 16 18 输出样例 1&#xff1a; 30 11 2 9.7 9 输入样例 2&#xff1a; 8 1 2 4 5 6 7 9 16 输出样例 2&#xff1a; N 11 2 N 9 # -*- coding: utf-8 -*-def class_numbers(nums):arr [0] * 5exists [0] * 5flag1 1…

mvc框架upgrade

upgrade...1. actionservlet核心控制器更改以上1&#xff0c;2点2. 工具类&#xff08;对反射拿到的属性对象数据转型&#xff09;3. 业务服务类使用适配器设计模式针对上一篇文字做出了改造&#xff0c;既然要写手写lowb版mvc框架&#xff0c;就得付出一定代价&#xff0c;加大…

1013 数素数 (20分)

输入样例&#xff1a; 5 27 输出样例&#xff1a; 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 # -*- encoding: utf-8 -*- import mathdef get_primes(n):prime_list [1] * (n 1)for i in range(2, int(math.sqrt(n)) 1):if prime_list[i]…

1014 福尔摩斯的约会 (20分)

输入样例&#xff1a; 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm 输出样例&#xff1a; THU 14:04 # -*- coding: utf-8 -*- import stringweek {A: MON,B: TUE,C: WED,D: THU,E: FRI,F: SAT,G: SUN}hour {0:00, 1:01, 2:02, 3:03, 4:04, 5:05, 6:0…

MSSQL如何在没有主键的表中删除重复数据

MSSQL如何在没有主键的表中删除重复数据 原文:MSSQL如何在没有主键的表中删除重复数据为了对重复数据进行实验&#xff0c;下面建一个设计不太好&#xff08;没有主键&#xff09;表并插入了一些重复数据&#xff1a; create database testdbuse testdb ; go create table Dups…

1015 德才论 (25分)

输入样例&#xff1a; 14 60 80 10000001 64 90 10000002 90 60 10000011 85 80 10000003 85 80 10000004 80 85 10000005 82 77 10000006 83 76 10000007 90 78 10000008 75 79 10000009 59 90 10000010 88 45 10000012 80 100 10000013 90 99 10000014 66 60 输出样例&#…

1016 部分A+B (15分)

输入样例 1&#xff1a; 3862767 6 13530293 3 输出样例 1&#xff1a; 399 输入样例 2&#xff1a; 3862767 1 13530293 8 输出样例 2&#xff1a; 0 # -*- coding: utf-8 -*-if __name__ __main__:input_list input().split()a, d_a, b, d_b input_list[0], input_li…

马哥学习笔记二十七——IO复用

I/O动作模式  阻塞 非阻塞 I/O复用 信号驱动 异步 转载于:https://www.cnblogs.com/wangyongbin/p/3817353.html

1017 A除以B (20分)

输入样例&#xff1a; 123456789050987654321 7 输出样例&#xff1a; 17636684150141093474 3 # -*- coding: utf-8 -*- import redef big_division(a, b):q_list, r [], 0len_a len(a)for i in range(0, len_a):dividend 10 * r eval(a[i])q_list.append(dividend // …

Idea创建web项目,配置tomcat服务器

使用idea创建web项目 新下载的idea&#xff0c;需要启用插件&#xff0c;才可创建web项目 启用Java ee&#xff0c;servlet有web项目选项 创建项目 选好jdk&#xff0c;要配置好jdk环境变量https://blog.csdn.net/crossing2012/article/details/81292547 选路径 to…

CSS 最核心的几个概念

本文将讲述 CSS 中最核心的几个概念&#xff0c;包含&#xff1a;盒模型、position、float等。这些是 CSS 的基础&#xff0c;也是最经常使用的几个属性&#xff0c;它们之间看似独立却又相辅相成。为了掌握它们&#xff0c;有必要写出来探讨一下&#xff0c;如有错误欢迎指正。…