基于前后端实现第一阶段的一个MVC框架

Unity框架——MVC框架 前言——什么是MVC框架MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面 显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于 映射传统的输入、处理和输出功能在一个逻辑的图形化用... 阅读详情

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>com.Express.mvc.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contentConfigLocation</param-name>
            <param-value>application.properties</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>
<%--
  Created by IntelliJ IDEA.
  User: ly
  Date: 2021/2/3
  Time: 13:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$
  </body>
</html>

<%--
  Created by IntelliJ IDEA.
  User: ly
  Date: 2021/2/3
  Time: 11:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>注册成功<></h1>
</body>
</html>

package com.Expres.test;

import com.Express.mvc.ResponseBody;
import com.Express.mvc.ResponseView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UserController {
    @ResponseBody("/login.do")
    public String login(HttpServletRequest request, HttpServletResponse response){
        return  "success login";
    }
    @ResponseView("/reg.do")
    public  String reg(HttpServletRequest request, HttpServletResponse response){
        return "success.jsp";
    }
}

package com.Express.mvc;

import javax.servlet.ServletConfig;
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 java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


@WebServlet(name = "DispatcherServlet")
public class DispatcherServlet extends javax.servlet.http.HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        String path= config.getInitParameter("contentConfigLocation");
       InputStream is=DispatcherServlet.class.getClassLoader().getResourceAsStream(path);
       HandlerMapping.load(is);
        //通过反射获取注解
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 获取用户请求的URI
        String uri = req.getRequestURI();
        HandlerMapping.MVCMapping mapping = HandlerMapping.get(uri);
        if (mapping==null)
        {
            resp.sendError(404,"您的MVC请求地址有误"+uri);
            return;
        }
        Object obj = mapping.getObj();
        Method method = mapping.getMethod();
        Object result=null;
        try {
            result = method.invoke(obj, req, resp);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        switch (mapping.getType()){
            case TEXT:
                resp.getWriter().write((String)result);
                break;
            case VIEW:
                resp.sendRedirect((String)result);
                break;
        }

    }
}

package com.Express.mvc;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 映射器(包含大量网址与方法的对应关系)
 */
