学习写作与分享-spring mvc基础功能搭建

spring mvc搭建web services 问题背景        这两日在处理上司交给的任务的时候接触到了web services,感觉这个跨越语言还有环境的接口调用方式真的是非常之优雅,于是就想着自己能不能试着实现一下。技术选型&&准备        在技术的选型上初期的话遇到了比较多的问题,也看到了网上非常多的技术方案,在茫茫的信息流中还是看到了一款非常适合我的方案,那就是spring mvc。        当然,第一件需要我们做的事 阅读详情

spring mvc:
Model (数据)
View (视图)
Controller (业务)
最上层是面向用户的视图层,中间一层是业务逻辑层,最下面一层是数据层。
把数据、展示、业务逻辑进行分离,每一层的变化可以不影响其他层,增加程序的可维护性和可扩展性。
请求、响应过程
View–>Controller–>Model–>Controller-View
MVC解决思路
1、请求路由:
根据请求能找到对应的业务控制类 (HandleMapping)
2、参数适配:
根据请求参数封装到对应的Model (HandlerAdapter)
3 、视图解析:
把经过业务处理的数据解析响应给View (ViewResolver、ModeAndView)
(二)SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet。

2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet调用HandlerAdapter处理器适配器。

5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、 Controller执行完成返回ModelAndView。

7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、 ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

(三)SpringMVC核心组件讲解
1、前端控制器DispatcherServlet
作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

2、处理器映射器HandlerMapping
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

4、处理器Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。

5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。

6、视图View
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)

(四)手写springMvc框架思路:
1、配置web.xml,加载自定义的DispatcherServlet。

2、初始化阶段,在DispatcherServlet类中,实现下面几个步骤:

