Springmvc构造RESTful详细讲解

RESTFul编程风格 阅读详情

Rest介绍

 

/ blog / 1  HTTP GET  =>   得到id  =  1的blog
/ blog / 1  HTTP DELETE  =>  删除 id  =  1的blog
/ blog / 1  HTTP PUT  =>   更新id  =  1的blog
/ blog   HTTP POST  =>   新增BLOG


    以下详细解一下spring rest使用.

    首先,我们带着如下两个问题查看本文。

        1.如何在java构造没有扩展名的RESTful url,如 /forms/1,而不是 /forms/1.do

        2.浏览器的form标签不支持提交delete,put请求,如何曲线解决

    springmvc rest 实现

    springmvc的resturl是通过@RequestMapping 及@PathVariable annotation提供的,
    通过如@RequestMapping(value="/blog /{id}",method=RequestMethod.DELETE)即可处理/blog/1 的delete请求.

 

1 @RequestMapping(value = " /blog/{id} " ,method = RequestMethod.DELETE)
2 public  ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response)  {
3  blogManager.removeById(id);
4  return new ModelAndView(LIST_ACTION);
5}

    @RequestMapping @PathVariable如果URL中带参数,则配合使用,如

 

1 @RequestMapping(value = " /blog/{blogId}/message/{msgId} " ,method = RequestMethod.DELETE)
2 public  ModelAndView delete(@PathVariable( " blogId " ) Long blogId,
55  @PathVariable(
" msgId " ) Long msgId,HttpServletRequest request,
55  HttpServletResponse response) 
{
3}


    1.springmvc web.xml配置

 1 <!--  该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 
55  http://localhost/foo.css ,现在http://localhost/static/foo.css 
-->
 2    < servlet-mapping >
 3    < servlet-name > default </ servlet-name >
 4    < url-pattern > /static/* </ url-pattern >
 5    </ servlet-mapping >
 6    < servlet >
 7      < servlet-name > springmvc </ servlet-name >
 8      < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class >
 9      < load-on-startup > 1 </ load-on-startup >
10    </ servlet >
11
12    <!--  URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css  -->
13    < filter >
14    < filter-name > UrlRewriteFilter </ filter-name >
15    < filter-class > org.tuckey.web.filters.urlrewrite.UrlRewriteFilter </ filter-class >
16    < init-param >
17       < param-name > confReloadCheckInterval </ param-name >
18       < param-value > 60 </ param-value >
19      </ init-param >
20    < init-param >
21          < param-name > logLevel </ param-name >
22          < param-value > DEBUG </ param-value >
23        </ init-param >
24    </ filter >
25    < filter-mapping >
26    < filter-name > UrlRewriteFilter </ filter-name >
27    < url-pattern > /* </ url-pattern >
28    </ filter-mapping >
29
30    <!--  覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射  -->
31    < servlet-mapping >
32      < servlet-name > springmvc </ servlet-name >
33      < url-pattern > / </ url-pattern >
34    </ servlet-mapping >
35
36    <!--  浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法  -->
37    < filter >
38    < filter-name > HiddenHttpMethodFilter </ filter-name >
39    < filter-class > org.springframework.web.filter.HiddenHttpMethodFilter </ filter-class >
40    </ filter >
41
42    < filter-mapping >
43    < filter-name > HiddenHttpMethodFilter </ filter-name >
44    < servlet-name > springmvc </ servlet-name >
45    </ filter-mapping >

 

    2.webapp/WEB-INF/springmvc-servlet.xml配置,使用如下两个class激活@RequestMapping annotation

 

 

1 < bean  class ="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />    
2 < bean  class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />   
3


    3.Controller编写

 1 /**
 2  * @RequestMapping("/userinfo") 具有层次关系,方法级的将在类一级@RequestMapping之一,
 3  * 如下面示例, 访问方法级别的@RequestMapping("/new"),则URL为 /userinfo/new
 4  */

 5 @Controller
 6 @RequestMapping( " /userinfo " )
 7 public   class  UserInfoController  extends  BaseSpringController {
 8  //默认多列排序,example: username desc,createTime asc
 9  protected static final String DEFAULT_SORT_COLUMNS = null;
10
11  private UserInfoManager userInfoManager;
12
13  private final String LIST_ACTION = "redirect:/userinfo";
14
15  /**
16  * 通过spring自动注入
17  **/

18  public void setUserInfoManager(UserInfoManager manager) {
19  this.userInfoManager = manager;
20  }

21
22  /** 列表 */
23  @RequestMapping
24  public ModelAndView index(HttpServletRequest request,
55  HttpServletResponse response,
55  
UserInfo userInfo) {
25  PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS);
26  //pageRequest.getFilters(); //add custom filters 
27
28  Page page = this.userInfoManager.findByPageRequest(pageRequest);
29  savePage(page,pageRequest,request);
30  return new ModelAndView("/userinfo/list","userInfo",userInfo);
31  }

