Spring REST实践之Spring Web MVC
Spring概要
Spring Framework提供了依赖注入模型和面向切面编程,简化了基础型代码的编写工作以及更好的能够与其它框架和技术整合起来。Spring Framework由data access、instrumentation、messaging、testing、Web
integration等模块组成。开发者可以只关心自己应用程序相关模块。
依赖注入
依赖注入是Spring Framework的核心,能够降低模块之间的耦合度。为了能够更好的理解依赖注入的概念,举个例子解释一下:考虑网上购物的场景,完成一个订单服务需要与订单仓库组件和用户通知组件交互。在传统的实现方式中,订单服务可以创建订单仓库组件和用户通知组件对象,虽然这么做没有什么错,但是它会导致难于维护、难于测试和高耦合性。利用依赖注入,开发者可以委托Spring Framework管理模块间的依赖关系,所以在上面的场景中,Spring Framework可以创建订单仓库组件和用户通知组件,并注入到订单服务中。这样订单服务就不用创建管理订单仓库组件和用户通知组件,非常方便测试、维护,以及替换订单仓库组件和用户通知组件的实现方式。
AOP
AOP实现了横切逻辑,像日志、事务、监控、安全都属于横切逻辑。AOP提供了切面在一个集中的地方来完成这些横切逻辑,而不是将这些横切逻辑遍布业务代码各处。Spring Framework采用代理的方式实现AOP,当目标bean被调用时,代理会中断调用并执行横切逻辑,最后才执行目标bean的方法。Spring提供了JDK动态代理和CGLIB代理方式,如果目标对象实现了接口,Spring会使用JDK动态代理创建AOP代理,反之会使用CGLIB代理实现。
Spring Web MVC概要
Spring Web MVC是基于MVC的架构,提供了丰富的注解和组件。经过近几年的发展,Spring Web MVC支持了试图解析和丰富的数据绑定功能。
Model View Controller Pattern

Spring Web MVC Architecture

