Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)

写在前面的话

原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做:

  • 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的。

  • 而且这次的代码改动较大,与原来的目录结构及代码风格相比都有很大的差别。

  • 同时也考虑到不同的人所处的学习阶段不同,担心有人不习惯也不适应这种风格及后面的更新,有的朋友甚至可能是初学者,更适合学习ssm-demo这个基础项目。

基于以上几点,最终并没有选择把几个项目都放在一个代码仓库中,而是另外花了些时间改动并且重新创建了一个仓库,perfect-ssm另起炉灶,项目也在新的服务器和域名下部署。

perfect-ssm

接口设计

项目共有三个模块:

  • 文章管理模块
  • 图片管理模块
  • 用户管理模块

针对以上三个模块,并结合前文《设计一套好的RESTful API》中所总结的RESTful API设计原则,对api进行改造,目标接口如下:

图片上传:
原接口 []      http://ssm-demo.hanshuai.xin/loadimage/upload.do
现接口 [POST]  http://perfect-ssm.hanshuai.xin/images

文章添加:
原接口 []      http://ssm-demo.hanshuai.xin/article/save.do
现接口 [POST]  http://perfect-ssm.hanshuai.xin/articles 

文章修改:
原接口 []      http://ssm-demo.hanshuai.xin/article/save.do
现接口 [PUT]  http://perfect-ssm.hanshuai.xin/articles 

文章列表:
原接口 []      http://ssm-demo.hanshuai.xin/article/list.do
现接口 [GET]   http://perfect-ssm.hanshuai.xin/articles

文章删除:
原接口 []      http://ssm-demo.hanshuai.xin/article/delete.do
现接口 [DELETE]http://perfect-ssm.hanshuai.xin/articles

图片添加:
原接口 []      http://ssm-demo.hanshuai.xin/picture/save.do
现接口 [POST]  http://perfect-ssm.hanshuai.xin/pictures

图片修改:
原接口 []      http://ssm-demo.hanshuai.xin/picture/save.do
现接口 [PUT]  http://perfect-ssm.hanshuai.xin/pictures

图片列表:
原接口 []      http://ssm-demo.hanshuai.xin/picture/list.do
现接口 [GET]   http://perfect-ssm.hanshuai.xin/pictures

图片删除:
原接口 []      http://ssm-demo.hanshuai.xin/picture/delete.do
现接口 [DELETE]http://perfect-ssm.hanshuai.xin/pictures

用户登录:
原接口 []      http://ssm-demo.hanshuai.xin/user/login.do
现接口 [POST]  http://perfect-ssm.hanshuai.xin/users/cookie 

用户列表:
原接口 []      http://ssm-demo.hanshuai.xin/user/list.do
现接口 [GET]   http://perfect-ssm.hanshuai.xin/users 

用户删除:
原接口 []      http://ssm-demo.hanshuai.xin/user/delete.do
现接口 [DELETE]http://perfect-ssm.hanshuai.xin/users

用户添加:
原接口 []      http://ssm-demo.hanshuai.xin/user/save.do
现接口 [POST]  http://perfect-ssm.hanshuai.xin/users

修改密码:
原接口 []      http://ssm-demo.hanshuai.xin/user/modifyPassword.do
现接口 [PUT]   http://perfect-ssm.hanshuai.xin/users

根据不同资源映射成不同的uri,对于资源的具体操作类型,由HTTP动词来表示。

java后端实现

前文中提到了一些设计原则,这一篇就是将这些原则运用到项目中,但是理论性的知识看看就忘了,我写博客的目的不是为了写理论概念,没有实际项目配合我是不会写的,我觉得通过代码实现出来,配合实战才能让理论知识吸收的更好。

由于是ssm项目,因此主要是通过SpringMVC实现,更多的是使用了SpringMVC的注解来进行简化开发。

整合过程:

  • 首先是修改web.xml配置文件,使得URI可以符合RESTful风格。
    <servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-context-mvc.xml</param-value>
        </init-param>
        <!--加载顺序为1 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
  • 修改spring-context-mvc.xml配置文件,配置json消息转换器及动态资源过滤。
    <!-- Start: 配置json消息转换器 & 参数解析-->
    <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
        <property name="dateFormat">
            <bean class="java.text.SimpleDateFormat">
                <constructor-arg index="0" type="java.lang.String" value="yyyy-MM-dd HH:mm:ss"/>
            </bean>
        </property>
    </bean>
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json; charset=UTF-8</value>
                    </list>
                </property>
                <property name="prettyPrint" value="true"/>
                <property name="objectMapper" ref="objectMapper"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!-- End: 配置json消息转换器 & 参数解析 -->

    <!-- 使用了<url-pattern>/</url-pattern>,所以要对静态资源进行处理 -->
    <mvc:default-servlet-handler/>

    <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
    <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:order="1">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="contentType" value="text/html"/>
        <property name="prefix" value="/WEB-INF/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
  • @RequestMapping注解,规范和限制Http请求的请求方法。
@RequestMapping(value = "", method = RequestMethod.PUT)

@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
  • @ResponseBody注解,将返回结果转换为JSON格式。

  • 增加common包,其中的工具类规定了返回状态码及返回数据的基本格式。


    common
public class Constants {

    public static final int RESULT_CODE_SUCCESS = 200;  // 成功处理请求
    public static final int RESULT_CODE_BAD_REQUEST = 412;  // bad request
    public static final int RESULT_CODE_SERVER_ERROR = 500;  // 没有对应结果

}

public class Result<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    private int resultCode;
    private String message;
    private T data;

    public Result() {
    }
}

注意事项

几个需要注意的注解:

  • @RequestMapping
  • @PathVariable
  • @ResponseBody
  • @RequestParam

代码中大量的出现,本文中也一再强调,因此,给正在看本篇文章的你一个建议就是如果你不熟悉这几个注解,花点时间去认真学习和实践一下,知道这几个注解的用法和注意事项,网上针对这些注解的文章有很多,可以针对性的学习一下,这篇文章就不再占用篇幅去赘述了,需要代码的话,直接去我的GitHub仓库中去下载就好。

结语

首发于我的个人博客,新的项目演示地址:perfect-ssm,用户名:admin,密码:123456。


如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友,本篇主要讲述了后端的实现,关于前端的修改会在下一篇文章中讲述。

如果你想继续了解该项目可以查看整个系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub仓库或者开源中国代码仓库中查看源码及项目文档。

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

推荐阅读更多精彩内容