• 简介

  REST 即 Representational State Transfer。(资源)表现层状态转化。是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用,POST, DELETE, PUT, GET 分别对应 CRUD。Spring3.0 开始支持 REST 风格的请求,是通过 org.springframework.web.filter.HiddenHttpMethodFilter 把 POST 请求转化为 PUT 和 DELETE 请求。本次实验采用的是 Spring4.0 。

  • HiddenHttpMethodFilter 源码
public static final String DEFAULT_METHOD_PARAM = "_method";

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException { String paramValue = request.getParameter(this.methodParam);
if ("POST".equals(request.getMethod()) && StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
HttpServletRequest wrapper = new HttpMethodRequestWrapper(request, method);
filterChain.doFilter(wrapper, response);
}
else {
filterChain.doFilter(request, response);
}
}

  从 HiddenHttpMethodFilter 的源码可以看出,Spring 根据请求中的 _method 参数进行转化,因此如果想发起 REST 风格的 DELETE 或者 PUT 请求,只需要在表单中带上 _method 参数,并且把 _method 的值设置为 DELETE 或者 PUT(大写) 即可。详细例子如下:

  1. 在 web.xml 中配置 HiddenHttpMethodFilter
  2. 编写 handler 代码
  3. 编写页面
    <!-- 配置 org.springframework.web.filter.HiddenHttpMethodFilter ,可以把 POST 请求转化为 PUT 或者 DELETE 请求 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
package rex.springmvc.handlers;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; @RequestMapping(value="/restTest")
@Controller
public class RestTestHandler {
private static final Logger logger = Logger.getLogger(RestTestHandler.class);
private static final String SUCCESS = "success"; @RequestMapping(value="/restGet/{id}", method=RequestMethod.GET)
public String restGet(@RequestParam(value="id", required=false) Integer id){
logger.debug("restGet:" + id);
return SUCCESS;
} @RequestMapping(value="/restPut/{id}", method=RequestMethod.PUT)
public String restPut(@RequestParam(value="id", required=false) Integer id){
logger.debug("restPut:" + id);
return SUCCESS;
} @RequestMapping(value="/restDelete/{id}", method=RequestMethod.DELETE)
public String restDelete(@RequestParam(value="id", required=false) Integer id){
logger.debug("restDelete:" + id);
return SUCCESS;
} @RequestMapping(value="/restPost", method=RequestMethod.POST)
public String restPost(){
logger.debug("restPost");
return SUCCESS;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Rest Test</title>
</head>
<body>
<br>
<br>
<a href="restTest/restGet/1">Test Rest Get</a> <br>
<br>
<form action="restTest/restPut/1" method="post">
<input type="hidden" name="_method" value="PUT"> <input
type="submit" value="submit">
</form> <br>
<br>
<form action="restTest/restDelete/1" method="post">
<input type="hidden" name="_method" value="DELETE"> <input
type="submit" value="submit">
</form> <br>
<br>
<form action="restTest/restPost" method="post">
<input type="submit" value="submit">
</form>
</body>
</html>

注:handler 中 @RequestParam 注解必须加上 required 参数,否则访问页面会出现400错误。

欢迎转载,转载必须标明出处

SpringMVC REST 风格请求介绍及简单实践的更多相关文章

  1. Thrift简单实践

    0.什么是RPC RPC(Remote Procedure Call - 远程过程调用),是通过网络从远程计算机上请求服务,而不需要了解底层网路技术的细节.简单点说,就是像调用本地服务(方法)一样调用 ...

  2. 学习SpringMVC——如何获取请求参数

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他(@CookieValue)!她(@ModelAndView) ...

  3. JSR 303 - Bean Validation 介绍及最佳实践

    JSR 303 - Bean Validation 介绍及最佳实践 JSR 303 – Bean Validation 是一个数据验证的规范,2009 年 11 月确定最终方案.2009 年 12 月 ...

  4. JAVAEE——SpringMVC第一天:介绍、入门程序、架构讲解、SpringMVC整合MyBatis、参数绑定、SpringMVC和Struts2的区别

    1. 学习计划   第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a) 框架结构 b) 组件说明 4.SpringMVC整合MyBatis 5.参数绑定 a) Sp ...

  5. Masonry介绍与使用实践 - iOS移动开发周报

    本文转发至 http://www.tuicool.com/articles/MRbaEnB/ 原文  http://www.infoq.com/cn/news/2014/11/masonry-intr ...

  6. springMVC带参数请求重定向

    SpirngMVC返回逻辑视图名 可以分下面几种情况: 1. servlet进行请求转发,返回到jsp页面,如  return "index.jsp" ; 2. servlet 返 ...

  7. Android 设计随便说说之简单实践(合理组合)

    上一篇(Android 设计随便说说之简单实践(模块划分))例举了应用商店设计来说明怎么做模块划分.模块划分主要依赖于第一是业务需求,具体是怎么样的业务.应用商店则包括两个业务,就是向用户展示appl ...

  8. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  9. 快速构建Windows 8风格应用21-构建简单媒体播放器

    原文:快速构建Windows 8风格应用21-构建简单媒体播放器 本篇博文主要介绍如何构建一个简单的媒体播放器. <快速构建Windows 8风格应用20-MediaElement>博文中 ...

