前言:
前一段时间学习了SpringMVC,但是由于本人学习缺少耐心和独立思考,所以当时学习SpringMVC时,只是照搬框架而已,对SpingMVC的工作原理和流程对不是很了解,导致后来的学习时总是觉得思路不是很通顺,对学习事倍功半,所以今天特别总结了一下SPringMVC的工作原理流程,希望对自己的今后学习有些帮助。
正文:
1.SpringMVC是基于Sping的一个Web框架,具有Spring容器IOC(反转控制)和AOP(切面编程)的优点,总之SpringMVC具有Spring的所有优点
2.SpringMVC是围绕 DispatcherServlet编写的,它处理所有的HTTP请求和响应,
DispatcherServlet对请求的处理顺序:
(1)在接收到HTTP请求后,DispatcherServlet会调用相应的Controller
(2)Controller根据请求的方法(GET/POST)调用相应的服务方法,最后返回视图名称给DispatcherServlet
(3)DispatcherServlet调用ViewResolver解析视图名称,
(4)DispatcherServlet将模型数据传给视图,并将视图呈现在浏览器。
2.必须的配置
2.1 web.xml示例:
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring MVC Application</display-name>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
</web-app>
重点:
web.xml配置在web应用程序的web/WEB-INF 目录下,在DispatcherServlet初始化时,框架默认从web/WEB-INF目录下查找[servlet-name]-servlet.xml文件加载应用程序上下文。
如果不想使用默认的[servlet-name]-servlet.xml文件名和默认的位置web/WEB-INF ,可以通过在web.xml中添加servlet监听器ContextLoaderListener定义文件名和文件位置
示例:
<!-- other xml configuration -->
<!-- Load By Spring ContextLoaderListener-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/Resources/configuration/application.xml
/WEB-INF/abc.xml
</param-value>
</context-param>
<!-- Spring ContextLoaderListener-->
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
注:Spring应用程序ContextLoaderListener将读取其他XML配置文件加载应用程序上下文。
2.2 [servlet-name]-servlet.xml 示例:
<context:component-scan base-package="com.yiibai" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
[servlet-name]-servlet.xml 说明
(1)[servlet-name]-servlet.xml 主要作用:创建定义好的java bean
(2)<context:component-scan base-package =... /> :启动SpingMVC注释扫描功能,生成对应的java bean示例对象
(3)InternalResourceViewResolver:视图解析器
3. SpringMVC工作流程
4.控制器和方法
(1)"redircet:" 控制器的重定向:使用前缀“redirect:”,该方法返回字符串,重定向到其他视图
(2)@RequestParam 将请求参数绑定到控制器方法参数 示例:@RequestParam(value=“name”,defaultValue=“user”)String name
(3)@PathVariable 将方法参数绑定到一个URI模板变量的值
示例:
@RequestMapping("/web/fe/{sitePrefix}/{language}/document/{id}/{naturalText}")
public String documentView(Model model,
@PathVariable(value = "sitePrefix") String sitePrefix,
@PathVariable(value = "language") String language,
@PathVariable(value = "id") Long id,
@PathVariable(value = "naturalText") String naturalText) {
在这里顺便把URL,URI,ContextPath理一下:
URL:http://localhost:8080/HelloSpringMVC/web/fe/default/en/document/8108/spring-mvc-for-beginners
URI:/web/fe/default/en/document/8108/spring-mvc-for-beginners
ContextPath:/HelloSpringMVC
5.@RequestBody 和 @ResponseBody
(1) @RequsetBody 注解:读取requset请求body的数据,解析后将返回的对象绑定到controller方法的参数
(2)@ResponseBody注解:将controller方法的返回对象写到Response对象的body 使用时机:当返回数据不是html标签的页面,而是其他格式的数据时(json,xml)。
6.SpringMVC请求参数获取的方式
详见下一章
7.<context:component-scan /> 和 <mvc:annotation-driven /> 区别:
之前在配置[servlet-name]-servlet.xml 文件时,总是搞不清楚两者的区别,只是照抄,今天刚好来总结一下
区别:
(1)<context:component-scan /> :启动SpringMVC注解扫描功能,将带有@Controller ,@Service 等注解类注册到Spring容器,应应用的是Spring IOC(反转控制)
(2)<mvc:annotatiion-driven/> : 主要功能是处理请求映射,决定哪个controller的哪个方法来处理当前请求。
8.appilcationContext.xml 和 [servlet-name]-servlet.xml 区别:
区别:
(1)applicationContext.xml 是Spring全局配置文件,控制Spring的功能特性,如:IOC ,AOP等,
[servlet-name]-servlet.xml 是SpringMVC的配置文件,包含注解扫描,视图解析等。
(2)两个配置文件的位置和作用:
applicationContext.xml 是系统级别的配置,作用范围是应用程序上下文
[servket-name]-servlet.xml 是servlet级别的配置,作用范围是servlet上下文
(3)在web.xml的配置:
applicationContext.xml : 在<context-param /> <listener/>初始化
[servlet-name]-servlet.xml : 在DispatcherServlet初始化时初始化,默认位置在WEB-INF/ 目录下,默认文件名为[servlet-name]-servlet.xml,当没有自定义servlet配置文件位置,且默认目录也没有配置servlet配置文件时,服务器启动会报错。
注意:
因为servlet配置文件只负责请求的转发,返回结果的解析,以及静态资源文件的解析,所以除了视图的解析方式,静态资源文件的存放位置,Controller的初始化之外,其他的都不应该存在servlet配置文件。