`
Adan-Chiu
  • 浏览: 21960 次
社区版块
存档分类
最新评论

spring mvc 对RESTful的支持

 
阅读更多

RESTful

 
        一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
      REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,Roy Fielding是 HTTP 规范的主要编写者之一。在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

http://www.ruanyifeng.com/blog/2011/09/restful.html

http://www.ruanyifeng.com/blog/2014/05/restful_api.html

Spring MVC对RESTful的支持

       spring mvc 通过@PathVariable注解获取各类参数变量。@PathVariable允许对应的参数为空。

API设计

  • GET /collection:返回资源对象的列表(数组)

               获取图书信息列表:/book

  • GET /collection/resource:返回单个资源对象

               获取指定图书信息:/book/id

  • POST /collection:返回新生成的资源对象

               创建(保存)图书信息:/book

  • PUT /collection/resource:返回完整的资源对象

               修改(编辑)图书信息:/book

  • PATCH /collection/resource:返回完整的资源对象
  • DELETE /collection/resource:返回一个空文档

               删除图书信息:/book/id

       如获取一个图书信息:/book/1,其中1就是一个参数,它代表的是图书编号,只是它在url中传递,对此SpringMVC也提供了良好的支持.现在指定一个方法,它将只支持HTTP的GET请求,通过URL:/book/1来获取图书信息并且打印出json数据

      在IBM的开发者社区中有一篇非常好的文章,名为《使用Spring 3来创建RESTful Web Services》,讲解如何用Spring Web和Spring MVC来创建REST风格的Web Service。由于这篇文章已经讲得很好了,只给大家介绍下swagger2的使用

Swagger2简介【补充】

        Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。

  作用:

  1.  接口的文档在线自动生成。
  2. 功能测试。

swagger2注解介绍:

 

    swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等,如: 

  • @ApiIgnore:使用注解忽略该API,不会参与文档生成
  • @ApiOperation:描述该api,如: @ApiOperation(value=”创建用户”, notes=”根据User对象创建用户”)
  • @ApiImplicitParam(name = “user”, value = “用户详细实体user”, required = true, dataType = “User”):描述参数信息
  • @Api:修饰整个类,描述Controller的作用
  • @ApiParam:单个参数描述
  • @ApiModel:用对象来接收参数
  • @ApiResponses:HTTP响应整体描述
  • @ApiProperty:用对象接收参数时,描述对象的一个字段

构建基于RESTful风格的图书服务(继承swagger2--非必须)

step1 :添加依赖

dependencies {
    compile group: 'org.springframework', name: 'spring-context', version: '5.1.7.RELEASE'
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.1.7.RELEASE'
	compile group: 'org.springframework', name: 'spring-test', version: '5.1.7.RELEASE'
	providedCompile group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3'
	providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
	compile group: 'taglibs', name: 'standard', version: '1.1.2'
	compile group: 'javax.servlet', name: 'jstl', version: '1.2'
	compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
	compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
	compile group: 'org.mybatis', name: 'mybatis-spring', version: '2.0.1'
	compile group: 'org.mybatis', name: 'mybatis', version: '3.5.1'
	compile group: 'com.alibaba', name: 'druid', version: '1.1.16'
	compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
	compile group: 'org.springframework', name: 'spring-jdbc', version: '5.1.7.RELEASE'
	compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'
	compile group: 'org.hibernate', name: 'hibernate-validator', version: '6.0.16.Final'
	compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.9'
}
 step2 初始化spring IoC上下文和初始化映射请求上下文
Spring IoC(root)容器配置
@Configuration
@ComponentScan(basePackages = "com.wise.tiger",excludeFilters = @Filter(value= Controller.class))
@PropertySource(value = "classpath:pool-config.properties",encoding = "UTF-8")
@MapperScan(basePackages = "com.wise.tiger.mapper" )
@EnableTransactionManagement
public class RootConfig {
	/**
	 * 配置数据源
	 */
	@Bean
	public DataSource dataSource(
			@Value("${driverClassName}") String driverClass,
			@Value("${url}") String url,
			@Value("${jdbc.username}") String username,
			@Value("${password}") String password,
			@Value("${defaultAutoCommit}") boolean defaultAutoCommit,
			@Value("${connectionProperties}") String connectionProperties) {
		var dataSource = new DruidDataSource();
		dataSource.setDriverClassName(driverClass);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		dataSource.setDefaultAutoCommit(defaultAutoCommit);
		dataSource.setConnectionProperties(connectionProperties);
		return dataSource;
	}
	/**
	 * 配置SqlSessionFactory
	 * SqlSessionFactory是产生SqlSession的基础,在MyBatis-Spring项目中提供了SqlSessionFactoryBean去支持SqlSessionFactory的配置
	 */
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		
		var factoryBean = new SqlSessionFactoryBean();
		//设置类型别名
		factoryBean.setTypeAliasesPackage("com.wise.tiger.domain");
		//设置数据源
		factoryBean.setDataSource(dataSource);
		//ResourcePatternResolver定义了getResources来查找资源,PathMatchingResourcePatternResolver提供了以classpath开头的通配符方式查询
		var resourcePatternResolver = new PathMatchingResourcePatternResolver(); 
		factoryBean.setMapperLocations(resourcePatternResolver.getResources("classpath*:com/wise/tiger/mapper/**/*.xml"));
		return factoryBean.getObject();
	}
	
	/**
	 * 事务管理器(Mybaits采用DataSourceTransactionManger)
	 */
	@Bean
	public DataSourceTransactionManager transactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
}
 数据源配置文件properties内容如下
driverClassName = com.mysql.cj.jdbc.Driver
url = jdbc:mysql://192.168.134.128:3306/db_book
jdbc.username = tiger
password = tiger

########## dbcp连接池基本属性 #############
# 初始化连接
initialSize=20
#最大连接数量,设 0 为没有限制
maxTotal = 0
#最大空闲连接
maxIdle = 10
#最小空闲连接
minIdle = 3
#超时等待时间以毫秒为单位
maxWaitMillis = 1000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;]
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties = serverTimezone=UTC;useSSL=false;useUnicode=true;characterEncoding=utf-8;allowPublicKeyRetrieval=true

#指定由连接池所创建的连接的自动提交(auto-commit)状态。如果指定为false表示关闭自动提交
defaultAutoCommit = false

#driver default 指定由连接池所创建的连接的只读(read-only)状态。默认false
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
#defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
#defaultTransactionIsolation = REPEATABLE_READ
                                                            dispatcherServlet的URI映射关系配置
/**
 * @Description: DispatcherServlet 配置
 * @author: <a href="mailto:1020zhaodan@163.com">Adan</a> 
 * @date: 2019年5月28日  上午10:00:31
 * @version:1.0-snapshot
 */
@Configuration
@ComponentScan(basePackages = "com.wise.tiger.web")
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer{
	//视图解析器
	@Bean
	public InternalResourceViewResolver viewResolver() {
		var viewResolver = new InternalResourceViewResolver();
		viewResolver.setPrefix("/WEB-INF/pages/");
		viewResolver.setSuffix(".jsp");
		return viewResolver;
	}

	@Override //静态资源不被前端控制器拦截
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/static/**")//添加静态资源的url-pattern
			.addResourceLocations("/static/");
	}
	
}
 servlet3.0规范允许没有web.xml配置,只需要使用注解就可以了。spring3.1之后的版本也提供了注解方式的配置, 该方式需要继承AbstractAnnotationConfigDispatcherServletInitializer类,然后实现它所定义的方法。

 

public class WebAppInitializer  extends AbstractAnnotationConfigDispatcherServletInitializer{
	/**
	 * Spring IoC(root)容器配置
	 */
	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class<?>[] {RootConfig.class};
	}

	/**
	 * DispatcherServlet的URI映射关系配置
	 */
	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class<?>[] {WebConfig.class,Swagger2Config.class};
	}
	
	/**
	 * dispatcherServlet 拦截内容(什么请求交给前端控制器)
	 * <url-pattern>/</url-pattern>
	 */
	@Override
	protected String[] getServletMappings() {
		return new String[] {"/"};
	}

	/**
	 * 添加过滤器Filter
	 */
	@Override
	protected Filter[] getServletFilters() {
		return new Filter[] {
				new CharacterEncodingFilter("UTF-8", true, true)//spring提供的字符编码过滤器
			};
	}
}
  原理:servlet3.0之后的版本允许动态加载servlet,只是按照规范需要实现ServletContainerInitializer接口。于是spring mvc在自己的包内实现了一个类SpringServletContainerInitializer,它实现了ServletContainerInitializer接口, 这样就能够通过它去加载我们提供的WebAppInitializer类。其中关于Swagger2的配置:
@Configuration
@EnableSwagger2
public class Swagger2Config {
    /**
     * 创建API应用
     * appinfo()增加API相关信息
     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制那些接口暴露给Swagger来展现
     * 本例采用置顶扫描的包路径来定义指定要建立API的目录
     */
    @Bean
    public Docket createRestApi() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select() // 选择那些路径和api会生成document
                .apis(RequestHandlerSelectors.basePackage("com.wise.tiger.web.controller"))
                .paths(PathSelectors.regex("/book*")).build();//PathSelectors.any()对所有路径进行监控
        return docket;
    }


    /**
     * 创建改API的基本信息(这些基本信息会展示在文档页面中)
     * 访问地址: http://项目实际地址/swagger-ui.html
     */
    public ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring MVC 中使用Swagger2构建RESTful API")
                .description("此API提供接口测试调用")
                .termsOfServiceUrl("https://adan-chiu.iteye.com/")
                .license("License Version 1.0")
                .licenseUrl("https://adan-chiu.iteye.com/")
                .version("1.0").build();
    }
}
 控制器添加对接口文档的支持
/**
 * 构建基于RESTful风格的webservice接口
 */
@Api(tags = "book webservice 服务")
@RestController
public class BookController {
    @Autowired private BookService service;

    @ApiOperation(httpMethod = "POST", value = "保存图书",consumes = "JSON",produces = "JSON")
    @PostMapping("/book")
    public Book save(@RequestBody Book book){
        return service.save(book);
    }

    @ApiOperation(value = "根据图书编号加载图书信息",produces = "JSON")

    @GetMapping("/book/{id}")
    public Book findById(@PathVariable("id") Integer id){
        return service.find(id);
    }

    @GetMapping("/book") @ApiOperation(httpMethod = "GET", value = "分页加载图书信息",produces = "JSON")
    public PageView<Book> find(@RequestParam(defaultValue = "1") Integer currentPage,
                         @RequestParam(defaultValue = "10") Integer pageSize){
        return service.list(currentPage,pageSize);
    }

    @ApiOperation(value = "根据图书编号删除图书信息",produces = "JSON")

    @DeleteMapping("/book/{id}")
    public Book remove(@PathVariable("id") Integer id){
        return service.remove(id);
    }

    @ApiOperation(httpMethod = "PUT", value = "编辑图书信息",consumes = "JSON",produces = "JSON")
    @PutMapping("/book")
    public Book edit(@RequestBody Book book){
        return service.edit(book);
    }
}
 生成文档

 提供测试

 
分享到:
评论

相关推荐

    spring mvc restful service

    - **XML**:对于XML,Spring MVC同样支持使用JAXB进行序列化和反序列化。可以使用`@XmlRootElement`和`@XmlElement`等注解来标记Java类和属性。 4. **Maven工程**:Maven是Java项目管理工具,负责依赖管理和构建...

    RESTful_Spring3MVC

    Spring 3 MVC框架是Java开发者广泛使用的构建Web应用的工具,它为开发RESTful API提供了强大的支持。本教程将深入探讨如何利用Spring 3 MVC实现RESTful服务。 首先,理解REST的基本原则至关重要。RESTful架构有以下...

    [spring 3.0] mvc 整合 restful 、maven实例 下载

    这里,`&lt;mvc:annotation-driven&gt;`启用对注解驱动的控制器的支持,`&lt;context:component-scan&gt;`扫描指定包下的所有类,以便自动发现和注册`@Controller`注解的类。 至于Maven,它是Java项目管理工具,可以帮助我们...

    精通Spring MVC 4

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    最全最经典spring-mvc教程

    除此之外,教程可能还会涵盖Spring MVC的RESTful API设计,如何创建JSON响应,以及使用Spring Boot快速构建Spring MVC应用。Spring Boot简化了配置,提供了预配置的依赖,使得开发者能更快地启动项目。 错误处理和...

    spring mvc 4.0

    5. **RESTful支持**:4.0版本增强了对RESTful Web服务的支持,通过@RequestMapping和HTTP方法(GET、POST、PUT、DELETE等)的结合,更方便地创建RESTful API。 6. **数据绑定与验证**:Spring MVC提供了数据绑定和...

    Spring MVC 4.2.3

    3. **RESTful支持**:Spring MVC提供了对RESTful风格的HTTP方法(如GET、POST、PUT、DELETE等)的优秀支持,便于构建符合REST原则的Web服务。 4. **ModelAndView对象的改进**:此版本对`ModelAndView`对象进行了...

    Spring mvc RESTful demo

    Spring MVC 自动支持 JSON 序列化和反序列化,通过 `@RequestBody` 和 `@ResponseBody` 注解,Spring 能够自动将 Java 对象转换为 JSON,反之亦然。 7. **错误处理** 可以通过自定义异常处理器(`@...

    Mastering Spring MVC 4(2015.09)源码

    此外,Spring MVC 4还支持RESTful风格的Web服务,通过@RequestMapping注解的produces和consumes属性,可以处理不同格式的HTTP请求和响应,如JSON、XML等。 总的来说,"Mastering Spring MVC 4(2015.09)源码"提供了...

    spring MVC .docx

    15. **Internationalization (i18n) and Localization (l10n)**: Spring MVC提供对国际化和本地化的支持,允许根据不同地区展示不同的内容。 总的来说,Spring MVC为开发高效、灵活和可扩展的Web应用程序提供了强大...

    Spring MVC RESTFUL接口实例和android测试客户端

    Spring MVC 支持创建RESTful接口,使得服务端与客户端之间的交互变得更加简洁高效。 在Spring MVC中实现RESTful接口,我们需要遵循以下步骤: 1. **配置Spring MVC**:在`web.xml`中配置DispatcherServlet,并在...

    Spring MVC 教程快速入门 深入分析

    Spring MVC是一种基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,使用了IoC容器,支持RESTful风格的应用程序开发。Spring MVC通过分离模型(Model)、视图(View)和控制器(Controller)来简化Web开发...

    Spring MVC 4.2.4.RELEASE 中文文档

    Spring MVC支持构建RESTful服务,通过HTTP方法如GET、POST、PUT、DELETE等,实现资源的增删改查操作。 **8. 自动配置与依赖注入** 利用Spring Boot的自动配置和Spring的依赖注入,开发者可以轻松地配置和管理Spring...

    spring3 mvc restful freemarker jquery json

    综上所述,这个整合架构提供了一种高效的Web开发模式,Spring3 MVC处理后端逻辑,RESTful设计优化了接口,FreeMarker生成动态页面,jQuery简化了前端交互,而JSON则作为数据交换的桥梁。这样的组合能够帮助开发者...

    自动配置和Spring MVC来创建一个RESTful Web服务.rar

    本压缩包文件“自动配置和Spring MVC来创建一个RESTful Web服务.rar”提供了一个详细指南,教你如何利用Spring Boot和Spring MVC创建RESTful Web服务。以下是关于这些知识点的详细解释: 1. **Spring Boot**: ...

    Spring+restful.zip

    这个压缩包可能是为了帮助开发者快速搭建一个支持RESTful API的Spring MVC项目。 描述中的"springmvc+restful整合jar包开箱即用!"意味着这个压缩包内包含了一些预配置的库和配置文件,使得用户可以直接使用,无需...

    SpringMVCDemo:Spring MVC 框架知识案例

    10.Spring + Spring MVC + JDBCTemplate 整合并通过 RESTful 风格获取所有用户信息案例 11.Spring MVC 数据绑定案例 12.Spring MVC 实现 JSON 数据返回案例 13.Spring MVC 文件的上传与下载案例 14.Spring MVC 拦截...

    Spring mvc5.0.3 所有jar包

    12. **WebSocket支持**: Spring MVC 5.0.3版本引入了对WebSocket的支持,可以用来实现双向通信,提供实时应用功能。 13. **Spring Expression Language (SpEL)**: SpEL是Spring框架的一部分,允许在运行时动态访问...

    Spring mvc实现Restful返回xml格式数据实例详解

    总结来说,Spring MVC提供的注解和配置选项能够极大地方便开发者构建RESTful API,并支持返回XML格式的数据。开发者通过添加一些注解,配置Spring MVC框架,便可以轻松地实现对象到XML的自动序列化,让后端开发人员...

Global site tag (gtag.js) - Google Analytics