1.如何用xml配置的方式配置Spring MVC 的controller:
1)配置handle,映射请求
2)处理映射器将bean的name作为url 进行查找,需要在配置handler时制定url的name
3)配置simpleControllerHandlerAdapter ,是一个处理器适配器,所有处理器适配器都要实现HandlerAdapter接口,这个是为了完成对hellocontroller类的handlerRequest方法发调用。
4)配置视图解析器InternalResourceViewResolver
5)实现controller接口,handlerRequest是controller接口必须实现的方法,controller通过调用此方法来处理请求,入参是httpservletRequest和httpServletResponse,需要返回一个ModleAndView对象。
2.基于注解的方式实现controller,从spring2.5版本开始。
@controller,@requestMapping
RequestMappingHandlerAdapter是用来完成对@RequestMapping标注方法的调用
3.详解DispatchServlet的工作流程
1)初始化文件上传解析器
2)初始化本地化解析器
3)初始化主题解析器
4)初始化处理器映射器,将请求映射到处理器
5)初始化处理器适配器
6)初始化处理器异常解析器,如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
7)初始化请求到试图名称解析器
8)初始化视图解析器,通过viewResolver解析逻辑视图名到具体视图实现
9)初始化flash映射管理器
4.每种组件的细节
1)本地化解析器
2)主题解析器
3)处理器映射器
4)处理器适配器
5)处理器异常解析器
6)视图名称解析器
7)视图解析器
8)文件上传解析器
9)FlashMap映射管理器
5.MVC底层框架的机制
前端servlet接收到用户请求之后,通常会对用户的请求进行简单预处理,例如解析,封装参数等,然后通过反射来创建controller实例,并调用controller的制定方法(实现controller接口的是handleRequest方法,而如果是用注解的方式的话可以是任意方法来处理用户请求。
当servlet拦截请求后,它如何知道创建哪个controller接口的实例呢?分两种情况,如果是注解的方式的话呢,通过xml配置;如果是注解的方式的话呢,根据注释@RequestMapping描述hello请求对应的方法,这样也可以让框架知道创建哪个controller接口的实例并调用哪个方法处理请求。
6.Spring MVC执行的流程
1)用户向服务器发送请求,请求被spring的前端控制器DispatchServlet截获
2)DispatchSevlet对请求的URL(统一资源定位符)进行解析,得到URI(请求资源标识符),然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个HandlerExecutionChain对象当中返回
3)DispatchServlet根据获得的Handler,选择一个合适的HandlerAdapter。HandlerAdapter的设计符合面向对象中的单一职责原则,代码架构清晰,便于维护,最重要的是,代码可复性高。HandlerAdapter会被用于处理多种Handler,调用Handler实际处理请求的方法,例如hello方法。
4)提取请求中的模型数据,开始执行Handler(controller),在填充Handler的入参过程中,根据配置,Spring将帮你做一些额外的工作。
消息转换:将请求消息,如(Json,xml等数据)转换成一个对象,将对象转换为指定 的响应信息。
数据转换:对请求消息进行数据转换,如String转换为Integer,Double等。
数据格式化:对请求消息进行数据格式化,如将字符串转换成格式化数字或者格式化日期等。
数据验证:验证数据的有效性(长度,格式等),验证结果存储到BindingResult或者Error中。
5)Handler执行完成后,向DispatchServlet返回一个ModelAndView对象,ModelAndView对象当中应该包含视图名或视图名和模型。
6)根据返回的ModleAndView对象,选择一个适合的ViewResolver(视图解析器)返回给DispatchServlet。
7)ViewResolver结合Model和View来渲染视图。
8)将视图渲染结果返回给客户端。
开发者并不需要关心这些对象是如何工作的,只需要在Handler当中完成对请求的业务处理即可。