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代码
3 下一步,我们改动传参。
几乎每个方法中,都有request.getParameter(“xxx”);方法,我们需要将该方法删掉,变成参数,让XxxController不要依赖Servlet 。
3.1 EmpController 代码
3.2 变成参数后,谁给我们传参?
将获取参数的过程 — request.getParameter(“xxx”),统一抽取到中央调度器DispatcherServlet中,来统一获取请求参数。
如果在EmpController中写个delete方法参数名叫什么?如果写一个insert,update方法呢,每个方法的参数都不一样。所以我到底要获取哪些参数是,根据当前这个方法的方法签名来决定的。
3.3 在DispatcherServlet添加统一获取请求参数的代码。
访问测试:http://127.0.0.1:8080/mymvc3/emp.do?ac=login
报错:
因为EmpController的方法中没有,HttpServletRequest和HttpServletResponse了。那么这句代码就无法获取到了。
3.4 修改DispatcherServlet代码
修改代码,通过反射机制获取所有的方法。然后只根据方法名来做判断。
3.5 测试:模拟登录
这么写,获取方法的参数的名字是arg0,arg1……,并不能获取真实的方法名。
3.6 要想获取真实的参数名称需要加参数重新编译代码从JDK8.0开始,有一个反射的新特性,可以获取到参数的方法的名字。做一个小的设置。
java中获取接口(方法)中的参数名字(eclipse设置编译参数)(java8 javac –parameters)
这个就表示JVM虚拟机在编译的时候,所得到的Class文件里面就带有形参的名称了。
重新编译项目,debug运行。
再次debug运行看到已经获得了方法的参数的实际的名称。
3.6.1 maven工程如何更方便的设置?
3.7 修改DispatcherServlet代码
3.8 invoke进行调用的时候就不能传递request和response了。
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 访问EmpController的delete方法,出现的错误:
访问:http://127.0.0.1:8080/mymvc3/emp.do?ac=delete&eid=1 报错:
EmpController中delete方法的参数需要的是一个Integer类型,
通过反射机制我们该方法需要的类型Parameter是Integer,
但是前台传递到后台的是字符串”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包