4-Spring MVC
2018-04-14 17:50:17 0 举报
AI智能生成
Spring提供的一个优秀的MVC框架,在数据绑定、视图解析、本地化处理及静态资源处理上都有不俗的表现
作者其他创作
大纲/内容
简介
Spring提供的一个优秀的MVC框架
采用了松散耦合可插拔组件结构
支持REST风格的URL请求
在数据绑定、视图解析、本地化处理及静态资源处理上都有不俗的表现
Spring MVC系统概述
Spring MVC体系结构
DispatcherServlet
DispatcherServlet是SpringMVC的灵魂和心脏,它负责接受HTTP请求并协调Spring MVC的各个组件完成请求处理工作
在web.xml中配置
<!-- spring mvc 配置开始 -->
<!-- Spring MVC本质上就是一个Servlet -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation参数来指定Spring MVC配置文件的位置,默认为WEB-INF/[Servlet-Name]-servlet.xml文件 -->
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- spring mvc 配置结束 -->
<!-- spring mvc 配置开始 -->
<!-- Spring MVC本质上就是一个Servlet -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- contextConfigLocation参数来指定Spring MVC配置文件的位置,默认为WEB-INF/[Servlet-Name]-servlet.xml文件 -->
<!-- <init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- spring mvc 配置结束 -->
初始化Spring MVC组件
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
注解驱动的控制器
使用@RequestMapping映射请求
请求处理方法签名
Spring MVC通过分析处理方法签名,将HTTP请求信息绑定到处理方法的相应入参中
@PathVariable
@RequestParam
@RequestHeader
绑定请求报文头的属性值
@CookieValue
一个拥有若干属性的POJO
可以直接在请求参数中通过属性传递对象,支持级联的属性
使用Servlet API对象作为入参
HttpServletRequest
HttpServletResponse
如果处理方法自行使用response返回相应,则处理方法的返回值设为void即可
HttpSession
Spring定义的若干个可代理Servlet原生API类的接口
WebRequest
NativeWebRequest
使用IO对象作为入参
其它类型的参数
Locale
Principal
并根据方法返回值作出相应的后续处理
ModelAndView
包含模型和逻辑视图
String
只包含逻辑视图
使用矩阵变量绑定参数
@MatrixVairable
使用HttpMessageConverter<T>
负责将请求信息转换成一个对象(类型为T),将对象(类型为T)输出为响应信息
DispatcherServlet默认已经安装了RequestMappingHandlerAdapter去处理HttpMessageConverter
默认实现类
StringHttpMessageConverter
T为String,可读取所有媒体类型(*/*),可通过supportedMediaTypes属性指定媒体类型,响应信息的媒体类型为text/plain(即Content-Type的值)
ByteArrayHttpMessageConverter
T为byte[]类型,可读取*/*,可通过supportedMediaTypes属性指定媒体类型,响应信息媒体类型为application/octer-stream
MarshallingHttpMessageConverter:T为Object,可读取text/xml和application/xml媒体类型请求,响应信息的媒体类型为text/xml或application/xml
Jaxb2RootElementHttpMessageConverter
MappingJacksonHttpMessageConverter
利用jackson的ObjectMapper读写Json数据,T为Object,可读取application/json,响应媒体类型为application/json
FormHttpMessageConverter
AllEncompassingFormHttpMesssageConverter
扩展于FormHttpMessageConverter。如果表单部份属性是XML数据,则可以使用该转换器进行读取
XmlAwareFormHttpMessageConverter
ResourceHttpConverterMessage
BufferedImageHttpMessageConverter
SourceHttpMessageConverter
RssChannelHttpMessageConverter
AtomFeedHttpMessageConverter
表示RequestMappingHandlerAdapter默认已经装配了
装配其它类型的HttpMessageConverter
在web容器上下文中定义一个RequestMappingHandlerAdapter
<!-- 自定义装配HttpMessageConverter 开始 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
p:messageConverters-ref="myConverters"/>
<util:list id="myConverters">
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
</util:list>
<!-- 自定义装配HttpMessageConverter 结束 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
p:messageConverters-ref="myConverters"/>
<util:list id="myConverters">
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter"/>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
</util:list>
<!-- 自定义装配HttpMessageConverter 结束 -->
自定义的RequestMappingHandlerAdapter配置,将覆盖默认配置
使用HttpMessageConverter<T>
使用@RequestBody/@ResponseBody对处理方法进行标注
不需要成对出现
使用HttpEntity<T>/ResponseEntity<T>作为处理方法的入参或返回值
不但可以访问请求和响应报文体的内容,还可以访问报文头的内容也不需要成对出现。
只有当控制器处理方法使用了上面两种方式时,Spring MVC才会使用注册的HttpMessageConverter对请求/响应消息进行处理
使用RequestTemplat
调用web服务端的服务,支持REST风格的URL,且内部维护了HttpMessageConverter组件
使用@RestController
为了方便Rest开发引入了@RestController注解,相当于@Controller+@ResponseBody
(使用REST风格开发)当我们使用Rest风格开发程序时,只需要配置
<mvc:annotation-driven/>
<!--扫描通过注解配置的类-->
<context:component-scan base-package="top.richpeople">
<!--如果使用了spring,可以用context:include-filter设置只扫描@Controller别的交给Spring容器去管理-->
<!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
</context:component-scan>
<!--扫描通过注解配置的类-->
<context:component-scan base-package="top.richpeople">
<!--如果使用了spring,可以用context:include-filter设置只扫描@Controller别的交给Spring容器去管理-->
<!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
</context:component-scan>
使用syncRestTemplate
以异步无阻塞的方式进行服务访问
处理模型数据
ModelAndView
@ModelAttribute
Map及Model
@SessionAttributes
处理方法的数据绑定
数据绑定流程
数据转换
ConversionService
数据格式化
Formatter
注解驱动格式化的重要接口
@NumberFormat
@DateTimeFormat
数据校验
JSR-303
Spring校验框架
Spring MVC数据校验
获取校验结果
在页面中显示错误
通过国际化资源显示错误信息
自定义校验规则
视图和视图解析器
如果不使用REST风格,处理方法执行完后最终会返回一个ModelAndView对象。对于哪些返回String、View或ModelMap等类型的处理方法,Spring MVC也会在内部将它们装配成一个ModelAndView对象。
Spring MVC借助视图解析器得到最终的视图对象(View),可以是Jsp或基于FreeMarker、Velocity模板技术处理视图,还可能是PDF、Excel、XML、JSON等各种类型的视图
Spring MVC不同视图的实现类
本地化解析
文件上传
MultipartResolver用于处理上传请求,处理方法就是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取到File,如果上传多个文件,还可以通过调用getFileMap得到FileName->File结构的Map。
其实上传不用Multipart封装成MultipartHttpServletRequest,直接用原来的Request也是可以的,所以在Spring MVC中没有默认装配MultipartResulver
Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResulver的实现类:CommonsMultipartResolver
配置MultipartResolver
使用WebSocker
很好的解决了浏览器与服务器的全双工通信问题
Spring 4.0wei WebSocket通信提供了支持
发送和接受消息的API
用来发送消息的模板
支持SockJS,用来解决浏览器、服务器及代理不支持WebSocket的问题
静态资源的处理
<mvc:default-servlet-handler/>
<mvc:resources/>
缓存及版本的处理
装配拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/secure/*"/>
<bean class="" />
</mvc:interceptor>
</mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/secure/*"/>
<bean class="" />
</mvc:interceptor>
</mvc:interceptors>
异常处理
HandlerExcpetionResolver
RequestContextHolder启用
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
0 条评论
下一页
为你推荐
查看更多