Spring Web MVC Components
Controller
控制器可用 @Controller注解声明。
Model
Model用于保持模型的属性,可用addAttribute和addAttributes方法增加模型的属性。
public interface Model {
Model addAttribute(String attributeName, Object attributeValue);
Model addAttribute(Object attributeValue);
Model addAllAttributes(Collection<?> attributeValues);
Model addAllAttributes(Map<String, ?> attributes);
Model mergeAttributes(Map<String, ?> attributes);
boolean containsAttribute(String attributeName);
Map<String, Object> asMap();
}
View
Spring Web MVC支持JSP、Velocity、Freemarker和XSLT等视图技术,通过View接口完成这个功能。
View Interface API:
public interface View
{
String getContentType();
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
View Interface的核心功能是负责呈现响应内容,这个功能需要重载render方法实现,getContentType方法返回内容类型。Spring Web MVC内置了MappingJackson2JsonView、XsltView等实现View接口的类。
@RequestParam
@RequestParam用于绑定请求中的参数到控制器中的参数。
@RequestMapping
@RequestMapping将一个请求映射到控制器的一个方法。
@RequestMapping的参数:
Method:Restricts a mapping to a specific HTTP method such as GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE
Produces:Narrows mapping to media type that is produced by the method
Consumes:Narrows mapping to media type that the method consumes
Headers:Narrows mapping to the headers that should be present name Allows you to assign a name to the mapping
params:Restricts a mapping to the supplied parameter name and value
Path Variables
@PathVariable能够访问 @RequestMapping指定的路径中占位符参数。
View Resolver
View Resolver能够根据控制器返回的逻辑视图名,选择合适的视图解析器呈现视图。
public interface ViewResolver
{
View resolveViewName(String viewName, Locale locale) throws Exception;
}
ContentNegotiatingViewResolver、BeanNameViewResolver、InternalResourceViewResolver、TilesViewResolver等实现了ViewResolver接口。
Exception Handler
@Controller
public class HomeController {
@ExceptionHandler(SQLException.class)
public Object handleSQLException() {
}
@RequestMapping("/stream")
public void streamMovie(HttpServletResponse response) throws SQLException {
}
}
@ExceptionHandler注解表示在HomeController控制器中的方法抛出SQLException未处理的异常,都由handleSQLException来进行处理。但是此方式有个缺陷,就是只能处理HomeController及其子类的方法抛出的未处理异常。为解决这个问题,Spring提供了 @ControllerAdvice注解,在应用中凡是用 @RequestMapping注解标记的方法抛出未处理的异常都可以由 @ControllerAdvice注解标注的类中的相应异常处理方法进行处理。
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(SQLException.class)
public Object handleSQLException() {
}
}
Interceptors
Interceptors可以执行一些处理器关注的横切点业务。
HandlerInterceptor API
public interface HandlerInterceptor{
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
void postHandle(HttpServletRequest request, HttpServletResponse response, Object
handler, ModelAndView modelAndView);
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object
handler);
}
HandlerInterceptorAdapter实现HandlerInterceptor接口中的方法的默认实现,自定义的拦截器可以继承HandlerInterceptor类,覆盖自己关注的方法即可。
Spring Web MVC Interceptor例子:
public class SimpleInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = Logger.getLogger(SimpleInterceptor.class);
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
logger.info("Inside the prehandle");
return false;
}
}
拦截器注册例子:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.apress.springrest.web" })
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleChangeInterceptor());
registry.addInterceptor(new SimpleInterceptor()).addPathPatterns("/auth/**");
}
}
Spring REST实践之Spring Web MVC的更多相关文章
- Spring REST实践之Spring Boot
Spring Boot基本描述 可以利用http://start.spring.io网站的进行Spring Boot的初始化构建.这个初始化构建器允许你输入工程基本信息.挑选工程支持的功能,最后会生成 ...
- Spring Boot 实践 :Spring Boot + MyBatis
Spring Boot 实践系列,Spring Boot + MyBatis . 目的 将 MyBatis 与 Spring Boot 应用程序一起使用来访问数据库. 本次使用的Library spr ...
- Features of Spring Web MVC
21.1.1 Features of Spring Web MVC Spring Web Flow Spring Web Flow (SWF) aims to be the best solution ...
- Spring与web MVC的整合——Spring的应用上下文管理
问题1 如何让web容器加载你的web MVC框架 对于基于servlet的web容器来说,遵循的是servlet规范,入口配置文件是web.xml.这类web容器会在启动的时候会而且仅会加载如下三种 ...
- spring web mvc中遇到的错误以及学习小记(持续记录)
错误:cvc-complex-type.2.4.a: 发现了以元素 'init-param' 开头的无效内容.应以 '{"http://java.sun.com/xml/ns/javaee& ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中的spring web MVC模块
spring framework中的spring web MVC模块 1.概述 spring web mvc是spring框架中的一个模块 spring web mvc实现了web的MVC架构模式,可 ...
- Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC
内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...
- Spring 4 官方文档学习(十一)Web MVC 框架之HTTP caching support
一个良好的HTTP缓存策略可以显著地增进web应用的性能和其客户端的体验.主要使用"Cache-Control" HTTP response header来完成,配合conditi ...
- 菜鸟学习Spring Web MVC之二
有文章从结构上详细讲解了Spring Web MVC,我个菜鸟就不引据来讲了.说说强悍的XP环境如何配置运行环境~~ 最后我配好的环境Tomcat.Spring Tool Suites.Maven目前 ...
随机推荐
- 用canvas实现图片滤镜效果详解之灰度效果
前面展示了一些canvas实现图片滤镜效果的展示,并且给出了相应的算法,下面来介绍一下具体的实现方法. 前面介绍的特效中灰度效果最简单,就从这里开始介绍吧. 1.获取图像数据 img.src = ’h ...
- *ecshop安装模板
1. 安装模板 例: 新建abc.com文件 复制default下的style.css 修改两个http://www.ecshop.com/ 为 http://www.hua.com/ 复制defau ...
- (六)6.12 Neurons Networks from self-taught learning to deep network
self-taught learning 在特征提取方面完全是用的无监督的方法,对于有标记的数据,可以结合有监督学习来对上述方法得到的参数进行微调,从而得到一个更加准确的参数a. 在self-taug ...
- 【Python】控制流语句、函数、模块、数据结构
1.三种控制流语句:if\for\while 2.每句后都要加冒号 3.有elif语句=else后加一个if 注意使用变量名! 注意缩进! 注意控制流语句后面要加冒号! 4.for i in rang ...
- python知识:json格式文本;异常处理;字符串处理;unicode类型和str类型转换
python进程中的实例和json格式的字符串之间的映射关系是非常直接的,相当于同一个概念被编码成不同的表示: stream in json form ----json.loads(str)----- ...
- js浮点数运算需要注意的问题
最近在js运算浮点数时发现了一个问题.问题是这样的:js函数中处理两个浮点数的相加,为了防止出现0.1+0.2=0.30000000000000004的问题,两个数都先乘以10000后再相加,得到结果 ...
- 什么时候用copy什么时候用retain (一)
在声明一个property的时候总是搞不清什么时候用retain,什么时候用copy,用上去了感觉也不会错,但是又没有安全感: Copy:顾名思义,复制,将对象复制一份,ios内部的操作时,先copy ...
- js闭包用法
闭包 既保证了 内部函数的私有性 又可以向外公开 通过一个已有对象 向它注入属性 /** * 闭包 * 在函数中定义的函数,在外部使用 * 1.在函数内部定义的函数,在外部不能访问 */ functi ...
- php动态生成一个xml文件供swf调用
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdo ...
- eclipse 恢复被删除的文件
即使你在项目中删除了某一文件,该文件的相关信息仍会保存在本地历史记录中.这就使得你可以恢复那些在项目或文件夹中已被删除的文件.如果恢复某一被删除的文件,则首先在Navigator视图中选择该文件先前所 ...