springMVC流程笔记

来源:互联网 发布:什么样的大数据才有用 编辑:程序博客网 时间:2024/05/14 21:05
springMVC流程
           ***.do->handlerMapping(如果没有配置handlerMapping,则默认选BeanNameUrlHandlerMapping.)->(HandlerAdapter调用)选择相应的Controller(如果为MultiAction则调用相应的MethodNameResolver)->返回ModelAndView/String/Map->ViewResolver解析返回视图View
     handlerMapping->View细节:
               当一个请求到来后(***.fuiou),首先DispatcherServlet调用checkMultipart(request),若有文件上传则转换成MultipartRequest, 取优先级高的handerMapping(一般为simpleUrlHandlerMapping)调用HandlerMapping.getHandler(request)方法返HandlerExecutionChain对象(HandlerExecutionChain包含了处理器handler和拦截HandlerInterceptor),HandlerExecutionChain中调用getHandler方法取此控制器链中的handler(Controller),然后 在DispatcherServlet中调用handlerAdapters集合,通过getHandlerAdapter(Object handler)方法找个第一个support()返回true的adapter并返回此adapter作为此次请求的适配处理器,在适配器adapter处理之前调用mappedHandler.getInterceptors()方法获取所有拦截HandlerInterceptor并前置处理preHandle此次请求,(若某一拦截器返回false,则调用所有在这拦截器之前的拦截器的afterComplete方法进行完成处理后返回,不做后续处理),此适配处理器调用handle方法处理此次请求(实际上是调用handler的处理方法处理此次请求)并返回ModelAndView供ViewResolver处理,返回ModelAndView后调用(逆序调用)拦截器HandlerInteceptor的postHandle(此方法无返回值,用户不可以自定义此方法中断此次请求),若在处理过程中抛出了ModelAndViewDefiningException异常,则使用此异常解析出的ModelAndView来做接下来的视图解析处理,若为其它异常则调用用户定义的HandlerExceptionResolver解析器解析异常并返回指定ModelAndView来做接下来的视图解析处理,ViewResolver处理此ModelAndView并返回相应的View对象,之后View类通render()方法(对于AbstractUrlBasedView的子类只要实现renderMergedOutputModel方法并在此方法中处理并返回相应显示层即可)返回相应的显示层(JSP,XLS,字符串等),之后调用所以拦截器AfterCompletion方法(此方法始终被执行)做最后完成处理,并在最后调用cleanupMultipart清除掉上传的文件信息.

dispatcher  web.xml配置 
          <servlet>
             <servlet-name> dispatcher</servlet-name >
             <servlet-class>
                  org.springframework.web.servlet.DispatcherServlet
             </servlet-class>
             <init-param>
                   <param-name> contextConfigLocation</param-name >
                   <param-value>
                        /WEB-INF/ config/dispatcher-servlet.xml,
                        /WEB-INF/ config/dispatchers-servlet.xml
                         //定义多个xml载入文件
                   </param-value>
             </init-param>
                  <load-on-startup> 1</ load-on-startup>
            <servlet>
handlerMapping
           beanNameUrlHandlerMapping->beanName和请求路径匹配,如<bean id/name="/index.do" class=''/>
           SimpleUrlHandlerMapping
               有两种配置方法
          urlMap和mappings
          </property>
           <property name="mappings" >
                  <value>
                     a.fuiou=beanName
                     b.fuiou=beanName2
                     *=beanName3
                    </value>
            <props>
              <prop key="urlName" >beanName</prop>
              </props>
               </property>
             <property name="urlMap" >
                   <map>
                     <entry key="urlName" >
                       <bean class="beanName" ></bean>
                        </entry>
                     </map>
          两种配置方法可同时配置
                  if (!url.startsWith("/" )) {
                              url = "/" + url;
                        }
MethodNameResolver
          方法映射器,一般用ParameterMethodNameResolver,默认名称为action,
         策略1 < property name ="paramName" value ="action"/>//指定方法映射名
         策略2  <property name="defaultMethodName" value="list"///指定默认方法处理名
                    <property name="methodParamNames" value="list,update,delete" />//指定处理方法名
               如果策略1,2同时启用,则优先选择策略2.


Controller
          AbstractController 实现handleRequestInternal处理逻辑
 MultiActionController
          ModelAndView addUpsTerm(HttpServletRequest request, HttpServletResponse response,HttpSession 
           session,MchntAddInf termAddInf)
          这样就能直接绑定对象和session.
          返回String,return "index";直接返回视图没有模型数据
          返回Map,只有模型数据,视图由RequestToViewNameTranslator解析返回
          MultiActionController默认的MethodNameResolver为InternalPathMethodNameResolver();
              /**/*controller/login.do 会去找login方法.
               PropertiesMethodNameResolver(同SimpleUrlHandlerMapping)
          PropertyEditorRegistrySupport查看属性转换关系
ViewResolver 视图解析器
          InternalResourceViewResolver->UrlBasedViewResolver->AbstractCachingViewResolver->ViewResolver
          可以定义多个视图解析器/按order顺序查找->forward或include,redirect到JSP(在render方法中转向)
          JstlView比InternalResourceView多一个国际化支持(messageSource)
          excel的ContentType:application/vnd.ms-excel
          RedirectView v=new RedirectView();mv.setView(v);redirect方式重定向页面
            // 或者可以ModelAndView=new ModelAndView("redirect:jspName");
MultipartResolver 文件上传解析器
          CommonsMultipartResolver和
HttpServletRequest被转换成MultipartHttpServletRequest->
MultipartFile
          得到MultipartFile(enctype="multipart/form-data")transferTo只能调用一次
          MultipartFile能直接赋给bean,而Byte[]则需要注册自定义解析
          binder.registerCustomEditor(Byte[]. class, new ByteArrayMultipartFileEditor());
          //如果是文本格式文件可以注册StringMultipartFileEditor
              binder.registerCustomEditor(String.class, new StringMultipartFileEditor());
HandlerInteceptor
          HandlerInterceptorAdapter实现HandlerInteceptor,只需实现一个处理方法即可,用户直接继承自adapter即可
          throw new ModelAndViewDefiningException(new ModelAndView(viewName));//抛出此异常会跳转到指定错误页面
HandlerExceptionResolver 异常解析器
          SimpleMappingExceptionResolver


原创粉丝点击