加载配置类。
扫描当前项目下的所有文件。
拿到扫描到的类,通过反射机制,实例化。并且放到ioc容器中。
初始化path与方法的映射。
获取请求传入的参数并处理参数通过初始化好的handlerMapping中拿出url对应的方法名,反射调用。
3、运行阶段,每一次请求将会调用doGet或doPost方法,它会根据url请求去HandlerMapping中匹配到对应的Method,然后利用反射机制调用Controller中的url对应的方法,并得到结果返回。
准备阶段:
在这里插入图片描述
在这里插入图片描述
代码阶段:

 public class DispatcherServlet extends HttpServlet {
 
 //springmvc 容器存放bean
 private ConcurrentHashMap<String, Object> mvcBeans = new ConcurrentHashMap<>();
 private ConcurrentHashMap<String, Object> mvcBeanUrl = new ConcurrentHashMap<>();
 private ConcurrentHashMap<String, String> mvcMethodUrl = new ConcurrentHashMap<>();
 
 
      @Override
      public void init(ServletConfig config) {
          String packagePath = "com.zzw.cn.springmvc";
          //1.进行报扫描获取当前包下面所有的类
          List<Class<?>> classes = comscanPackage(packagePath);
          try {
              //2.初始化springmvcbean
              initSpringMvcBean(classes);
          } catch (Exception e) {
              e.printStackTrace();
          }
          //3.将请求地址和方法进行映射
          initHandMapping(mvcBeans);
      }
  
  
      public List<Class<?>> comscanPackage(String packagePath) {
          List<Class<?>> classes = ClassUtils.getClasses(packagePath);
          return classes;
      }
  
      /**
       * 初始化sprignbean
       *
       * @param classes
       * @throws Exception
       */
      public void initSpringMvcBean(List<Class<?>> classes) throws Exception {
          if (classes.size() == 0 || null == classes) {
              throw new Exception("包扫描后的classes为null");
          }
  
          for (Class<?> aClass : classes) {
              //获取被自定义注解的controller将其初始化到自定义sprignmvc容器中
              AnController declaredAnnotation = aClass.getDeclaredAnnotation(AnController.class);
              if (declaredAnnotation != null) {
                  //获取类的名字
                  String beanid = lowerFirstCapse(aClass.getSimpleName());
                  //获取对象
                  Object beanObj = aClass.newInstance();
                  //放入sprign容器
                  mvcBeans.put(beanid, beanObj);
              }
          }
  
      }
  
      /**
       * 初始化HandlerMapping方法
       *
       * @param mvcBeans
       */
      public void initHandMapping(ConcurrentHashMap<String, Object> mvcBeans) {
          //遍历springmvc 获取注入的对象值
          for (Map.Entry<String, Object> entry : mvcBeans.entrySet()) {
              Object objValue = entry.getValue();
              Class<?> aClass = objValue.getClass();
              //获取当前类 判断是否有自定义的requestMapping注解
              String mappingUrl = null;
              AnRequestMapping anRequestMapping = aClass.getDeclaredAnnotation(AnRequestMapping.class);
              if (anRequestMapping != null) {
                 mappingUrl = anRequestMapping.value();
             }
             //获取当前类所有方法,判断方法上是否有注解
             Method[] declaredMethods = aClass.getDeclaredMethods();
             for (Method method : declaredMethods) {
                 AnRequestMapping methodDeclaredAnnotation = method.getDeclaredAnnotation(AnRequestMapping.class);
                 if (methodDeclaredAnnotation != null) {
                     String methodUrl = methodDeclaredAnnotation.value();
                     mvcBeanUrl.put(mappingUrl + methodUrl, objValue);
                     mvcMethodUrl.put(mappingUrl + methodUrl, method.getName());
                 }
             }
 
         }
 
     }
 
     /**
     * @param str
      * @return 类名首字母小写
      */
     public static String lowerFirstCapse(String str) {
         char[] chars = str.toCharArray();
         chars[0] += 32;
         return String.valueOf(chars);
 
     }
 
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         try {
             doServelt(req, resp);
         } catch (NoSuchMethodException e) {
             e.printStackTrace();
         } catch (InvocationTargetException e) {
             e.printStackTrace();
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         }
     }
 
     private void doServelt(HttpServletRequest req, HttpServletResponse resp) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, ServletException {
         //获取请求地址
         String requestUrl = req.getRequestURI();
         //查找地址所对应bean
         Object object = mvcBeanUrl.get(requestUrl);
         if (object == null) {
             resp.getWriter().println("sorry http is not exit 404");
             return;
         }
         //获取请求的方法
         String methodName = mvcMethodUrl.get(requestUrl);
         if (methodName == null) {
             resp.getWriter().println("sorry method is not exit 404");
             return;
         }
         //通过构反射执行方法
         Class<?> aClass = object.getClass();
         Method method = aClass.getMethod(methodName);
         String invoke = (String) method.invoke(object);
         // 获取后缀信息
         String suffix = ".jsp";
         // 页面目录地址
         String prefix = "/";
         req.getRequestDispatcher(prefix + invoke + suffix).forward(req, resp);
     }
 
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         this.doPost(req, resp);
     }

请求:
在这里插入图片描述
参考链接:
https://www.cnblogs.com/hang-on/p/11419298.html

Java面试题:Spring,Spring MVC,Spring Boot 之间什么关系? 点开之前,我不知道这么给力! 阅读详情

相关推荐

Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC

Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC

m0_55849656的博客 784

Spring MVC 实战手册

课程亮点 由浅入深,从基本操作到剖析底层原理 实践为主,语言通俗易懂、快速上手 整合 Spring MVC、NoSQL,实现前后端分离 附赠 Nginx 搭建 Tomcat 集群实现负载均衡 专家推荐 本课程内容由浅入深、知识点全面,同时结合了作者丰富的实战经验,行文流畅,是不可多得的学习资料。 ——尹吉欢,《Spring Cloud 微服务:全栈技术与案例解析》一书作者,极部落 Java 开...

GitChat 1188

Spring MVC 中文件上传与下载功能实现

