16.参数解析原理
简单的参数解析原理可以参考日记14.请求映射的原理.note
这一节主要探讨复杂参数的解析原理:
Map,Errors/BindingResult,Model,RedirectAttribute(重定向携带数据),
ServletResponse(response),SessionStatus,UriCompon恩同事Build而,ServletUriComponentsBuilder
如果在目标方法的请求参数中有map或者Model,例如public String goToPage(Map map){}
例子:
//1.第一个控制方法中,在参数map中放入name=吴孟达
@Controller
public class RequestController {
@RequestMapping("/goto")
public String goToPage(Map map){
map.put("name", "吴孟达");
//转折点:进行请求转发,转发可以共用请求域中的数据
return "forward:/success";
}
//2.第二个控制方法中,从请求域中获取name值
@RequestMapping("/success")
@ResponseBody
public void success(HttpServletRequest requestA){
System.out.println("name:"+requestA.getAttribute("name"));
}
}
可以正常输出:name:吴孟达
结论:如果请求参数中有map或者Model,往里放值,值会被放入到请求域中,相当关于调用了request.setAttribute()
原理:
目标方法中的Model和Map最终会合并成一个BindAwareModelMap,然后层层封装,最终转换成一个map,这个map中包含了请求参数中的map和model中的所有数据
最终会调用这个方法将map中的参数全部放入到请求域中!
protected void exposeModelAsRequestAttributes(Map<String, Object> model,HttpServletRequest request) throws Exception {
model.forEach((name, value) -> {
if (value != null) {
request.setAttribute(name, value);
}
else {
request.removeAttribute(name);
}
});
}