MVC框架自定义实现过程
作者:十二o 发布时间:2021-07-24 03:31:47
标签:MVC,框架
1、思维导图
2、什么是MVC?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 它是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
3、运行原理
用户发送请求 → 中央控制器接受用户请求 → 分析请求连接/获取到用户需要的类+方法 → 调用相对应的Model → 访问数据库服务器
4、演绎过程
4.1.控制层
BookServlet:
package com.tyf.web;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BookServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 增删改查缺陷:
* 当需求发送改变,或者新增需求的时候,需要改动下面代码
*
* 解决方案:
* 前台传递name到后台,实际就是想要调用当前(this)类对象的name方法
*/
String name = req.getParameter("name");
try {
Method m = this.getClass().getDeclaredMethod(name, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
m.invoke(this, req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*if ("add".equals(name)) {
add(req,resp);
}else if ("delete".equals(name)) {
delete(req,resp);
}else if ("edit".equals(name)) {
edit(req,resp);
}else if ("list".equals(name)) {
list(req,resp);
}else if ("load".equals(name)) {
load(req,resp);
}*/
}
}
DispatchServlet:
package com.tyf.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tyf.web.BookAction;
/**
*
* 目标:
* 根据自定义mvc框架的原理图 完成框架的研发
* @author Tang 中央控制器
* 寻找子控制器
*
* 2021年8月30日 下午6:49:35
*/
@WebServlet("*.action")
public class DispatchServlet extends HttpServlet {
//存放子控制器的容器
private Map<String , ActionSupport> actions = new HashMap<String , ActionSupport>();
//初始化子控制器容器(集合),经过初始化,action容器内部就有了子控制器
//init(初始化方法),service(服务),destroy(销毁)
@Override
public void init() throws ServletException {
actions.put("/book", new BookAction());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//完成子控制器对的过程
//浏览器:http://localhost:8080/J2ee12/book.action?name=add
//目标:BookAction.add()...
/**
* 思路:
* 1.从浏览器URL中获取到"/book"字符串
* 2.在子控制器中拿到BookAction
* 3.BookAction.add()
*/
String url = req.getRequestURI();
url = url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));
//action=BookAction
ActionSupport action = actions.get(url);
action.execute(req, resp);
}
}
4.2.模型层
ActionSupport:
package com.tyf.framework;
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ActionSupport implements Action {
@Override
public void execute(HttpServletRequest req, HttpServletResponse resp) {
String name = req.getParameter("name");
try {
Method m = this.getClass().getDeclaredMethod(name, HttpServletRequest.class,HttpServletResponse.class);
m.setAccessible(true);
m.invoke(this, req,resp);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
DispatchServlet:
package com.tyf.framework;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tyf.web.BookAction;
/**
*
* 目标:
* 根据自定义mvc框架的原理图 完成框架的研发
*
*
* @author Tang 中央控制器
* 寻找子控制器
*
* 2021年8月30日 下午6:49:35
*/
@WebServlet("*.action")
public class DispatchServlet extends HttpServlet {
//存放子控制器的容器
private Map<String , ActionSupport> actions = new HashMap<String , ActionSupport>();
//初始化子控制器容器(集合),经过初始化,action容器内部就有了子控制器
//init(初始化方法),service(服务),destroy(销毁)
@Override
public void init() throws ServletException {
actions.put("/book", new BookAction());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//完成子控制器对的过程
//浏览器:http://localhost:8080/J2ee12/book.action?name=add
//目标:BookAction.add()...
/**
* 思路:
* 1.从浏览器URL中获取到"/book"字符串
* 2.在子控制器中拿到BookAction
* 3.BookAction.add()
*/
String url = req.getRequestURI();
url = url.substring(url.lastIndexOf("/"), url.lastIndexOf("."));
//action=BookAction
ActionSupport action = actions.get(url);
action.execute(req, resp);
}
}
4.3视图层
<%@ 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>
目前多数人增删改查的代码:
<a href="${pageContext.request.contextPath}/book/add" rel="external nofollow" >增加</a>
<a href="${pageContext.request.contextPath}/book/delete" rel="external nofollow" >删除</a>
<a href="${pageContext.request.contextPath}/book/edit" rel="external nofollow" >修改</a>
<a href="${pageContext.request.contextPath}/book/list" rel="external nofollow" >查询</a>
<hr>
增删改查的代码2.0
<a href="${pageContext.request.contextPath}/book.action?name=add" rel="external nofollow" >增加</a>
<a href="${pageContext.request.contextPath}/book.action?name=delete" rel="external nofollow" >删除</a>
<a href="${pageContext.request.contextPath}/book.action?name=edit" rel="external nofollow" >修改</a>
<a href="${pageContext.request.contextPath}/book.action?name=list" rel="external nofollow" >查询</a>
<hr>
增删改查的代码3.0
<a href="${pageContext.request.contextPath}/book.action?name=load" rel="external nofollow" >回显</a>
<a href="${pageContext.request.contextPath}/book.action?name=ref" rel="external nofollow" >关联</a>
</body>
</html>
5、运行结果
来源:https://blog.csdn.net/m0_54525420/article/details/120003916


猜你喜欢
- 接收从控制台输入的数据可以使用Scanner类实现,Scanner类在一个名为util的包中需要在程序中导入这个包, 即在程序中添加impo
- 前言事务对java开发的同学来说并不陌生,我们使用事务的目的在于避免产生重复数据或者说利用数据存储中间件的事务特性确保数据的精准性,比如大家
- 1)在我们的项目中添加引用文件:TaskSchedulerEngine.dll(dll定义了一个ITask接口,定义了两个方法Initial
- 标准函数with与run和apply with函数with函数接收两个参数:第一个参数可以是任意类型的对象,第二个参数是一个Lambda表达
- 最大堆最大堆的特点是父元素比子元素大,并且是一棵完全二叉树。data[1]开始存,data[0]空着不用。也可以把data[0]当成size
- 1 读取操作系统和CLR的版本OperatingSystem os = System.Environment.OSVersion; Cons
- Spring Boot怎么实现热部署在Spring Boot实现代码热部署是一件很简单的事情,代码的修改可以自动部署并重新热启动项目。1、引
- 现在,让我们找出“如何学习 Java 编程”的答案。通过承认您是初学者这一事实开始您的学习之旅很重要
- 在popupWindow里面再弹出popupWindow的时候会报这样的错误ERROR/AndroidRuntime(888): andro
- @FeignClient()注解的使用由于SpringCloud采用分布式微服务架构,难免在各个子模块下存在模块方法互相调用的情况。比如se
- 简介说明本文用实例介绍stream的使用。JDK8新增了Stream(流操作) 处理集合的数据,可执行查找、过滤和映射数据等操作。使用Str
- 若使用 Spring IoC 容器(ApplicationContext或BeanFactory)作为你的业务对象(你也应该这么做!),你会
- 详解Java虚拟机管理的内存运行时数据区域概述 Java虚拟机在执行Java程序的过程中会把它所管理的内
- 这篇文章主要介绍了SpringBoot下如何实现支付宝接口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- java如何实现ftp上传?如何创建文件夹?最佳答案:准备条件:java实现ftp上传用到了commons-net-3.3.jar包首先建立
- 相同点:1. ref 和 out 都是按地址传递的,使用后都将改变原来参数的数值;2. 方法定义和调用方法都必须显式使用 ref 或者 ou
- 在Word插入分页符可以在指定段落后插入,也可以在特定文本位置处插入。本文,将以Java代码来操作以上两种文档分页需求。下面是详细方法及步骤
- 一、使用方法查找DLL文件,通过Reflection反射类库里的各种方法来操作dll文件二、步骤加载DLL文件Assembly assemb
- 在项目中,时常会有异步调用的需求web.xml配置<servlet> <description>spri
- 导读导读 | 12月总体来说互联网的技术圈是非常热闹的,chatGPT爆火,SpringBoot3.0发布等重磅陆消息续进入大家的视线,而本