随机推荐

  1. gulp实时编译less,压缩合并requirejs模块文件

    gulp的使用命令简单,就几个,gulp的简单使用教材可以参考一点的gulp使用教材(http://www.ydcss.com/archives/18). 下面就简单的介绍这些命令如何互相配合的完成前 ...

  2. Java豆瓣电影爬虫——减少与数据库交互实现批量插入

    节前一个误操作把mysql中record表和movie表都清空了,显然我是没有做什么mysql备份的.所以,索性我把所有的表数据都清空的,一夜回到解放前…… 项目地址:https://github.c ...

  3. viewpager翻页的窗帘效果动画

    前端时间比较忙,好长时间没有更新微博,就工作中出现的部分问题,与大家分享一下. 大家都知道viewpager在android开发中是运用率比较高的控件,现在就其窗帘下过的动画分享. 文章出处:http ...

  4. ArcGIS制图表达Representation-制图表达使用须知

    ArcGIS制图表达Representation-制图表达使用须知 by 李远祥 前面章节也介绍了一些制图表达的适用范围和场景,如果有觉得需要使用制图表达去完成其工作的话,还需要注意制图表达的一些技术 ...

  5. 面试之Java知识整理

    1.面向对象都有哪些特性 继承.封装.多态性.抽象 2.Java中实现多态的机制是什么? 继承与接口 3.Java中异常分为哪些种类 3.1按照异常需要处理的时机分为编译时异常(CheckedExce ...

  6. iOS 测试三方 KIF 的那些事

    一: KIF 三方库的配置   今天的广州天气还不错,原本想试试UI测试的,前几天也了解到很多公司都在用 KIF 这这三方框架!!今天也就试着做做,可就跪在了这个安装上,我用cocopods 导入了 ...

  7. ZooKeeper的注意事项

    在ZooKeeper中存储的数据是以字节数组的形式存储的,当用Java程序处理数据时要注意. Ephemeral znodes并不会有child znode 只有parent-znode存在,才能创建 ...

  8. wikioi 3132 高精度乘法(FFT)

    第一次学FFT,先膜拜一下法法塔大神ORZ 关于FFT的话,有一篇博文特别赞http://z55250825.blog.163.com/blog/static/15023080920143127465 ...

  9. SQL中的join连接查询

      inner join(交集 ,自然连接, 简写成join)   是最普通的连接查询,相当于早期根据where条件连接的查询     outer join(并集或部分并集,左表 + 右表)   le ...

  10. 2017-2-23 C#基础 for循环

    循环语句主要有:for;while;foreach.最常用的是for循环.for循环的四要素:初始条件:循环条件:循环体:状态改变.for循环的顺序是:初始条件--循环条件--循环体--状态改变.br ...