将springmvc配置成一个REST服务器的过程

现在比较流行的一个开发方式时把逻辑尽可能多地写到前端,后端只负责做数据交互,当前端需要数据时,使用REST风格的URL向后端请求,然后后端返回一个json串给前端。java后端现在似乎已经有很多REST框架,但是大多数java程序员比较熟悉的框架还是springmvc,既然springmvc现在也支持REST,何尝不试试呢?于是就折腾了一下午总算搞定了,这里记录一下以供后来参考。springmvc使用的版本是4.3.6.RELEASE。笔者将假设读者已经具有了springmvc的基本使用知识。

RESTful风格的URL简介


这里仅说说我的最简单的理解,欢迎吐槽。

在开发传统web应用时,我们并没有完整的使用http协议所提供的所有方法,只使用了GET与POST方法,并当用GET方法传递参数时使用的是类似于http://dqy.today/articles.action?articleId=3 这样冗长的URL,参数是通过"?+键值对"的方式传递。
RESTful风格的URL则主张参数通过url路径本身来传递,比如上面给出的URL写成RESTful风格就是http://dqy.today/articles/3 ,直接将参数写在了url的路径当中,这样的URL更加简端,而且含义也更加明确。
RESTful也主张将HTTP中的GET,POST,PUT,DELETE方法全部使用上,让同一个URL可以表达更多的含义,以http://dqy.today/articles 这个URL为例,这几种操作的含义分别是:

  • GET:获得全部文章(article)
  • POST:增加一篇文章
  • PUT:修改文章
  • DELETE:删除一篇文章

REST风格使得URL在变得简洁的同时也增强了URL的表现力,更加充分利用了HTTP协议。

让springmvc拦截所有请求


将springmvc核心Servlet的拦截路径改为 /,如下:

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

注意这里只能写成/ 不能写成/* ,否则会报奇怪的错误,具体原因我也不是很清楚。

接下来还需要在springmvc的配置文件中配置让框架不拦截静态资源的路径,使用如下的标签:

<!-- 静态资源解析
    包括:js,css,img... -->
<mvc:resources location="/static/" mapping="/static/**"/>
<!--不拦截欢迎页-->
<mvc:resources location="/" mapping="/index.html"/>

mapping表示要映射的url,可以使用通配符,* 表示只能匹配一层子路径,而** 表示能够匹配所有子路径,比如/static/* 能够匹配url路径/static/a,但是无法匹配/static/a/b,而/static/** 能够匹配/static/a/b。location其在项目目录下的真实位置,框架会将mapping匹配到的子路径连接在location的后面,比如/static/js/b.js这样的url路径就不会被springmvc的核心Servlet拦截,而是直接去项目目录的/static/js/b.js 路径下寻找静态资源。

使用springmvc获得嵌入在URL目录中的参数


之前传统的web应用springmvc都是自动获取"?"后面的参数并绑定到方法参数中的,现在的参数在URL路径中,要怎么获取呢?其实springmvc也提供了几个方便的注解让我们获取,示例如下:

修改文章请求的处理方法:

@RequestMapping(value = "articles/{articleId}", method = RequestMethod.PUT)
public void modifyArticle(@PathVariable("articleId") String id,Article article){
    ......
}

删除文章请求的处理方法:

@RequestMapping(value = "articles/{articleId}", method = RequestMethod.DELETE)
public void delArticle(@PathVariable("articleId") String id,Article article){
    ......
}

这两个方法都可以获得客户端发起的/article/*这类请求({articleId}就类似于一个通配符),然后框架会根据@RequestMapping的method 参数决定最终给哪个方法处理,如果是http的PUT方法则会交给modifyArticle方法处理,如果是DELETE方法,则交给delArticle方法处理。

通过@PathVariable注解将路径中的参数绑定到方法参数中,它会将{articleId}所匹配到的路径中的值绑定到方法参数id中。

使用springmvc收发json串


REST服务器比较流行用json进行收发,springmvc也提供了相关的便利,但是还需要添加额外的jackson的依赖,添加的jackson的版本需要与springmvc相匹配,否则会报错,经过笔者的验证,在4.3.6版本的springmvc下引入如下版本的jackson依赖:

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.8.9</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.8.9</version>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-annotations</artifactId>
  <version>2.8.9</version>
</dependency>

然后通过如下的注解就可以让springmvc帮我们在收发json串自动将它们转换成对象:

@RequestMapping(value = "/...")
public @ResponseBody Object1 (@RequestBody Object2 object2){
...
...
return object2;
}

Object1与Object2是两个自定义的对象,使用@RequestBody注解修饰方法参数object2,当该方法接受到请求时,springmvc会将json串自动转换成对象传入object2参数中(按照对象中Object2中的成员属性名匹配),经过笔者验证,@RequestBody最多只能修饰一个方法参数,如果同时修饰多个方法参数的话运行时会报错。@ResponseBody注解能够将方法返回的对象转换成json串传递给客户端。

End


掌握这些知识后,就可以将springmvc改造成一个REST服务器了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式。”但是在要求详细讲述它所提出的各个约束,以及如...
    时待吾阅读 3,419评论 0 19
  • 文化好比云端,是一系列价值观世界观的集合,每个人从中获取的那一部分,成为了他们的灵魂,看似每个人都是独立自...
    戒骄戒躁v阅读 453评论 0 0
  • 他对我总是冷冰冰的感觉。只有在弟弟的面前,竟然有孩子般的笑容。他几乎不太跟我讲话,却在弟弟面前,小崽崽的叫得欢心。...
    琼筇阅读 151评论 0 0
  • 今天的第一阶段在我的乱哼哼中开始了,高兴的想就这样哼哼,哼着哼着看见穿白衣的我在吟唱,边向我走来和我合二为...
    紫莲阅读 267评论 0 0