32
33  /** 进入新增 */
34  @RequestMapping(value="/new")
35  public ModelAndView _new(HttpServletRequest request,
55  HttpServletResponse response,
UserInfo userInfo) throws Exception {
36  return new ModelAndView("/userinfo/new","userInfo",userInfo);
37  }

38
39  /** 显示 */
40  @RequestMapping(value="/{id}")
41  public ModelAndView show(@PathVariable Long id,
55  HttpServletRequest request,
HttpServletResponse response) throws Exception {
42  UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
43  return new ModelAndView("/userinfo/show","userInfo",userInfo);
44  }

45
46  /** 编辑 */
47  @RequestMapping(value="/{id}/edit")
48  public ModelAndView edit(@PathVariable Long id,
55  HttpServletRequest request,
HttpServletResponse response) throws Exception {
49  UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
50  return new ModelAndView("/userinfo/edit","userInfo",userInfo);
51  }

52
53  /** 保存新增 */
54  @RequestMapping(method=RequestMethod.POST)
55  public ModelAndView create(HttpServletRequest request,
55  HttpServletResponse response,
55  UserInfo userInfo) 
throws Exception {
56  userInfoManager.save(userInfo);
57  return new ModelAndView(LIST_ACTION);
58  }

59
60  /** 保存更新 */
61  @RequestMapping(value="/{id}",method=RequestMethod.PUT)
62  public ModelAndView update(@PathVariable Long id,
55  HttpServletRequest request,
55  
HttpServletResponse response) throws Exception {
63  UserInfo userInfo = (UserInfo)userInfoManager.getById(id);
64  bind(request,userInfo);
65  userInfoManager.update(userInfo);
66  return new ModelAndView(LIST_ACTION);
67  }

68
69  /** 删除 */
70  @RequestMapping(value="/{id}",method=RequestMethod.DELETE)
71  public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,
HttpServletResponse response) {
72  userInfoManager.removeById(id);
73  return new ModelAndView(LIST_ACTION);
74  }

75
76  /** 批量删除 */
77  @RequestMapping(method=RequestMethod.DELETE)
78  public ModelAndView batchDelete(HttpServletRequest request,
55  HttpServletResponse response) 
{
79  String[] items = request.getParameterValues("items");
80  for(int i = 0; i < items.length; i++) {
81   java.lang.Long id = new java.lang.Long(items[i]);
82   userInfoManager.removeById(id);
83  }

84  return new ModelAndView(LIST_ACTION);
85  }

86
87}
88

 

1 /userinfo  => index()
2   /userinfo/new => _new()
3   /userinfo/{id} => show()
4   /userinfo/{id}/edit  => edit()
5   /userinfo POST => create()
6   /userinfo/{id} PUT => update()
7   /userinfo/{id} DELETE => delete()
8   /userinfo DELETE => batchDelete()
9

 

    
    注(不使用 /userinfo/add  => add() 方法是由于add这个方法会被maxthon浏览器当做广告链接过滤掉,因为包含ad字符)


 

    4.jsp 编写

1 < form:form  action ="${ctx}/userinfo${userInfo.userId}"  method ="put" >
2 </ form:form >


    生成的html内容如下, 生成一个hidden的_method=put,并于web.xml中的HiddenHttpMethodFilter配合使用,

