手写框架系列----SpringMvc

源码(码云):https://gitee.com/yin_zhipeng/implement-_springmvc_of_myself.git

一、手写SpringMVC

思路分析
Created with Raphaël 2.3.0 tomcat加载web.xml 前端控制器DispatcherServlet,加载指定配置文件springmvc.xml 包扫描注解@Controller、@Service、@RequestMapping、@AutoWired Spring IoC容器进行Bean初始化,依赖注入维护 SpringMvc相关组件初始化,建立url和method间映射关系。HandlerMapping(处理器映射组件) 等待请求,进行处理
所以我们需要搭建一个web骨架,来实现SpringMvc
  1. Maven项目和tomcat插件
    在这里插入图片描述
  2. 相关依赖
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope><!--tomcat如果有,不使用这个使用自己的,避免冲突-->
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>
  </dependencies>
DispatchServlet,派发Servlet,这个是SpringMvc处理请求的核心,我们先把他搞出来
  1. DispatchServlet类new出来,具体实现后面再说,他就是一个Servlet而已
    在这里插入图片描述
  2. web.xml配置DispatchServlet默认拦截所有请求
    在这里插入图片描述

1. 注解

接下来我们要开发注解
  1. @MyController注解
    在这里插入图片描述
  2. @MyService
    在这里插入图片描述
  3. @RequestMapping
    在这里插入图片描述
  4. @Autowired
    在这里插入图片描述

2. 流程结构DispatchServlet

接下来按照流程,编写DispatchServlet,加载配置文件,扫描注解,IoC容器初始化Bean
Created with Raphaël 2.3.0 tomcat加载web.xml 前端控制器DispatcherServlet,加载指定配置文件springmvc.xml 包扫描注解@Controller、@Service、@RequestMapping、@AutoWired Spring IoC容器进行Bean初始化,依赖注入维护 SpringMvc相关组件初始化,建立url和method间映射关系。HandlerMapping(处理器映射组件) 等待请求,进行处理
基本上都是初始化的东西。在init方法完成

在这里插入图片描述

3. 加载指定配置文件doLoadConfig

为了方便,我们不解析xml了,就用properties文件凑合吧
  1. springmvc.properties文件配置,扫描注解包
    在这里插入图片描述
  2. 配置文件配置到web.xml中
    在这里插入图片描述
解析配置文件
  1. 获取web.xml配置的内容,加载配置文件(操作都放在方法中),建立模板方法
    在这里插入图片描述
  2. 编写doLoadConfig()
  1. 用到的变量
    在这里插入图片描述
  2. doLoadConfig()解析
    在这里插入图片描述

4. 扫描类,注解doScan()

扫描配置文件中指定的包,然后反射注解,进行相应处理
  1. 获取到配置文件包名传给doScan()
    在这里插入图片描述
  2. 声明全局(成员)变量,保存扫描到的全限定类名
    在这里插入图片描述
  3. 编写doScan()
    在这里插入图片描述

5. 实现IoC容器,实例化相关Bean,doInstance()

接下来基于注解,我们实现一个简易版Spring IoC容器,用一个map将根据全限定类名反射出来的对象,映射出来
  1. 全局变量,ioc容器
    在这里插入图片描述
  2. 工具方法,首字母小写
    在这里插入图片描述
  3. doInstance,如果是MyController,就直接加入ioc容器,如果是@MyService,除了实体类加入IoC容器,还需要将接口加入IoC,方便后面依赖注入
    在这里插入图片描述
    在这里插入图片描述

6. 注入相关依赖,doAutowired()

接下来判断刚刚实例化到IoC的实例,是否有@Autowired注解,进行实例注入
  1. 注入时,先获取bean所有属性,然后判断属性是否有@Autowired注解,有的话,就寻找ioc容器中,是否有相应实例,有的话,通过反射进行注入
    在这里插入图片描述

7. 实现initHandlerMapping

最后,就是处理url和Methods的映射了,前面的东西都不重要(都是基础),这个理解了就完事了,SpringMvC的核心
先看有缺陷的版本
  1. 保存url和Method的全局变量,容器
    在这里插入图片描述
  2. 编写initHandlerMapping(),获取类和方法的@MyRequestMapping注解的value值,进行拼接,然后将url和方法进行映射
    在这里插入图片描述
