HttpSession session){ 11 System.out.println("-登录Controller-"

时间:2021-08-03 08:09:57

标签:

实现成果

以上的代码实现了通过路径执行对应的执行要领,,但执行要领的参数是必需需要传入请求后响应的参数的。

分袂为:HttpServletRequestHttpServletResponse。然后通过这个两个东西获得参数和措置惩罚惩罚参数。

需求:我们但愿按照要领声明的参数列表决定是否需要ServletAPI的东西

HttpServletRequest

HttpServletResponse

HttpSession

ServletContext

而不是固定必需HttpServletRequest和HttpServletResponse。

实现思路

通过反射技术获得执行要领的参数列表。判断需要传入的ServletAPI东西。

实现法式

1.在ControllerRelolver类中增加一个判断执行要领的参数列表要领 getparameterObjects

1 private Object[] getparameterObjects(Parameter[] parameters) { 2 // 1.创扶植置一个参数东西的数组,参数的格局和参数类型的个一致 3 Object[] parameterObjects = new Object[parameters.length]; 4 //2.按照参数的类型,将对付的东西填在东西数组中 5 for(int i=0;i<parameters.length;i++){ 6 Class<?> typeClass = parameters[i].getType(); 7 //3.按照判断要领参数的类型和我们制定的4个感化是否是父子类关系。如果是就赋值 8 if(ServletRequest.class.isAssignableFrom(typeClass)){ 9 parameterObjects[i]=this.request; 10 }else if(ServletResponse.class.isAssignableFrom(typeClass)){ 11 parameterObjects[i]=this.response; 12 }else if(HttpSession.class.isAssignableFrom(typeClass)){ 13 parameterObjects[i]=this.session; 14 }else if(ServletContext.class.isAssignableFrom(typeClass)){ 15 parameterObjects[i]=this.application; 16 } 17 18 } 19 return parameterObjects; 20 }

2.改削ControllerRelolver的execute()要领,挪用getparameterObjects要领来按照执行要领的参数列表,动态挪用Controller的要领时传入对应的值

1 public String execute(HttpServletRequest request,HttpServletResponse response,Context context) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{ 2 //1.设置Servlet需要的API东西 3 this.request=request; 4 this.response=response; 5 this.session=request.getSession(); 6 this.application=request.getServletContext(); 7 8 //1.获得请求过来的路径 9 String uri = request.getRequestURI(); 10 //2.按照路径法则,获得映射路径 11 String path = this.pathRule(uri); 12 //3.通过路径获得容器中对应的业务控制器的东西和执行要领 13 MappingEnttiy mappingEnttiy = this.getRequestMethod(path, context); 14 //4.获得执行要领 15 Method method = mappingEnttiy.getMethod(); 16 //5.获得路径对应的业务控制器 17 Object controller = mappingEnttiy.getController(); 18 //6.执行要领,执行要领必需有request,response两个参数 19 Parameter[] parameters = method.getParameters(); 20 //7.给执行的要领,设置按照执行要领的参数赋予对应的ServletAPI东西 21 Object[] objects = this.getparameterObjects(parameters); 22 //8.动态挪用要领,将参数对应的东西赋值执行要领 23 Object resultObject = method.invoke(controller, objects); 24 if(resultObject!=null){ 25 //7.返回执行要领返回的映射字符串 26 return (String) resultObject; 27 } 28 return null; 29 }

测试代码

1.测试web项目的目录布局

HttpSession session){ 11 System.out.println("-登录Controller-"

2.改削测试的UserController的执行要领,有多个ServletAPI的参数