SpringMVC学习笔记-REST风格请求实现
RESTful概念及功能
RESTful的概念:RESTful是 一种资源定位及资源操作的风格,其本身既不是标准也不是协议,而是一种设计风格,可以使得软件整体层次更加分明、代码更加简洁,并且有利于实现缓存等机制。
RESTful的功能:RESTful主要体现在对软件资源的操作上,把请求方法分为了POST、DELETE、PUT、GET四个部分,各个方法对资源进行操作分别对应了增删改查四个功能,使得代码整体层次分明。
RESTful与传统操作资源的对比:传统方式对资源操作形式单一,只有GET、POST两种方式,对于增删改查各种方式往往难以加以区分,且部分参数在url中过于暴露,各种不同参数实现不同效果
http://127.0.0.1/user/query?id=1 ;查询用户(GET)
http://127.0.0.1/user/add ;新增用户(POST)
http://127.0.0.1/user/update ;更新用户(POST)
http://127.0.0.1/user/delete?id=1 ;删除用户(GET或POST)而RESTful确能很好地解决这个问题,可以将增删改查分为POST、DELETE、PUT、GET,并可以通过相同的请求地址实现
http://127.0.0.1/user/1 ;查询用户(GET)
http://127.0.0.1/user ;新增用户(POST)
http://127.0.0.1/user ;更新用户(PUT)
http://127.0.0.1/user/1 ;删除用户(DELETE)
SpringMVC实现RESTful风格
在传统jsp及大部分浏览器中只能处理POST、GET请求,在SpringMVC中针对这两种请求可以正常处理,并且在该框架控制器 @RequestMapping 注解中提供了method参数用以注明请求方式,可以使同参数请求实现不同功能
@RequestMapping(value="testRest/{id}",method = RequestMethod.POST)
public String testPost(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
@RequestMapping(value="testRest/{id}",method = RequestMethod.GET)
public String testGet(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
但对于 DELETE、 PUT而言则无法通过简单的注解标明实现,因此为了能够使RESTful风格能够正常实现,SpringMVC中通过在Filter过滤器中添加 HiddenHttpMethodFilter类处理来实现对DELETE、PUT的处理, HiddenHttpMethodFilter类源码中对请求的处理如下:
/** Default method parameter: {@code _method}. */
public static final String DEFAULT_METHOD_PARAM = "_method"; //默认_method规范
private String methodParam = DEFAULT_METHOD_PARAM;
/**
* Set the parameter name to look for HTTP methods.
* @see #DEFAULT_METHOD_PARAM
*/
public void setMethodParam(String methodParam) {
Assert.hasText(methodParam, "'methodParam' must not be empty");
this.methodParam = methodParam;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
HttpServletRequest requestToUse = request;
if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) { //POST及隐藏域条件判断
String paramValue = request.getParameter(this.methodParam); // 获取name为_method的value
if (StringUtils.hasLength(paramValue)) {
String method = paramValue.toUpperCase(Locale.ENGLISH);
if (ALLOWED_METHODS.contains(method)) {
requestToUse = new HttpMethodRequestWrapper(request, method); //将name为_method的value设置为新的请求方式
}
}
}
filterChain.doFilter(requestToUse, response); // 返回更改后的request
}
在这段处理代码中,只针对了 POST和 WebUtils.ERROR_EXCEPTION_ATTRIBUTE为空的请求进行处理,并且最终返回请求类型为method的value,因此SpringMVC处理DELETE、PUT等附加请求时,需要遵守 Method 为 POST且存在类型为 hidden 、name 为 method 、value 为指定请求方式的隐藏域约定,默认格式表单如下
<form action="SpringMVCHandler/testRest/1234" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="删">
</form>
在经过HiddenHttpMethodFilter过滤器处理后,系统交由controller处理,此时@RequestMapping便可成功识别请求类型,成功完成映射跳转。
@RequestMapping(value="testRest/{id}",method = RequestMethod.DELETE)
public String testDelete(@PathVariable("id") Integer id){
System.out.println("删"+id);
return "success";
}
运行中存在的问题及解决方法
在SpringMVC的RESTful风格实现过程中,往往会遇到一系列问题,这里便给出一些常见问题及其解决方法。
请求兼容问题:在按照上述步骤运行时,极大可能会遇到这一问题:

产生原因:通常这一问题是由于jsp对于DELETE、PUT请求不兼容造成的,在HiddenHttpMethodFilter过滤器将请求处理完成后交由controller处理,但在传统SpringMVC控制器映射处理后,都会返回目标文件名字符串再由配置xml中的视图解析器对返回字符串进行前后缀追加处理,在这过程中DELETE、PUT请求便由jsp处理了,因此便出现了这一问题。
解决方法:针对这一问题,只需要在控制器映射方法前增加@ResponseBody()注释表明返回的时json而不是jsp即可,使返回时跳过视图解析器,因此不会产生请求兼容错误。
中文乱码问题:在表单中传入中文时,可能会产生乱码问题。
产生原因:在发送请求时,虽然jsp页面已经设置了charset=“UTF-8”,但其实页面编码类型还是默认的ISO-8859-1,因此在接收时便会产生乱码。
解决方法:可以参考Java Web中利用Filter过滤器进行编码处理来解决这一问题。
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
System.out.println("haha");
chain.doFilter(req, resp);
}但在SpringMvc中使用改该方法解决编码问题时还需要注意过滤先后问题,即如果在web.xml配置文件中HiddenHttpMethodFilter过滤器位于编码过滤器之前,则在编码过滤器处理编码之前先由HiddenHttpMethodFilter过滤器处理,这样依旧会造成乱码问题,因此需要注意配置文件中过滤器映射先后顺序,尽量将编码过滤器位于最上方,并且不要使用注释方法实现过滤器映射。
SpringMVC学习笔记-REST风格请求实现的更多相关文章
- SpringMVC学习笔记一(请求流程和配置,启动项目)
springmvc请求流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映 ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- springmvc学习笔记(19)-RESTful支持
springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...
- SpringMVC:学习笔记(3)——REST
SpringMVC:学习笔记(3)——REST 了解REST风格 按照传统的开发方式,我们在实现CURD操作时,会写多个映射路径,比如对一本书的操作,我们会写多个URL,可能如下 web/delete ...
- springmvc学习笔记---面向移动端支持REST API
前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- springmvc学习笔记(简介及使用)
springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...
- springmvc学习笔记(常用注解)
springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...
随机推荐
- 关于Vim/Neovim/SpaceVim的一些思考
1 前言 最近看到了Neovim以及SpaceVim,于是上手试了一下. 2 Neovim与SpaceVim Neovim是Vim的一个分支,具有更加现代的GUI.嵌入式以及脚本化的终端.异步工作控制 ...
- ElementPlusViteStarterPnpm版本
1 起因 由于最近Vite升级了2.x版本,项目中需要改动的东西有点多,本来想基于官方给出的starter重做,但是又看到了一个叫pnpm的仓库,构建速度会比原生npm/yarn快两倍以上: 因此模仿 ...
- (十三)Docker容器进入的4种方式
简介 在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见 ...
- linux中[gcc -shared -fPIC]的含义
linux在gcc编译时加上 -shared 参数时,目的是使源码编译成动态库 .so 文件: 而-fPIC的作用是 告知编译器 生成位置无关代码(编译产生的代码没有绝对位置,只有相对位置):从而可以 ...
- 991. Broken Calculator
On a broken calculator that has a number showing on its display, we can perform two operations: Doub ...
- 2.1.1- css产生的原因
CSS的发展历程 从HTML被发明开始,样式就以各种形式存在.不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制.最初的HTML只包含很少的显示属性.随着HTML的成长,为了满足页面设计者的要 ...
- POJ1904 强联通(最大匹配可能性)
题意: 有n个王子,n个公主,然后给你每个王子喜欢的公主,最后问你在不影响最大匹配的前提下,每个王子可以匹配那些公主. 思路: 是hdu4685的减弱版,之前研究过hdu468 ...
- Android Linker 与 SO 加壳技术
1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...
- Windows Server系统加固
目录 账户管理.认证授权 管理账户 管理口令 授权 审核策略 IP协议安全配置 设备其他配置操作 账户管理.认证授权 管理账户 说明: 对于管理员账号,要求更改缺省账户名称,并且禁用 guest (来 ...
- NT 内核函数原型大全
NTSYSAPINTSTATUSNTAPINtAcceptConnectPort(OUT PHANDLE PortHandle,IN PVOID PortIdentifier,IN PPORT_MES ...