SpingMVC——REST及RESTful架构

1.什么是REST?
表述性状态转移,是web服务器的一种架构风格,就是一种架构。
它是轻量级、跨平台、跨语言的一个架构。它是一种设计风格但不是标准。
表述性:就是通过各种各样的格式来描述你的资源
状态:REST只关心资源的状态,并不关心它的行为,比如:关心
资源在不在、有没有修改.
转移:比如将html文件转译为JSON
——实现前后端分离(设计一套API提供给各个产品实现)
2.什么是RESTful
一个架构符合REST原则,我们成为RESTful架构。
3.Spring如何支持REST
(1)支持的方式
*控制器可以处理所有的HTTP方法。包括四个主要的REST方法:GET,PUT,DELETE,POST。
*通过@PathVariable注解,控制器能够处理参数化URL。
*借助Spring的视图和视图解析器,资源能够以多种方式进行表达。
*借助 RestTemplate 类Spring应用能方便的使用REST资源 。
(2)资源转换
Spring提供了两种方法将资源的java表述形式转化为客户端的表达式:
*内容协商:选择一个视图,它能够将模型渲染为呈现给客户端的表达式。
*消息转换器:通过一个消息转化器将控制器所返回的对象转换为呈现给客户端的表属形式。
下面我们来看看消息转换器具体的实现方式:
我们常用的消息转换器有:
GsonHttpMessageConverter
StringHttpMessageConverter
(1)创建项目
在这里插入图片描述
(2)pom文件配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wschase</groupId>
    <artifactId>springmvc-case-rest</artifactId>
    <version>1.0.0</version>

    <!--打包类型-->
    <packaging>war</packaging>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>4.3.9.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>


        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!--上传文件-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!--JSON处理库-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-oxm</artifactId>
        </dependency>


        <!--日志依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.12</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <target>1.8</target>
                    <source>1.8</source>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

(3)web.xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">
    
    <display-name>Welcome to Spring MVC</display-name>
    
    <description>
        Welcome to Spring MVC REST
    </description>

    <!--1.上下文,与Spring Core容器相关-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--2.前端控制器,导演-->
    <servlet>
        <servlet-name>servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:application-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--3.欢迎页面-->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
    
</web-app>

(4)具体实现

package com.wschase.rest.control;

import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Author:WSChase
 * Created:2019/5/4
 */
@RestController
//在这个RestController里面加了@ResponseBody,这样的话就意味着我们在RestController里面写的都将作为响应内容进行处理
//而不会作为视图。

//1.返回一个文本
@RequestMapping(value = "/system")
public class SystemInfoController {
    @RequestMapping(value = "/index",method = {RequestMethod.GET})
    public String index(){
        return "hello";//作为一个文本信息返回给我们的用户
    }

    //2.返回一个JSON
    @RequestMapping(value = "/info",method = {RequestMethod.GET})
    public Map<String,String> info(){
        Map<String, String> data = new HashMap<>();
        data.put("date_time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        Runtime runtime = Runtime.getRuntime();
        data.put("server_processor", String.valueOf(runtime.availableProcessors()));
        data.put("server_total_memory", runtime.totalMemory() / 1024 / 1024 + " MB");
        data.put("server_max_memory", runtime.maxMemory() / 1024 / 1024 + " MB");
        data.put("server_free_memory", runtime.freeMemory() / 1024 / 1024 + " MB");

        return data;
    }

    /**
     * 3.将我的请求数据转化成一个Java对象
     * 这个过程体现了RESTful的整个流程:
     * 将请求数据(需要是JSON格式的)转化为java对象,再将java对象转化为响应数据
     * 注意:你返回的类型要么是你自定义的java类型、要么是HashMap或者ArrayList,不要返回JSON对象
     * 它会自动将你的返回类型转化为JSON类型
     * @param user
     * @return
     */
    @RequestMapping(value = "/user",method = {RequestMethod.POST})
    public User query(@RequestBody User user){
        return user;
    }

    public static class User{
        private String name;
        private Integer age;
        private String address;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }
    }
}

(5)运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值