您的位置:首页 > 其它

一起写框架-MVC框架-基础功能-ServletAPI的动态绑定(五)

2017-11-12 00:05 537 查看

实现功能

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

分别为:HttpServletRequest和HttpServletResponse。然后通过这个两个对象获得参数和处理参数。

需求:我们希望根据方法声明的参数列表决定是否需要ServletAPI的对象

HttpServletRequest

HttpServletResponse

HttpSession

ServletContext

而不是固定必须HttpServletRequest和HttpServletResponse。

实现思路

通过反射技术获得执行方法的参数列表。判断需要传入的ServletAPI对象。

实现步骤

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

private 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项目的目录结构



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.测试结果,输出对应的对象。成功!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