三,手写SpringMVC框架,第三次改进

1 . 解决跳转问题:添加一个 login 方法,跳转返回一个字符串。

中央控制器DispacherServlet 调用EmpController ,所以字符串返回给中央控制器。如下图所示:中央控制器帮我们统一的做 资源的转发(forward/include) 或 重定向。

三,手写SpringMVC框架,第三次改进

1.1 更新 EmpController代码

三,手写SpringMVC框架,第三次改进

1.2 更该 DispatcherServlet 代码

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

1.3 演示效果:

三,手写SpringMVC框架,第三次改进

现在XxxController 已经算一个普通的POJO 类了,但是还是和Servlet 耦合,方法的参数中还有HttpServletRquest 。

2 删除 X xx C ontroler 中各方法中的response

改动了跳转后,就可以删除XxxController 中的各个方法的中的HttpServletResponse 参数了。

2.1 EmpController代码

三,手写SpringMVC框架,第三次改进

3 下一步,我们改动传参。

几乎每个方法中,都有request.getParameter(“xxx”);方法,我们需要将该方法删掉,变成参数,让XxxController 不要依赖Servlet 。

3.1 EmpController 代码

三,手写SpringMVC框架,第三次改进

3.2 变成参数后,谁给我们传参?

将获取参数的过程 — request.getParameter(“xxx”),统一抽取到中央调度器DispatcherServlet 中,来统一获取请求参数。

如果在EmpController 中写个delete 方法参数名叫什么?如果写一个insert ,update 方法呢,每个方法的参数都不一样。 所以我到底要获取哪些参数是,根据当前这个方法的方法签名来决定的

三,手写SpringMVC框架,第三次改进

3.3 在DispatcherServlet 添加统一获取请求参数的代码。

访问测试:http://127.0.0.1:8080/mymvc3/emp.do?ac=login

报错:

因为EmpController 的方法中没有,HttpServletRequest 和HttpServletResponse 了。那么这句代码就无法获取到了。

三,手写SpringMVC框架,第三次改进

3.4 修改DispatcherServlet代码

修改代码,通过反射机制获取所有的方法。然后只根据方法名来做判断。

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

3.5 测试:模拟登录

三,手写SpringMVC框架,第三次改进

这么写,获取方法的参数的名字是arg0 ,arg1……,并不能获取真实的方法名。

3.6 要想获取真实的参数名称需要加参数重新编译代码

从JDK8.0开始,有一个反射的新特性,可以获取到参数的方法的名字。做一个小的设置。

java 中获取接口(方法)中的参数名字(eclipse 设置编译参数)(java8 javac–parameters )

这个就表示JVM 虚拟机在编译的时候,所得到的Class 文件里面就带有形参的名称了。

重新编译项目,debug 运行。

三,手写SpringMVC框架,第三次改进

再次debug 运行看到已经获得了方法的参数的实际的名称。

3.6.1 maven 工程如何更方便的设置?

三,手写SpringMVC框架,第三次改进

3.7 修改DispatcherServlet代码

3.8 invoke 进行调用的时候就不能传递request 和response 了。

三,手写SpringMVC框架,第三次改进

3.9 修改EmpController 代码,并新增delete 删除方法

3.10 代码测试:

http://127.0.0.1:8080/mymvc3/emp.do?ac=login&ename=fbb&pwd=123456

三,手写SpringMVC框架,第三次改进

http://127.0.0.1:8080/mymvc3/emp.do?ac=login

三,手写SpringMVC框架,第三次改进

3.11 访问EmpController 的delete 方法,出现的错误:

访问:http://127.0.0.1:8080/mymvc3/emp.do?ac=delete&eid=1 ; 报错:

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

EmpController 中delete 方法的参数需要的是一个Integer 类型,

通过反射机制我们该方法需要的类型Parameter 是Integer ,

但是前台传递到后台的是字符串”1″,而不是数字1 ,所以需要进行类型转换。

3.12 测试3.3.12 问题,修改DispatcherServlet 中的代码

三,手写SpringMVC框架,第三次改进

3.13 解决3.3.12 问题,再次修改DispatcherServlet 中的代码

3.14 再次测试代码,成功。

http://127.0.0.1:8080/mymvc3/emp.do?ac=delete&eid=1

三,手写SpringMVC框架,第三次改进

DispatcherServlet 中的完整代码

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

三,手写SpringMVC框架,第三次改进

3.15 小结:对应的版本mymvc3

写到着,我们的Xxx 只需要考虑,业务功能即可,不需要考虑如何获取参数,资源的跳转问题。 那么之前所写的重复的,请求参数的获取和请求转发或是重定向都不要了。关注业务即可。

