Spring MVC 与 Restful 风格

本文介绍了 Restful 架构风格的概念、优点和特性,并详细阐述了 Spring MVC 如何支持 Restful 请求,包括资源定位、操作方法以及在实际应用中的示例。通过对 URL 设计和 HTTP 动词的利用,Spring MVC 能够实现清晰、直观的接口设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

毫无疑问,Spring MVc 对 Restful ⻛格请求是支持的。

一、Restful 相关概念

1、什么是 Restful?

Restful 是一种 web 软件架构⻛格,它不是标准也不是协议,它倡导的是一个资源定位及资源操作的⻛格。

2、什么是 REST?

REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统, 比如 web 应用程序。
它并没有一个明确的标准,而更像是一种设计的⻛格。
它本身也并没有什么实用性,其核心价值在于如何设计出符合 REST ⻛格的网络接口。

3、Restful 的优点

它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

4、Restful 的特性

1)资源(Resources)

网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。
可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的 URI 。
要获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。

2)表现层(Representation)

把资源具体呈现出来的形式,叫做它的表现层(Representation)。
比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二进 制格式。

3)状态转化(State Transfer)

每发出一个请求,就代表了客户端和服务器的一次交互过程。
HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。
因此,如果客户端想要操作服务器, 必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。
而这种转化是建立在表现层之上的,所以就是“表现层状态转化”。
具体说, 就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。
它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

5、Restful 的示例

rest 是一个 url 请求的⻛格,基于这种⻛格设计请求的 url。

1)没有 rest 的话,原有的 url 设计:

http://localhost:8080/user/queryUserById.action?id=3
url 中定义了动作(操作),参数具体锁定到操作的是谁。

2)有了 rest ⻛格之后。

rest 中,认为互联网中的所有东⻄都是资源,既然是资源就会有一个唯一的 uri 标识它,代表它。
http://localhost:8080/user/3:代表的是 id 为 3 的那个用户记录(资源)。

3)锁定资源之后如何操作它呢?常规操作就是增删改查。

根据请求方式不同,代表要做不同的操作。
get 查询,获取资源;
post 增加,新建资源;
put 更新;
delete 删除资源。

rest ⻛格带来的直观体现:就是传递参数方式的变化,参数可以在 uri 中了。
/account/1 HTTP GET :得到 id = 1 的 account;
/account/1 HTTP DELETE:删除 id = 1 的 account;
/account/1 HTTP PUT:更新 id = 1 的 account。

6、URL

资源定位符,通过 URL 地址去定位互联网中的资源(抽象的概念,比如图片、视频、app服务等)。

7、Restful ⻛格 URL

互联网所有的事物都是资源,要求 URL 中只有表示资源的名称,没有动词。

8、Restful ⻛格资源操作

使用 HTTP 请求中的 method 方法 put、delete、post、get 来操作资源。分别对应添加、删除、修改、查询。不过一般使用时还是 post 和 get,put 和 delete 几乎不使用。

9、Restful ⻛格资源表述

可以根据需求对 URL 定位的资源返回不同的表述(也就是返回数据类型,比如 XML、JSON 等数据格式)。

二、Spring MVC 对 Restful 的支持⻛格请求

Spring MVC 支持 Restful ⻛格请求,具体讲的就是使用 @PathVariable 注解获取 Restful ⻛格的请求 URL 中的路径变量。

示例代码

1、前端 jsp ⻚面

<div>
    <h2>Spring MVC 对 Restful ⻛格 url 的支持</h2>
    <fieldset>
        <p>测试用例:Spring MVC 对 Restful ⻛格 url 的支持</p>
        
        <a href="/demo/handle/15">rest_get 测试</a>
        
        <form method="post" action="/demo/handle">
            <input type="text" name="username"/>
            <input type="submit" value="提交 rest_post 请求"/>
        </form>
        
        <form method="post" action="/demo/handle/15/lisi">
            <input type="hidden" name="_method" value="put"/>
            <input type="submit" value="提交 rest_put 请求"/>
        </form>
        
        <form method="post" action="/demo/handle/15">
            <input type="hidden" name="_method" value="delete"/>
            <input type="submit" value="提交 rest_delete 请求"/>
        </form>
    </fieldset>
</div>

2、后台 Handler 方法

/** 
 * restful  get  /demo/handle/15
 */
@RequestMapping(value = "/handle/{id}",method = {RequestMethod.GET})
public ModelAndView handleGet(@PathVariable("id") Integer id) {
    
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}

/** 
 * restful  post  /demo/handle/jason
 */
@RequestMapping(value = "/handle/{name}", method = 
        {RequestMethod.POST})
public ModelAndView handlePost(@PathVariable("name") String username) {
    
    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}

/** 
 * restful  put  /demo/handle/15/lisi
 */
@RequestMapping(value = "/handle/{id}/{name}",method = 
        {RequestMethod.PUT})
public ModelAndView handlePut(@PathVariable("id") Integer id, 
        @PathVariable("name") String username) {

    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}

/** 
 * restful  delete  /demo/handle/15
 */
@RequestMapping(value = "/handle/{id}",method =
        {RequestMethod.DELETE})
public ModelAndView handleDelete(@PathVariable("id") Integer id) {

    Date date = new Date();
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("date",date);
    modelAndView.setViewName("success");
    return modelAndView;
}

3、web.xml 中配置请求方式过滤器(将特定的 post 请求转换为 put 和 delete 请求)

<!-- 
    配置 spring mvc 请求方式转换过滤器,
    会检查请求参数中是否有 _method 参数,
    如果有就按照指定的请求方式进行转换。
 -->
<filter>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.HiddenHttpMethodFilter
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
    <filter-name>hiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

文章内容输出来源:拉勾教育Java高薪训练营;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jason559

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值