1.初识MVC
当今MVC(Model-View-Controller)框架已经盛行,它不单单用于java开发,也广泛应用于其他系统的开发。MVC的成功在于他的理念,所以有必要认识下MVC框架。Spring MVC示意图如下:
其中带有阿拉伯数字的说明,是MVC的运行流程。处理请求先到达控制器(Controller),控制器的作用是进行请求分发,这样他会根据请求的内容去访问模型层(Model)。控制器获取到由模型层返回的数据后,就将数据进行渲染到视图中,这样就能展示给用户了。
2.Spring Mvc流程
尽管在Spring Boot开发中我们可以很轻松的通过配置实现Spring MVC的开发,但是为了解决实际问题,我们又必要了解Spring MVC的运行流程和组件,否则很难理解Spring Boot自动为我们生成了什么,配置了什么。
流程和组件是Spring MVC的核心,Spring MVC的流程围绕DispatcherServlet而工作的,所以在Spring MVC中DispatcherServlet就是其最重要的内容。
Spring MVC的流程和组件如下图:
其中阿拉伯数字是其执行流程。严格得数Spring MVC处理流程并非一定需要全流程,有时候一些流程并不存在。例如,我们加入@ResponseBody时是没有经过视图解析器和视图渲染的。
首先,在Web服务器启动的过程过程中,如果Spring Boot机制下启用了Spring MVC,他就开始初始化一些重要的组件,如DispatcherServlet、HandlerAdapter的实例RequestMaappingHandlerAdapter等组件。关于这些组件我们可以看到spring-webmvc-xxx.jar包的属性文件DispatcherServlet.proerties,他定义的对象都在Spring MVC开始时就初始化,并且存在在Spring IOC容器中。代码清单如下:
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
#国际化解析器
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
#主题解析器
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
#HandlerMapping实例
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
#处理器适配器
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
#处理器异常解析器
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
#策略视图名称转换器
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
#视图解析器
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
#FlashMap管理器,不常用
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
这些组件会在Spring MVC得到初始化,所以我们并不需要太多配置就能够开发Spring MVC程序,尤其是在Spring Boot中,更是如此,我们可以用Spring Boot的配置来定制化这些组件间的初始化。
@Controller
@RequestMapping("/ceres/collUser")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/query")
public ModelAndView queryUser(Long id) {
User user = userService.getById(id);
ModelAndView mv = new ModelAndView();
mv.setViewName("user/query");
mv.add("user", mv);
return mv;
}
}
这里注解@Controller表明是一个控制器,然后@RequestMapping代表请求路径和控制器(或其他方法)的映射,它会在Web服务器启动Spring MVC的时,就被扫描到HandlerMapping的机制中存储,之后在用户发起请求被DispatcherServlet拦截后,通过URI和其他条件,通过HandlerMapper机制找到对应的控制器进行响应。
先到这里,后续继续更新。