SpringMVC核心流程
SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是DispatcherServlet。
整个核心流程,如下图所示:
- DispatcherServlet 控制器入口 负责分发请求;
- HandlerMapping 负责根据请求 找到对应的控制器;
- Controller 真正处理请求的控制器;
- ModelAndView 封装数据信息和视图信息的;
- ViewResolver 视图处理器 通过处理找到对应的页面;
DispatcherServlet收到请求后,依据HandlerMapping的配置,调用相应的Controller来处理,Controller将处理结果封装成ModelAndView对象,返回给DispatcherServlet,DispatcherServlet依据ViewResolver的解析,调用相应的视图对象来生成相应的页面。
SpringMVC配置
1.DispatcherServlet配置
DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherServlet的,那么我们先来配置一下DispatcherServlet。
DispatcherServlet必须在Web应用程序的web.xml文件中进行配置,如下所示:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <!-- 配置DispatcherServlet --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 处理静态资源 --> <mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"></mvc:resources> <mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"></mvc:resources> <mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"></mvc:resources>
上面代码中明确了contextConfigLocation的地址为:classpath:springmvc.xml,即在classess文件夹下面,而且命名为springmvc.xml的配置文件。
当web.xml中DispatcherServlet配置声明中,没有明确DispatcherServlet前端控制器配置文件的位置时,则系统默认DispatcherServlet前端控制器配置文件放在WEB-INF文件夹下。
如下所示:
<!-- Spring MVC 的Servlet,它将加载WEB-INF/springDispatcherServlet-servlet.xml 的配置文件,以启动Spring MVC模块--> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
2.配置组件扫描器
使用组件扫描器可省去在Spring容器中配置每个Controller类的繁琐。
使用自动扫描标记@controller注解的控制器类,配置如下:
<!-- 配置组件扫描--> <context:component-scan base-package="com.mikechen.springmvc.controller"/>
3.配置MVC注解扫描
和组件扫描搭配,相当于同时配置了HandlerMapping和Controller。
如下所示:
<!-- 开启注解 --> <mvc:annotation-driven/>
mvc:annotation-driven配置的作用,如下:
- 会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdater、ExceptionHandlerExceptionResolver;
- 支持使用ConversionService实例对表单参数进行类型转换;
- 支持使用@NumberFormatannotation、@DataTimeFormat注解完成数据类型的格式化;
- 支持使用@RequestBody和@ResponseBody注解;
4.SpingMVC配置视图
视图解析器是为了当html,jsp等前端文件放到WEB-INF/的路径下时,浏览器不能直接访问,就需要使用视图解析器来访问相应的前端文件。
视图配置,如下所示:
<!-- 配置视图解析器,将ModelAndView及字符串解析为具体的页面 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
InternalResourceViewResolver:支持JSP视图解析;
viewClass:JstlView表示JSP模板页面需要使用JSTL标签库,所以classpath中必须包含jstl的相关jar 包;
prefix和suffix:查找视图页面的前缀和后缀,最终视图的址为:前缀+逻辑视图名+后缀,逻辑视图名需要在Controller返回的ModelAndView中指定;
比如逻辑视图名为hello,则最终返回的jsp物理视图地址就为 “WEB-INF/jsp/hello.jsp”;
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》