假设你是一个幼儿园老师,需要让小朋友们把自己的画传到班级系统,再分享给其他小朋友。这个过程其实就是文件上传(小朋友把画"传"给系统)和文件下载(其他小朋友把画"取"走)。电商平台:商家上传商品图片;社交应用:用户上传头像、朋友圈视频;企业系统:员工上传报销凭证、下载工资条。Spring MVC作为Java Web开发的主流框架,提供了简洁、高效的文件处理方案。理解文件上传下载的底层原理(Multipart请求是什么?掌握Spring MVC中文件上传的配置与代码实现;

AI架构全栈开发实战笔记 1368

【学习分享】spring mvc的入门使用

上图是mvc架构模型,后端编码会把事件处理分为controller、model、view三层。

大漠狼烟的博客 660

搭建一个基于Spring Boot的数码分享网站

搭建一个基于Spring Boot的数码分享网站可以涵盖多个功能模块,例如用户管理、数码产品分享、评论、点赞、收藏、搜索等。

嵌入式行业打工人,不定期更新博客。 1338

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 354

boot spring 怎么执行hql_Spring、Spring Boot与Spring MVC

文章较长,各位看官可以收藏后细细阅读,关注我持续更多好文分享!总论Spring框架就像一个家族,有众多衍生产品例如boot、security、jpa等等。但他们的基础都是Spring的ioc和aop。ioc提供了依赖注入的容器,aop解决了面向横切面的编程;然后在此二者的基础上实现了其他延伸产品的高级功能。Spring MVC是基于 Servlet 的一个 MVC 框架,主要解决 WEB 开发的问...

weixin_28947385的博客 327

Copula函数实战:如何用MATLAB计算气象干旱与农业干旱的联合概率?

本文提供了一份基于MATLAB的Copula函数实战指南,详细阐述了如何利用该多变量联合分布函数计算气象干旱与农业干旱的联合概率及条件概率。通过从数据预处理、边缘分布拟合到Copula模型选择与检验的完整流程,帮助环境科学与农业气象研究者量化干旱事件的关联风险,为风险评估提供定量依据。

weixin_29213655的博客 431

计算机毕设Springboot网红美食分享平台 基于Spring Boot的美食分享社区平台开发与实现 Spring Boot驱动的网红美食互动分享系统设计

本系统通过整合用户管理、美食推荐、烹饪分享、排行榜单、资讯发布和互动交流等功能,构建了一个全面且互动性强的美食分享平台。它不仅满足了用户分享和探索美食的需求,还通过排行榜单和资讯功能,为用户提供了更丰富的体验。同时,系统为管理员提供了强大的后台管理功能,确保内容的优质和平台的稳定运行。注:完成的毕业设计程序以下面的的环境软件、功能图和界面为准。系统所需要的环境软件:idea、eclipse+mysql5.7、8.0+Navicat+JDK1.8+tomcat7.03.

世迁科技 1775

【近源攻击】badusb制作

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。

qinjilll的博客 2550

MPU6050 加速度计和陀螺仪传感器与 Arduino 的接口

虽然该模型并不能准确代表现实世界中加速度计传感器的构建方式,但它通常有助于理解为什么加速度计的输出信号通常以 ±g 为单位指定,或者为什么加速度计在静止时在 z 轴上的读数为 1g,或者在不同方向上您可以期望得到什么样的加速度计读数。该模块的核心是低功耗、低成本的 6 轴运动跟踪芯片 MPU6050,它将 3 轴陀螺仪、3 轴加速度计和数字运动处理器 (DMP) 集成到一个 4mm x 4mm 的微型芯片中。小时候,科学博览会上的陀螺仪总是让我们感到惊讶,因为它们以奇怪的方式移动,甚至似乎违背了重力。

sxstj的博客 9933

Spring MVC

MVC是一种思想,Spring MVC是Spring 把MVC这种思想进行了实现。

2402_88670936的博客 1058

Autodesk软件网络授权破解

Autodesk 全系列产品网络授权破解 此网络许可授权破解文件及方法适用Autodesk 绝大部分的产品, 安装网络许可证管理器Autodesk网络许可证管理器x64位官方下载地址( https://knowledge.autodesk.com/sites/default/files/file_downloads/nlm11.14.1.3_ipv4_ipv6_win64.msi ) Autod...

weixin_33919950的博客 8264

Spring Mvc

Spring MVC 是 Spring Framework 的核心模块之一,用于构建基于 Java 的 Web 应用程序。它基于经典的 MVC(Model-View-Controller)设计模式,提供了一套强大的、灵活的 Web 开发框架。这里简单谈谈他的设计模式:(1)Model可以类比为三层架构中的服务层,主要是在该层进行一些简单的业务逻辑处理以及封装应用程序数据。(2)View是视图层,主要在该界面进行web设计,负责将Model封装的数据进行渲染。

weixin_63982353的博客 1810

强化学习算法案例——一个经典的走迷宫任务。

作者:禅与计算机程序设计艺术 1.简介 在强化学习(Reinforcement Learning, RL)中,有一个经典的任务——走迷宫,其原理简单易懂,但它的实际意义却深远,它让计算机学习如何通过策略网络(policy network),以最佳的方式解决复杂的任务。本文将介绍如何用强化学习解决这个经典

AI天才研究院 3217

2026年摩尔线程数字IC面试试卷带答案

本文摘要: 该试卷为数字IC设计笔试,满分120分,时长90分钟,包含单选题、波形分析题、多选题和代码设计题。重点考察时序约束(如set_false_path)、建立/保持时间、逻辑化简、复位机制、AXI协议、半导体工艺、状态机、GPU架构等核心知识点。多选题涉及异步FIFO设计、Verilog综合、亚稳态处理、C++关键字和低功耗技术。代码题要求实现单比特信号去毛刺电路,需稳定4个时钟周期才输出。试题解析详细,标注了企业面试高频考点,如摩尔线程自研的MUSA架构和花港GPU架构特点。整体内容专业性强,覆盖

Open 98

Spring MVC+Mybatis入门学习小项目实例

Spring MVC+Mybatis入门学习小项目实例 源代码下载地址:http://www.zuidaima.com/share/1610395974765568.htm

springmvc_springdata的专栏 3651

【人工智能】OpenClaw网关API速率限制报错全解析 API rate limit reached. Please try again later.

对应HTTP标准状态码为429(请求过多)。该报错集中出现在OpenClaw GATEWAY DASHBOARD的聊天会话界面,核心特征为:用户最初以为是单一模型服务商的问题,先后更换OpenAI、Gemini、Ollama、Moonshot、Mercury-2等多个主流大模型API后,该报错仍稳定触发,尤其在执行复杂任务时高频出现。

奶爸的编程之路,也就一周冷个三天 6459

Spring MVC核心解析

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

MoneyHacksPro的博客 909

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

廖雪峰Python教程[完整版]

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

Spring MVC 框架解析

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》、(架构篇)、作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1087

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Spring Boot环境的搭建

什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。 自己的理解就是spring boot其实不是什么新的框架,它只是默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架,...

小思的博客 2678

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring Boot 和 Spring MVC 学习感悟​

但正是在不断解决这些问题的过程中,我逐渐理解了 Spring MVC 的工作原理,体会到它将业务逻辑、数据和界面显示分离的精妙之处,这种分离不仅让代码结构更加清晰,也极大地提升了项目的可维护性和扩展性。这种高效便捷的开发方式,让我深刻感受到技术创新带来的巨大便利,也让我明白,在软件开发领域,不断追求更优的解决方案是推动技术进步的重要动力。在未来的学习和工作中,我将继续深入研究这两项技术,不断探索它们在不同场景下的应用,努力将所学知识运用到实际项目中,创造出更有价值的软件产品。

2401_86656119的博客 342

【SpringMVC】Spring Web MVC入门(一)

前面我们了解了什么是Spring,那么今天我将为大家分享一种在日常网站开发中使用非常广泛的框架——Spring Web MVC。先来看看官方解释。Spring Web MVC是Spring Framework提供的Web组件,它是一个MVC设计模式的框架,主要用于开发灵活、松散耦合的Web应用程序。它提供了模型-视图-控制(Model-View-Controller,简称MVC)的体系结构和可以用来开发Web应用程序的组件。

m0_74825541的博客 1697
上一篇: 学习总结与分享-Spring IOC尝试自实现仿IOC容器
下一篇: 学习总结与分享-手写Spring MVC完善篇
VolcanoWec
博客等级 码龄8年 0粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值