dispatcherServletController参数填充源码
来源:互联网 发布:mac用的播放器 编辑:程序博客网 时间:2024/05/24 22:43
关于dispatcherServlet的源码,很多人都看过,但有些具体的细节,可能没有专心研究过,楼主遇到了一个参数默认填充的问题,所以研究了下源码。问题如下:
@RequestMapping("/addgoods") public void addGoods(GoodsMaster goodsMaster,GoodsSlave goodsSlave,HttpServletRequest request) {
当我们写一个Controller方法的时候,springmvc会帮我们填充,GoodsMaster,GoodsSlave等自己定义的类,只要jsp中的name与类中的属性对应上。
那么dispatcherservlet是怎么做的呢,在doDispatcher()方法中,
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
在这里,然后继续,进入handle方法最后一行,如下return invokeHandlerMethod(request, response, handler);跟进去:protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {ServletHandlerMethodResolver methodResolver = getMethodResolver(handler);Method handlerMethod = methodResolver.resolveHandlerMethod(request);ServletHandlerMethodInvoker methodInvoker = new ServletHandlerMethodInvoker(methodResolver);ServletWebRequest webRequest = new ServletWebRequest(request, response);ExtendedModelMap implicitModel = new BindingAwareModelMap();Object result = methodInvoker.invokeHandlerMethod(handlerMethod, handler, webRequest, implicitModel);ModelAndView mav =methodInvoker.getModelAndView(handlerMethod, handler.getClass(), result, implicitModel, webRequest);methodInvoker.updateModelAttributes(handler, (mav != null ? mav.getModel() : null), implicitModel, webRequest);return mav;}
重点是标黑的这行,进去,有这样一行代码:Object[] args = this.resolveHandlerArguments(handlerMethodToInvoke, handler, webRequest, implicitModel);
在这个方法中,会获取你的参数类型,然后反射填充你的参数中的所有属性。else if (attrName != null) {WebDataBinder binder =resolveModelAttribute(attrName, methodParam, implicitModel, webRequest, handler);boolean assignBindingResult = (args.length > i + 1 && Errors.class.isAssignableFrom(paramTypes[i + 1]));if (binder.getTarget() != null) {doBind(binder, webRequest, validate, validationHints, !assignBindingResult);}args[i] = binder.getTarget();if (assignBindingResult) {args[i + 1] = binder.getBindingResult();i++;}implicitModel.putAll(binder.getBindingResult().getModel());}
加粗的这行进行了,反射与参数填充。如下private WebDataBinder resolveModelAttribute(String attrName, MethodParameter methodParam,ExtendedModelMap implicitModel, NativeWebRequest webRequest, Object handler) throws Exception {// Bind request parameter onto object...String name = attrName;if ("".equals(name)) {name = Conventions.getVariableNameForParameter(methodParam);}Class<?> paramType = methodParam.getParameterType();Object bindObject;if (implicitModel.containsKey(name)) {bindObject = implicitModel.get(name);}else if (this.methodResolver.isSessionAttribute(name, paramType)) {bindObject = this.sessionAttributeStore.retrieveAttribute(webRequest, name);if (bindObject == null) {raiseSessionRequiredException("Session attribute '" + name + "' required - not found in session");}}else {bindObject = BeanUtils.instantiateClass(paramType);}WebDataBinder binder = createBinder(webRequest, bindObject, name);initBinder(handler, name, binder, webRequest);return binder;}
阅读全文
0 0
- dispatcherServletController参数填充源码
- Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用
- 带参数的存储过程填充DataSet
- 模版默认参数自动填充的方法
- 关于布局填充器的参数
- mybatis mapper映射文件参数填充原理
- opencv源码学习漫水填充
- 使用仿函实现函数参数的部分自动填充
- URL自动填充参数导致的OAuth签名验证失败
- C++定长参数填充与Delphi的PPChar
- servlet获取的页面参数自动填充到bean里
- 编程习惯-函数无参数用void填充
- struts1.1源码研究--表单数据的填充方式
- n[VB.NET源码]51_绘制填充图形
- Javac源码简单分析之解析和填充符号表
- memset(将参数1用参数2填充参数3个字符长度)
- registerDatabaseChangeNotification参数配置源码
- nginx 源码编译参数
- Python学习——控制流
- PAT a1032题解
- Windows 如何让环境变量设置后 立即生效
- mybatis学习
- 第一题 赋值运算符的重载
- dispatcherServletController参数填充源码
- css的三大特性
- PAT a1033题解
- 浅谈UITableview 的优化
- 离散化--uva12171 Sculpture
- hibernate模糊查询criteria封装参数
- 修改cmd的默认路径
- 《华为机试在线训练》之字符个数统计
- PAT a1034题解