在服务端将post请求改为put请求

1 < form  id ="userInfo"  action ="/springmvc_rest_demo/userinfo/2"  method ="post" >
2    < input  type ="hidden"  name ="_method"  value ="put" />
3 </ form >

 

    另外一种方法是你可以使用ajax发送put,delete请求.

    5.静态资源的URL重写

        如上我们描述,现因为将default servlet映射至/static/的子目录,现我们访问静态资源将会带一个/static/前缀.

        如 /foo.gif, 现在访问该文件将是 /static/foo.gif.

        那如何避免这个前缀呢,那就是应用URL rewrite,现我们使用 http://tuckey.org/urlrewrite/, 重写规则如下

    

1 < urlrewrite >
2     <!--  访问jsp及jspx将不rewrite url,其它.js,.css,.gif等将重写,如 /foo.gif => /static/foo.gif  -->
3     < rule >
4      < condition  operator ="notequal"  next ="and"  type ="request-uri" > .*.jsp </ condition >
5      < condition  operator ="notequal"  next ="and"  type ="request-uri" > .*.jspx </ condition >
6       < from > ^(/.*\..*)$ </ from >
7       < to > /static$1 </ to >
8     </ rule >
9 </ urlrewrite >

 

stable diffusion安装问题求教! 最后的webui-user.bat执行的过程真的是痛苦而漫长,网上什么破教程,问题一个接一个,解决一个就跳出另一个! 阅读详情

相关推荐

ORB-SLAM3 bool Tracking::NeedNewKeyFrame()

是 ORB-SLAM3 的关键帧插入决策器IMU 未初始化:每 0.25s 强制插入,快速积累初始化数据;仅跟踪/建图停止/重定位冷却:直接拒绝;常规判定:时间、空闲、跟踪弱;c2:当前内点相对参考关键帧不足,或近点覆盖不足;二者与运算决定视觉上是否需要新关键帧;c3:IMU 系统 0.5s 强制插入;c4:单目惯性低匹配/丢失恢复;LocalMapper 仲裁:空闲直接插入;忙则中断 BA,双目/RGBD 队列 <3 可插入,单目更严格。它体现了 ORB-SLAM3 在地图密度、跟踪鲁棒性、计算负载。

qq_43002259的博客 44

SpringMVC——RESTful

RESTful 文章目录RESTful1、RESTful简介1.1、资源1.2、资源的表述13、状态转移2、RESTful的实现3、HiddenHttpMethodFilter4、RESTful 案例4.1、准备数据4.1.1、准备实体类:bean.Employee4.1.2、准备 dao 模拟数据4.1.3、准备控制器方法4.2、功能清单4.3、访问首页4.4、具体功能:查询所有员工数据4.5、具体功能:删除4.6、具体功能:跳转到添加数据页面4.7、实现回显功能(修改功能的一部分)4.7、具体功能:修改

前尘忆梦的博客 1679

Spring mvc RESTful demo

NULL 博文链接:https://huangtut.iteye.com/blog/540859

SpringMVC之RestFul风格详解

SpringMVC之RestFul风格详解 RestFul概念 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 功能 资源:互联网所有的事物都可以被抽象为资源 资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。 分别对应 添加、 删除、修改、查询 传统方式操作资源:通过不同的参数来实现不同的效果!方法单一,post 和 get。 http://127.0.0.1/item/

qq_41359998的博客 3021

SpringMVC RESTFUL风格

SpringMVC RESTFUL风格的写法,以及与非RESTFUL的区别

具有PWM控制VSC-HVDC链路的IEEE30总线传输系统(Simulink仿真实现)

