当前位置 : 主页 > 编程语言 > 其它开发 >

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

来源:互联网 收集:自由互联 发布时间:2022-05-30
1 . 解决跳转问题:添加一个 login 方法,跳转返回一个字符串。 中央控制器 DispacherServlet 调用 Emp Controller ,所以字符串返回给中央控制器。 如下图所示:中央控制器帮我们统一的做 资

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

 

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

1.1 更新 EmpController代码

1.2 更该 DispatcherServlet 代码

 

 

 

 

 

 

 

 1.3 演示效果:

 

 

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

 

2 删除XxxControler中各方法中的response

 

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

 

2.1 EmpController代码

 

 

 

 

 

下一步,我们改动传参。

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

3.1 EmpController 代码

 

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

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

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

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

 

 

 

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

 

 

 报错:

 

 

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

 

 

 

3.4 修改DispatcherServlet代码

 

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

 

 

 

 

3.5 测试:模拟登录

 

 

 

 

 

 

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

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

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

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

 

 

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

重新编译项目,debug运行。

 

 

 

 

 

 

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

 

 

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

3.7 修改DispatcherServlet代码

 

 

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

 

 

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

3.10 代码测试:

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

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

 

 

 

 

 

 

 

 

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

 

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

 

 

 

 

 

EmpControllerdelete方法的参数需要的是一个Integer类型,

通过反射机制我们该方法需要的类型ParameterInteger

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

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

 

 

 

 

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

 

 

 

3.14 再次测试代码,成功。

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

 

                       DispatcherServlet中的完整代码

 

 

3.15 小结:对应的版本mymvc3

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

 jackson jar包

 

网友评论