一起写框架-MVC框架-基础功能-ServletAPI的动态绑定(五)
2017-11-12 00:05
537 查看
实现功能
以上的代码实现了通过路径执行对应的执行方法,但执行方法的参数是必须需要传入请求后响应的参数的。分别为:HttpServletRequest和HttpServletResponse。然后通过这个两个对象获得参数和处理参数。
需求:我们希望根据方法声明的参数列表决定是否需要ServletAPI的对象
HttpServletRequest
HttpServletResponse
HttpSession
ServletContext
而不是固定必须HttpServletRequest和HttpServletResponse。
实现思路
通过反射技术获得执行方法的参数列表。判断需要传入的ServletAPI对象。实现步骤
1.在ControllerRelolver类中增加一个判断执行方法的参数列表方法 getparameterObjectsprivate Object[] getparameterObjects(Parameter[] parameters) { // 1.创建设置一个参数对象的数组,参数的格式和参数类型的个一致 Object[] parameterObjects = new Object[parameters.length]; //2.根据参数的类型,将对于的对象填在对象数组中 for(int i=0;i<parameters.length;i++){ Class<?> typeClass = parameters[i].getType(); //3.根据判断方法参数的类型和我们制定的4个作用是否是父子类关系。如果是就赋值 if(ServletRequest.class.isAssignableFrom(typeClass)){ parameterObjects[i]=this.request; }else if(ServletResponse.class.isAssignableFrom(typeClass)){ parameterObjects[i]=this.response; }else if(HttpSession.class.isAssignableFrom(typeClass)){ parameterObjects[i]=this.session; }else if(ServletContext.class.isAssignableFrom(typeClass)){ parameterObjects[i]=this.application; } } return parameterObjects; }
2.修改ControllerRelolver的execute()方法,调用getparameterObjects方法来根据执行方法的参数列表,动态调用Controller的方法时传入对应的值
public String execute(HttpServletRequest request,HttpServletResponse response,Context context) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{ //1.设置Servlet需要的API对象 this.request=request; this.response=response; this.session=request.getSession(); this.application=request.getServletContext(); //1.获得请求过来的路径 String uri = request.getRequestURI(); //2.根据路径规则,获得映射路径 String path = this.pathRule(uri); //3.通过路径获得容器中对应的业务控制器的对象和执行方法 MappingEnttiy mappingEnttiy = this.getRequestMethod(path, context); //4.获得执行方法 Method method = mappingEnttiy.getMethod(); //5.获得路径对应的业务控制器 Object controller = mappingEnttiy.getController(); //6.执行方法,执行方法必须有request,response两个参数 Parameter[] parameters = method.getParameters(); 20 //7.给执行的方法,设置根据执行方法的参数赋予对应的ServletAPI对象 21 Object[] objects = this.getparameterObjects(parameters); 22 //8.动态调用方法,将参数对应的对象赋值执行方法 23 Object resultObject = method.invoke(controller, objects); if(resultObject!=null){ //7.返回执行方法返回的映射字符串 return (String) resultObject; } return null; }
测试代码
1.测试web项目的目录结构![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/15/d25e1cfd4d1ce85f6be957e247aedef3.png)
2.修改测试的UserController的执行方法,有多个ServletAPI的参数
/** * 路径规则: * 1.必须包括有/开头 * 2.后缀必须忽略不写 * 如:http://localhost:8080/webmvc-demo-test-01/test.do * 对应的映射路径为:/test * */ @RequestMapping(value = "/login") public String login(HttpServletRequest request,HttpServletResponse response,ServletContext application,HttpSession session){ System.out.println("-登录Controller-"); System.out.println(request); System.out.println(response); System.out.println(application); System.out.println(session); return "redirect:/login.jsp"; }
3.测试结果,输出对应的对象。成功!
![](https://oscdn.geek-share.com/Uploads/Images/Content/202003/15/dfc642ccddb3bc26ce26e712bbdae36e.png)
相关文章推荐
- 一起写框架-MVC框架-基础功能-Date类型数据绑定(七)
- 一起写框架-MVC框架-基础功能-简单数据类型参数绑定(六)
- 一起写框架-MVC框架-基础功能-实现forward和redirect的跳转(四)
- 一起写框架-MVC框架-基础功能-DispacherServlet控制器的实现(三)
- 一起写框架-MVC框架-基础功能-环境搭建(二)
- 一起写框架-Ioc内核容器的实现-基础功能-getBean(五)
- 一起写框架-Ioc内核容器的实现-基础功能-组件注解支持自定义的对象名(九)
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持多包扫描(六)
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan支持组件注解限制(七)
- 一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)
- 一起写框架-Ioc内核容器的实现-基础功能-ComponentScan(四)
- 类似评论、点评的JS标签选择功能(及jq动态绑定事件)
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- 框架学习前基础加强 泛型高级,注解,反射(泛型&注解)应用案例,IOC,Servlet3.0,动态代理,类加载器
- 基础加强____【反射的作用__实现框架功能】
- DCFramework 动态分布式计算框架(01)-- 基础结构
- GridView动态绑定数据、编辑、修改、删除及分页功能
- Java基础知识强化之集合框架笔记25:Vector的特有功能
- 将php分页类YII绑定框架,就需要改变风格的基础
- 黑马程序员——基础加强——反射的作用,实现框架功能