内容概要:本文构建了一个包含PWM控制VSC-HVDC链路的IEEE30节点电力传输系统,并基于Simulink平台完成了系统的建模仿真。该模型聚焦于高压直流输电(HVDC)技术在区域电网互联中的应用,采用电压源型换流器(VSC)与脉宽调制(PWM)技术实现高效、灵活的电能传输。研究重点在于分析VSC-HVDC链路在复杂多节点电网中对潮流分布、系统稳定性及电能质量的调控能力,特别关注其在区域电网互联、新能源大规模接入以及跨区域电力交换等场景下的动态响应特性与控制性能,为现代智能电网的发展提供技术支撑与仿真验证手段。; 适合人群:具备电力系统、电气工程或自动化等相关专业背景的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究VSC-HVDC在多节点电网(如IEEE30节点)中的建模与仿真方法;②分析PWM控制策略下HVDC链路对电网潮流分布、电压稳定性和故障穿越能力的影响;③为区域电网互联、新能源并网及智能电网调度等课题提供仿真基础和技术验证。; 阅读建议:此资源以Simulink仿真实现为核心,建议读者在掌握电力电子技术和电力系统分析基础知识的前提下,结合仿真模型深入理解VSC-HVDC的工作原理与控制策略。在学习过程中,应着重关注模型参数设置、控制环路设计及仿真结果的分析,以达到理论与实践相结合的目的。

SpringMVC--RESTful

ReStateTransfer,表现层资源状态转移。RESTful是一种网络架构风格,它定义了如何通过网络进行数据的交互。这种风格基于HTTP协议,使得网络应用之间的通信变得更加简洁和高效。资源(Resource)想象一下,服务器上存储了很多信息,比如文章、图片、用户信息等。在RESTful架构中,我们把这些信息称为“资源”。每个资源都有一个唯一的标识,这个标识通常是URL。就像每个人的身份证号一样,通过这个URL我们可以准确地找到对应的资源。资源的表述(Representation)

sakurapaid的博客 1815

Oracle Primavera P6实战手册:从入门到精通的企业项目管理秘籍

本文详细介绍了Oracle Primavera P6在企业项目管理中的实战应用,从环境配置到高级进度控制技巧,帮助用户从入门到精通。通过WBS设计、资源优化和情景模拟等核心功能,提升项目管理效率。特别适合需要处理复杂项目和多团队协作的企业用户。

weixin_29235923的博客 256

Restful风格的常用四种请求方式

1、GET[select]  请求会向数据库发索取数据的请求,从而来获取信息,其只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容。无论进行多少次操作,结果都是一样的。 2、PUT[update]  请求是向服务器端发送数据的,从而改变信息,其用来修改数据的内容,但是不会增加数据的种类等,无论进行多少次PUT操作,其结果并没有不同。 3、POST[insert]请求同PUT请求类似,...

小熊来了 3万+

用Python玩转ROS机械臂:YOLO目标检测+MoveIt!自动抓取仿真教程

本文详细介绍了如何利用Python集成YOLO目标检测与ROS的MoveIt!运动规划库,实现机械臂的智能抓取仿真。通过Gazebo仿真环境,从视觉感知、坐标转换到运动规划与执行,构建了一套完整的自动化抓取系统,为机器人视觉抓取应用提供了可复现的实践方案。

ppp33的博客 553

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

线程问题求教!谢谢