public class HandlerMapping {
    private  static Map<String,MVCMapping> data= new HashMap<>();
    //从装有一大堆集合的方法里面获取网址所对应的方法
    public static MVCMapping get(String uri){
        return  data.get(uri);
    }
    //加载配置文件的方法
    public  static  void load(InputStream is){
        Properties ppt =new Properties();
        try {
            ppt.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取配置文件中的一个个类
        Collection<Object> values = ppt.values();
        for (Object cla:values) {
            String className=(String) cla;
            Class c= null;
            try {
                //加载配置文件中描述的每一个类
                c = Class.forName(className);
                //创建这个类的对象
                Object obj =c.getConstructor().newInstance();
                //获取这个类的所有方法
                Method [] methods=c.getMethods();
                for (Method m:methods
                     ) {
                    Annotation [] as=m.getAnnotations();
                    if(as!=null)
                    {
                        for (Annotation anno:as
                             ) {
                            if (anno instanceof ResponseBody){
                                //此方法是用于返回字符串给客户端
                                MVCMapping map=new MVCMapping(obj,m,ResponseType.TEXT);
                                //没有处理重复的情况
                                //data.put(((ResponseBody) anno).value(), map);
                               //处理重复的情况
                                Object o=data.put(((ResponseBody) anno).value(), map);
                                if (o!=null){
                                    //存在了重复的 请求地址
                                    throw new RuntimeException("请求地址重复"+((ResponseBody) anno).value());
                                }
                            }
                            else if (anno instanceof ResponseView){
                                //此方法适用于返回界面给客户端
                                MVCMapping map=new MVCMapping(obj,m,ResponseType.VIEW);
                                Object o=  data.put(((ResponseView) anno).value(), map);
                                if (o!=null){
                                    //存在了重复的 请求地址
                                    throw new RuntimeException("请求地址重复"+((ResponseView) anno).value());
                                }
                            }
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
    /**
     * 映射对象,每一个对象封装了一个方法用于处理请求
     */
    public static class MVCMapping{
        private Object obj;
        private Method method;
        private  ResponseType type;

        public MVCMapping(Object obj, Method method, ResponseType type) {
            this.obj = obj;
            this.method = method;
            this.type = type;
        }

        public MVCMapping() {
        }

        public Object getObj() {
            return obj;
        }

        public void setObj(Object obj) {
            this.obj = obj;
        }

        public Method getMethod() {
            return method;
        }

        public void setMethod(Method method) {
            this.method = method;
        }

        public ResponseType getType() {
            return type;
        }

        public void setType(ResponseType type) {
            this.type = type;
        }
    }
}

package com.Express.mvc;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
/**
 * 被此注解添加的方法会被用于处理请求
 * 方法返回的内容会以文字形式返回到客户端
 */
public @interface ResponseBody {
    String value();
}

package com.Express.mvc;

public enum ResponseType {
    TEXT,VIEW;
}

package com.Express.mvc;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
/**
 * 被此注解添加的方法会被用于处理请求
 * 方法返回的内容会直接重定向
 */
public @interface ResponseView {
    String value();
}

配置文件

#配置每一个用于处理请求的类每一个类中包含可能用到的n个方法
a=com.Expres.test.UserController
猿学~从MVC到前后端分离  1. 理解MVC   MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器。   其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的Java Bean,包含一系列的成员变量及其getter/setter方法。对于视图而言,它更加偏重于展现,... 阅读详情

相关推荐

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

“前后端交互”之SpringMvc环境搭建

SpringMvc是由Spring官方提供的基于mvc设计理念的web框架(其功能相当于Servlet)SpringMvc是基于Servlet封装的用于实现mvc控制的框架,实现mvc控制的框架,实现了前端和服务器的交互 目录 一、前后端交互大致流程 二、SpringMvc相较于Servlet的优势 三、SpringMvc的本质工作是什么 ? 四、SpringMvc框架的部署: 4.1 创建基于maven的web工程 4.2 添加SpringMvc的项目依赖 4.3 配...

WuHuaSen的博客 1434

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.youkuaiyun.com/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2845

springBoot单元测试-模拟MVC测试

1)模拟mvc测试,和基础测试是一样的, 都需要在pom文件中引入junit的支持。   略  2)编写测试类 Application1TestMVC   在类头上除啦加入之前的@RunWith(SpringRunner.class)、@RunWith(SpringRunner.class) 之外还要加入新的注解  @AutoConfigureMockMvc // 注入MockMvc (...

weixin_34297300的博客 142

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程

本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。

k9l0m1的博客 481

report_delay_calculation/check_timing/report_annotated_parasitics/report_analysis_coverge

如何debug 一颗cell 或一段net 的delay, 常用的办法是用report_delay_calculation 报这颗cell 或这段net, 会得到形式如下的report, 从该report 中可以得到: 表头需要特别关注的是command, 确定report 的对象及加的option; From/To pin: cell 的input pin 和...

diedai7174的博客 1797

springmvc使用put,delete方法传参问题,以及使用@PutMapping注解和@DeleteMapping注解

首先我们要知道@PutMapping,@DeleteMapping的作用: @PutMapping:“对应修改操作,表明是一个修改URL映射”。 @DeleteMapping:“对应删除,表明是一个删除URL映射” 使用ajax的put提交方式 $.ajax({ url:"http://127.0.0.1/typeList", type:"PUT", data:data, success:function (result) { }

qq_54223170的博客 9169

YOLO26-seg分割优化:FPN涨点&轻量化篇 |多级特征融合金字塔(HS-FPN),助力小目标检测

​​​​​摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 280

PHP实现简易的MVC框架

实现MVC框架没有固定的实现方法,根据框架特色和语言特点以及自己的需求进行实现即可。

光头强的博客 7139

图像做旧算法原理及代码解释

该图像做旧算法主要通过一系列的图像处理操作来模拟旧照片的效果。整体流程包括:首先对输入图像进行颜色调整,降低饱和度并增加黄色调以营造出旧照片的色彩风格;接着添加高斯噪声来模拟旧照片可能存在的颗粒感;最后通过在图像上随机绘制线条来模拟旧照片的划痕和瑕疵。综上所述,该图像做旧算法通过对颜色的调整(包括饱和度降低、色相偏移)、添加高斯噪声以及模拟划痕和瑕疵等一系列操作,从多个方面模拟了旧照片的特征。

m0_44975814的博客 901

大模型安全-生成检测-事实核查-攻击-防御-思考-记忆-融合-语音相关研究 2025年版

本文整理了关于大模型安全领域的综合性资源,包括7篇综述论文、9个安全数据集以及5篇强化学习相关的安全研究论文。主要涉及大模型的对抗攻击、隐私保护、安全评估等方向,涵盖TruthfulQA、ToxiGen等知名数据集和TrustLLM、HarmBench等关键研究。资源包括知乎博主分享、arXiv预印本和顶会论文,并附有详细的中文讲解链接,为研究者提供了系统性的安全研究参考。

CSPhD-winston的博客 3575

从 MVC 到前后端分离

从 MVC 到前后端分离 1 理解 MVC MVC 是一种经典的设计模式,全名为 Model-View-Controller,即 模型-视图-控制器。 其中,模型 是用于封装数据的载体,例如,在 Java 中一般通过一个简单的 POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的 Java Bean,包含一系列的成员变量及其 getter/setter

z69183787的专栏 1397

第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

🥏第3版•系统集成项目管理工程师(中级) │ 告别迷茫!案例分析高分攻略

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3867

迷不迷糊?前后端、三层架构和MVC傻傻分不清

把三层架构、MVC、前后端分类,言简意赅的讲个明明白白,清清楚楚。

luohaitao的专栏 9005

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

从MVC到前后端分离(Rest框架搭建)_mvc rest框架

可见,请求路径相同,但请求方式不同,所代表的业务操作也不同,例如,/advertiser/1 这个请求,带有 GET、PUT、DELETE 三种不同的请求方式,对应三种不同的业务操作。看似该框架可以在本地成功跑起来,整个架构包含两个应用,前端应用提供纯静态的 HTML 页面,后端应用发布 REST API,前端需要通过 AJAX 调用后端发布的 REST API,然而 AJAX 是不支持跨域访问的,也就是说,前后端两个应用必须在同一个域名下才能访问。需要注意的是,该特性在 Spring 4.0 中才引入。

2401_85014997的博客 1099

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

从MVC到前后端分离(REST-个人也认为是目前比较流行和比较好的方式)

摘要:MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强。MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Struts、Spring MVC等框架。 1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器。 其中,模型是用于封装数据的载体,例如,

shao.bing的专栏 6万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Unity MVC框架之见解

Unity MVC框架之见解MVC框架认识构架图案例无框架,普通逻辑代码脚本MVC框架的运用Model脚本View脚本主界面的View脚本角色View脚本主界面的Controller脚本角色Controller脚本控制主界面的显示脚本脚本控件物体的连接 MVC框架认识 MVC框架本不是用于在游戏行业产生的框架,但是其编程思想对游戏开发的影响也很大。 M: model,是模型的意思,可是模型是为何物?是我们游戏中所要操作的人物模型等等。其主要就是存储数据的一个物体。我们所见到的的软件等等,都是本身去操作一条条

m0_48554728的博客 3897

JavaWeb技术之MVC框架

目录 JavaWEB MVC 1.MVC设计模式 2.三层架构 3.三层架构和MVC的区别与联系 注意 MVC固定包框架 前后端分离 作业 MVC部分 bean包——student实体类 dao包——增删改查接口StudentDao dao包——增删改查接口实现类StudentDaoImpl service包——作为连接servlet和dao层的包——StudentService service包——StudentService实现类StudentServiceImpl uti

qq_36279562的博客 3790

使用Unity引擎实现一个MVC框架

当订阅者数量较多时,事件总线的性能可能会受到影响,尤其是在实时性要求较高的场景(如游戏循环中的频繁事件发布)。对于不需要立即处理的事件,可以将这些事件加入队列,并在特定时间点(如每帧结束时)批量处理。事件总线是一种消息传递机制,允许对象通过「订阅事件」和「发布事件」进行通信,而无需相互直接依赖。以下是使用事件总线改进的 MVC 框架,包含一个通用的事件总线实现和基于此总线的模型、视图和控制器交互代码。对于大型项目,可以结合。对于需要频繁调用的事件(例如,获取某些静态数据),可以缓存事件结果,避免重复计算。

小宝哥Code的专栏 1635

模仿 Struts2 框架自己写一个 MVC 框架来深入理解 MVC

MVC 即是Model View Controller 的缩写,Model 即模型,View 即视图,Controller 即控制器。MVC 是一种非常流行的软件设计模式,把代码分根据功能为视图、模型、控制器三个部分。M : Model 模型,主要用于业务处理逻辑及数据存取,表示数据的状态。V: View 视图,主要用于展现数据(列表数据,详细数据等),收集数据(注册,调查报告等)。体现在和用户的交互界面。C:Controller,主要用于接收客户端请求及根据请求调用响应的Model。

zp8126的专栏 1296

使用 Netty 实现一个 MVC 框架

NettyMVC 上面介绍 Netty 能做是什么时我们说过,相比于 SpringMVC 等框架,Netty 没提供路由等功能,这也契合和 Netty 的设计思路,它更贴近底层。下面我们在 Netty Http 的基础上加入路由和 IOC 等功能,来实现一个 MVC 框架。 NettyMVC 是一个 MVC 框架,它实现了 IOC 容器的相关功能。 支持 @Controller,@R...

weixin_30852419的博客 653

实现一个MVC框架

实现一个MVC框架 (1)java反射基础 (2)java注解 代码 package base.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** *Java注解默认只保留到源代码里面(即编译时,java注解会被抹掉。 *使用@Ret...

业精于勤,荒于嬉 193

自己写一个MVC框架

MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制(Controller)。          MVC模式如今大量应用与web开发中,其优势明显,收到了众多开发者的欢迎和支持,struts框架的核心架构也用到了MVC,既然MVC如此犀利,我们就应该深入理解其中的流程,而作为一个IT精英,我们肯定会想到看相关的源码,看完理解之后,我个人认为最高的境界就是自己写一个类

逍遥飞鹤的专栏 2354

前后端分离开发MVC框架实现管理系统

前后端分离开发MVC框架实现管理系统 利用了ajax json知识实现的 下面是效果展示: 下面是后端项目: 一个抽象了 Book.java package cn.hnpi.bean; public class Book { private Integer id;// ID private String name;// 图书名称 private String author;// 图书作者...

qq_45742386的博客 859

【MVC框架】——什么是MVC框架

    学习了经典三层之后,觉得任何一种框架都不再是难的,无论怎样,都需要连接数据库、业务逻辑处理、显示。其余的无非就是给三层解耦合,解耦合越到位,这个框架就越容易被接受。       百度百科:MVC全名是Model View Controller,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需...

Coder Yasmine 1万+

VS 如何创建一个MVC框架

VS 如何创建一个MVC框架 开发工具与关键技术:VS 如何创建一个MVC框架 作者:胡宁淇 撰写时间:2019年1月17日 ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。 ASP.NET 支持三种不同的开发模式: Web Pages(Web 页面)、MVC(Model View Controller 模型-视图-控制器)、Web Fo...

weixin_44552856的博客 6091
上一篇: Javaweb实现文件上传
下一篇: idea创建一个maven项目使用Redis,过程中出现的问题解决方案
凌晨里的无聊人
博客等级 码龄8年 2320粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌晨里的无聊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值