而反射玩的溜得小伙伴应该已经发现,我们虽然存储了反射的method,但是没有存储对象,和参数,所以我们需要进行一个封装,封装成一个Handler
  1. 假设我们的controller方法参数是这样的
    在这里插入图片描述
  2. 封装需要的方法信息
    在这里插入图片描述
改造initHandlerMapping(),我们封装时,需要封装参数位置,然后将相应的参数传递。而request和response对象,需要特殊处理。因为我们直接把doPost()方法的res和resp直接传输过去
  1. 改造全局变量,不用map了,而是封装成Handler容器
    在这里插入图片描述
  2. 改造initHandlerMapping方法
    在这里插入图片描述

8. 处理请求

有了映射关系,接下来进行请求的处理
  1. 封装一个功能方法,根据req,利用url获取MyHandler
    在这里插入图片描述
  2. doPost()
    在这里插入图片描述

9. 测试

首先,编译器会自动将方法参数,编译成arg0,rag1这种,所以我们的方法参数名,没法存储到map中,需要通过maven指定编译级别

在这里插入图片描述

  <packaging>war</packaging>

  <name>implement_springmvc Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope><!--tomcat如果有,不使用这个使用自己的,避免冲突-->
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.9</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <!--指定编译级别-->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId><!--加个插件-->
        <version>3.1</version>
        <configuration>
          <source>8</source><!--JDK-->
          <target>8</target><!--编译-->
          <encoding>utf-8</encoding><!--编码-->
          <compilerArgs>
            <arg>-parameters</arg><!--告诉编译器,编译时,记录形参的真实名称-->
          </compilerArgs>
        </configuration>
      </plugin>
      <!--tomcat 7插件-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <port>8080</port>
          <path>/</path>
          <uriEncoding>UTF-8</uriEncoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
测试
  1. 注意包名,和配置文件中配置要相同
    在这里插入图片描述
  2. Service
    在这里插入图片描述
    在这里插入图片描述
  3. controller
    在这里插入图片描述
启动服务器,访问http://localhost:8080/demo/method?name=zhangsan

在这里插入图片描述

二、SpringMVC高级应用

篇幅原因,我将其放在这篇文章https://blog.csdn.net/grd_java/article/details/123000873

三、SpringMVC源码

篇幅原因,我将其放在这篇文章https://blog.csdn.net/grd_java/article/details/123000880
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
手写Spring MVC是指自己实现一个简单的Spring MVC框架,而不是使用官方提供的Spring MVC框架。在手写Spring MVC时,你需要实现以下几个关键部分: 1. 创建一个前端控制器(Front Controller):前端控制器是整个请求处理过程的入口点,负责接收请求并进行路由。你可以使用Servlet作为前端控制器,接收所有的HTTP请求,并将它们分发给相应的控制器。 2. 定义控制器类:控制器类负责处理特定URL的请求,并根据请求参数进行相应的处理。你可以使用注解(如@RequestMapping)来定义控制器类和方法的映射关系。 3. 实现视图解析器(View Resolver):视图解析器负责解析控制器返回的逻辑视图名,并将其转换为具体的视图对象或视图模板。你可以使用模板引擎(如Thymeleaf、Freemarker等)来渲染动态内容。 4. 注册控制器和视图解析器:在前端控制器中,你需要注册所有的控制器类和视图解析器,以便能够正确地处理请求和渲染视图。 5. 处理请求和响应:在控制器中,你需要编写相应的方法来处理请求,并根据业务逻辑生成响应。你可以使用HttpServletRequest和HttpServletResponse对象来访问请求参数和生成响应。 6. 配置URL映射:你需要在配置文件中配置URL与控制器方法的映射关系,以便能够正确地将请求分发给对应的控制器。 手写Spring MVC的过程可以帮助你更好地理解Spring MVC框架的工作原理和核心组件。但请注意,手写一个完整的Spring MVC框架可能会比较繁琐和复杂,特别是对于初学者来说。因此,如果你只是想学习Spring MVC的基本原理和用法,我建议你先阅读官方文档或参考一些教程来快速入门。如果你确实有兴趣手写Spring MVC,你可以参考引用中的博客文章,里面提供了一个手写Spring MVC框架的实现示例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [手写 springmvc](https://download.csdn.net/download/knight_black_bob/10207699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringMvc手写简单实现篇 - MVC完结篇](https://blog.csdn.net/qq_35551875/article/details/121811048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

殷丿grd_志鹏

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

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

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

打赏作者

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

抵扣说明:

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

余额充值