1 public class SynchronizedClass1 extends Thread{ 2 private Account account; 3 private double drawbalance; 4 public SynchronizedClass1(String name,Account account,double draw...

aixirang3421的博客 129

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3014

求教!SQLite存取图片问题!

我最近刚开始研究WP7,在用SQLite存取图片时遇到个问题,希望高手们指点。 图片转换成二进制存到SQLite时是byte[14361],读出来时却成了byte[13],数据库里图片存储格式是Blob。Why? 这是我的代码: //把图片转换成二进制存入sqlite private byte[] SetPicture() { ...

weixin_30733003的博客 412

NDVI空间分布变化Slope趋势分析与F检验(自用)

1.NDVI数据预处理2.一元线性回归分析3.Slope趋势分析与F检验

什么都学亿点点的博客 9020

KV260-从开箱到人脸识别(小白入门)

波特率选择115200,数据为8位,停止位1位,无奇偶校验,点击链接即可完成通讯。空白的盘格式化之后及进行挂载,这时会被我们的操作系统接手管理,这时就具有了操作系统的属性,复制文件就是在操作系统下的文件系统基础上进行的操作,这个过程是相对的地址进行操作,因此,复制文件是在操作系统环境下完成的更高级的操作模式。空白的盘相当于一整块空白的存储单元,因为没有格式化也不具有文件系统的属性,只有当外部的硬件或者软件写进空白的区域,这种方式是对绝对物理地址进行的操作,因此,烧录文件是独立于操作系统的更低级的写入方式。

qq_53252845的博客 3815

Spring MVC 支持RestFul风格尝试

Spring MVC 核心流程如今的java web开发,大致和以往我们在学校学习的SSH已经大不一样了,现在基本成熟的大公司都使用Spring MVC 快速开发WEB应用。当然小编我也是**Spring MVC**的长期实践者。 首先想和大家普及下我眼中的Spring mcv整个流程过程 Spring MVC 的 restFul风格说实话自己用了这个久的Spring mvc 只知道他请求的链接格式

zzjmay的专栏 3677

MATLAB与图像处理(一):图像中结构张量的求法(Structure Tensor)

1.结构张量的作用:       能够区分图像中的平坦区域,边缘,角点; 2.图像中的结构张量的定义    1)是一个矩阵;    2)与图像的水平,垂直梯度有关,定义如下: 在MATLAB中,可以用如下语句求解:[Ix,Iy]=gradient(Image); 3)求出结构张量矩阵的行列式,和迹(矩阵对角线之和)   行列式:K=det(E);   迹:  

wenyusuran的专栏 5242

springMVC restful风格

RESTful简介 1.REST架构是一个抽象的概念,目前主要是基于HTTP协议实现,其目的是为了提高系统的可伸缩性,降低应用之间的耦合度,便于框架分布式处理程序。 2.REST主要对以下两方面进行了规范 -定位资源的URL风格,例如  http://baidu.com/admin/1234  http://baidu.com/admin/1234/10/11 -如何对资源操作  采...

想吃一口西多 3194

飞行机械臂设计

其后对飞行机械臂系统的机 理模型和基于 ADAMS 的物理模型进行了控制系统的搭建,对于机理模 型,设计了三个输入通道,分别是俯仰力矩,翻滚力矩与偏航力矩,控 制量为翻滚角,俯仰角,偏航角。四旋翼无人机自身具有独特的优势,在无人机上增加机械臂,整个 机体系统相当于一架空中行动自如的空中机器人,可以适应更多的应用场合,能够实现空中抓取,运输载荷,巡航监视等任务。的函数模块如图 4-8 所示,可见输入为 U1,U2,U3,U4,分别对应总力矩,俯仰力矩,翻滚力矩,偏航力矩,控制 量为俯仰角,翻滚角,偏航角。

coldmood77的博客 2920

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

从MVC到前后端分离

从MVC到前后端分离

偏执狂才能生存!热忱比专业知识更重要......... 1894

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SpringMVC实现RESTful服务

1、REST是一种架构风格,其核心是面向资源。REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。REST提出设计概念和准则为:  1. 网络上的所有事物都可以被抽象为资源(resource)  2. 每一个资源都有唯一的资源标识(resource identifier),对资源的操作不会改变这些标识  3. 所有的操作都是无状态的  REST简化开发,其架构遵循CRU...

天天吃面的博客 6475

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SpringMVC开发——实现第一个RESTful接口

SpringMVC最主要的一个功能就是设计接口,并提供给其他应用程序访问,如前端客户端等。RESTful接口是一种接口设计风格,也是一种设计规范,目前在项目开发中已经越来越流行。比如RESTful建议请求需要区分GET、POST、PUT等;返回的数据建议是JSON;网络协议使用https;请求url包含版本号等等。在本篇博客中,我们将会基于SpringMVC框架来设计第一个RESTful接口。本文

乞力马扎罗的雪CYF的博客 1万+
上一篇: RESTful API 设计指南
下一篇: Https通讯原理
codepython
博客等级 码龄20年 125粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值