jackson jar包

三,手写SpringMVC框架,第三次改进

Original: https://www.cnblogs.com/lijili/p/16127061.html
Author: 雾里看瓜
Title: 三,手写SpringMVC框架,第三次改进

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622413/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【Java面试手册-算法篇】给定一个整数,输出逆序数字

    输出逆序数字相当于反转数字,比如1234,逆序后为4321,在反转数字时,需要注意反转后得到的数字是否会超过最大范围,比如int最大值为2147483647,正常反转后的值是746…

    Java 2023年6月8日
    075
  • Ubuntu14.04.6配置阿里源

    Ubuntu14.04.6配置阿里源 Ubuntu14.04.6配置阿里源 这两天上手 Ubuntu 系统,因为公司用的是 14.04.6 版本,所以有了一些踩坑记录。 起因是安装…

    Java 2023年6月8日
    086
  • Lombda表达式

    Lambda Lambda表达式就是简写了函数式接口(函数式接口有且只有一个抽象函数) 测试代码 按照原来的方式我们都是线实现接口,重写方法,再进行实例化调用 // 接口 publ…

    Java 2023年6月7日
    059
  • Jenkins+gitlab+docker+harbor容器化自动部署详细流程

    环境:Linux版本:Centos7 一、更新源:yum update 二、安装docker:yum install docker -y 启动docker: systemctl s…

    Java 2023年6月13日
    074
  • SSH 端口转发(本地转发与远程转发)

    SSH 端口转发处于机构SSH用于从所述客户端机器隧道应用程序的端口到服务器计算机上,或反之亦然。它可用于为 遗留应用程序添加加密、 通过防火墙,并且一些系统管理员和 IT 专业人…

    Java 2023年5月30日
    076
  • 框架篇(二)Spring面试题(一)

    Spring面试题 Spring常见面试题总结(超详细回答)_张维鹏的博客-CSDN博客_spring面试题一个不错的总结!!! 1. 你是怎样理解Spring的 我和面试官的一个…

    Java 2023年6月5日
    096
  • python2的utf8编码问题

    Python中中文出现错误:SyntaxError: Non-ASCII character xxx in file x 在文件头部添加: #!/usr/bin/python -*…

    Java 2023年6月5日
    050
  • 图解HTTP阅读笔记

    chapter1.了解Web及网络基础 URI(Uniform Resource Identifier):统一资源定位符,由某个协议名称表示的资源的定位标识符。协议名称比如说HTT…

    Java 2023年6月15日
    071
  • Java8 提供的函数接口

    参考资料 函数接口 Java 提供的函数接口位于 java.util.function 包下。 接下来介绍主要的函数接口: Function 接口代表一个 接收1个参数并返回1个结…

    Java 2023年6月9日
    051
  • 下载任务执行器简单设计

    下载任务类设计 /** * 下载任务执行器 * @author Shixy */ @Slf4j public class Downloader implements Runnabl…

    Java 2023年6月8日
    068
  • 基于SpringBoot的在线教育系统【源码开源】【建议收藏】

    一个月爆肝一个基于SpringBoot的在线教育系统【源码开源】【建议收藏】 https://blog.csdn.net/mengchuan6666/article/details…

    Java 2023年5月30日
    0134
  • Spring5

    Spring概述 1、Spring是轻量级开源JavaEE框架 2、Spring可以解决企业应用开发的复杂性 3、组成核心IOC、Aop IOC:控制反转,把创建对象过程交给Spr…

    Java 2023年6月13日
    059
  • SpringBoot配置文件读取过程分析

    SpringBoot的配置文件有两种 ,一种是 properties文件,一种是yml文件。在SpringBoot启动过程中会对这些文件进行解析加载。在SpringBoot启动的过…

    Java 2023年6月13日
    072
  • java 8 lamdba 表达式list集合的BigDecimal求和操作

    posted @2022-05-01 01:27 野狼谷 阅读(209 ) 评论() 编辑 Original: https://www.cnblogs.com/yelanggu/p…

    Java 2023年5月29日
    079
  • 看Spring源码不得不会的@Enable模块驱动实现原理讲解

    这篇文章我想和你聊一聊 spring的@Enable模块驱动的实现原理。 在我们平时使用spring的过程中,如果想要加个定时任务的功能,那么就需要加注解@EnableSchedu…

    Java 2023年6月16日
    094
  • Java的发展史

    在当时,客户端编程所迈出的最重要的一步就是 插件(plug-in) 的开发。通过这种方式,用户可以下载一段代码,并将其插入到浏览器中适当的位置,以此来为浏览器添加新的功能。 插件又…

    Java 2023年5月29日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球