Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
写在前面的话
原计划这部分代码的更新也是上传到 ssm-demo 仓库中,因为如下原因并没有这么做:
-
有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的。
-
而且这次的代码改动较大,与原来的目录结构及代码风格相比都有很大的差别。
-
同时也考虑到不同的人所处的学习阶段不同,担心有人不习惯也不适应这种风格及后面的更新,有的朋友甚至可能是初学者,更适合学习 ssm-demo 这个基础项目。
基于以上几点,最终并没有选择把几个项目都放在一个代码仓库中,而是另外花了些时间改动并且重新创建了一个仓库,perfect-ssm另起炉灶,项目也在新的服务器和域名下部署。
接口设计
项目共有三个模块:
- 文章管理模块
- 图片管理模块
- 用户管理模块
针对以上三个模块,并结合前文《设计一套好的 RESTful API》中所总结的 RESTful API 设计原则,对 api 进行改造,目标接口如下:
图片上传: 原接口 [] http://ssm-demo.13blog.site/loadimage/upload.do 现接口 [POST] http://perfect-ssm.13blog.site/images
文章添加:
原接口 [] http://ssm-demo.13blog.site/article/save.do
现接口 [POST] http://perfect-ssm.13blog.site/articles文章修改:
原接口 [] http://ssm-demo.13blog.site/article/save.do
现接口 [PUT] http://perfect-ssm.13blog.site/articles文章列表:
原接口 [] http://ssm-demo.13blog.site/article/list.do
现接口 [GET] http://perfect-ssm.13blog.site/articles文章删除:
原接口 [] http://ssm-demo.13blog.site/article/delete.do
现接口 [DELETE]http://perfect-ssm.13blog.site/articles图片添加:
原接口 [] http://ssm-demo.13blog.site/picture/save.do
现接口 [POST] http://perfect-ssm.13blog.site/pictures图片修改:
原接口 [] http://ssm-demo.13blog.site/picture/save.do
现接口 [PUT] http://perfect-ssm.13blog.site/pictures图片列表:
原接口 [] http://ssm-demo.13blog.site/picture/list.do
现接口 [GET] http://perfect-ssm.13blog.site/pictures图片删除:
原接口 [] http://ssm-demo.13blog.site/picture/delete.do
现接口 [DELETE]http://perfect-ssm.13blog.site/pictures用户登录:
原接口 [] http://ssm-demo.13blog.site/user/login.do
现接口 [POST] http://perfect-ssm.13blog.site/users/cookie用户列表:
原接口 [] http://ssm-demo.13blog.site/user/list.do
现接口 [GET] http://perfect-ssm.13blog.site/users用户删除:
原接口 [] http://ssm-demo.13blog.site/user/delete.do
现接口 [DELETE]http://perfect-ssm.13blog.site/users用户添加:
原接口 [] http://ssm-demo.13blog.site/user/save.do
现接口 [POST] http://perfect-ssm.13blog.site/users
修改密码:
原接口 [] http://ssm-demo.13blog.site/user/modifyPassword.do
现接口 [PUT] http://perfect-ssm.13blog.site/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>
<span class="hljs-tag"><<span class="hljs-name">servlet-mapping</span>></span>
<span class="hljs-tag"><<span class="hljs-name">servlet-name</span>></span>springMVC<span class="hljs-tag"></<span class="hljs-name">servlet-name</span>></span>
<span class="hljs-tag"><<span class="hljs-name">url-pattern</span>></span>/<span class="hljs-tag"></<span class="hljs-name">url-pattern</span>></span>
<span class="hljs-tag"></<span class="hljs-name">servlet-mapping</span>></span>
- 修改 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🇲🇲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 消息转换器 & 参数解析 -->
<span class="hljs-comment"><!-- 使用了<url-pattern>/</url-pattern>,所以要对静态资源进行处理 --></span>
<span class="hljs-tag"><<span class="hljs-name">mvc:default-servlet-handler</span>/></span>
<span class="hljs-comment"><!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- --></span>
<span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"defaultViewResolver"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>
<span class="hljs-attr">p:order</span>=<span class="hljs-string">"1"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"viewClass"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"org.springframework.web.servlet.view.JstlView"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"contentType"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"text/html"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"prefix"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"/WEB-INF/"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"suffix"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">".jsp"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">bean</span>></span>
- @RequestMapping 注解,规范和限制 Http 请求的请求方法。
@RequestMapping(value = "", method = RequestMethod.PUT)
@RequestMapping(value = "/{ids}", method = RequestMethod.DELETE)
-
@ResponseBody 注解,将返回结果转换为 JSON 格式。
-
增加 common 包,其中的工具类规定了返回状态码及返回数据的基本格式。
public class Constants {
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">int</span> <span class="hljs-variable">RESULT_CODE_SUCCESS</span> <span class="hljs-operator">=</span> <span class="hljs-number">200</span>; <span class="hljs-comment">// 成功处理请求</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">int</span> <span class="hljs-variable">RESULT_CODE_BAD_REQUEST</span> <span class="hljs-operator">=</span> <span class="hljs-number">412</span>; <span class="hljs-comment">// bad request</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">int</span> <span class="hljs-variable">RESULT_CODE_SERVER_ERROR</span> <span class="hljs-operator">=</span> <span class="hljs-number">500</span>; <span class="hljs-comment">// 没有对应结果</span>
}
public class Result<T> implements Serializable {
private static final long serialVersionUID = 1L;
private int resultCode;
private String message;
private T data;
<span class="hljs-keyword">public</span> <span class="hljs-title function_">Result</span><span class="hljs-params">()</span> {
}
}
注意事项
几个需要注意的注解:
- @RequestMapping
- @PathVariable
- @ResponseBody
- @RequestParam
代码中大量的出现,本文中也一再强调,因此,给正在看本篇文章的你一个建议就是如果你不熟悉这几个注解,花点时间去认真学习和实践一下,知道这几个注解的用法和注意事项,网上针对这些注解的文章有很多,可以针对性的学习一下,这篇文章就不再占用篇幅去赘述了,需要代码的话,直接去我的 GitHub 仓库中去下载就好。
结语
推荐一下自己的达人课,感兴趣的朋友可以看一下:SSM 搭建精美实用的管理系统
首发于我的个人博客,新的项目演示地址:perfect-ssm,用户名:admin, 密码:123456。
如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友,本篇主要讲述了后端的实现,关于前端的修改会在下一篇文章中讲述。
如果你想继续了解该项目可以查看整个系列文章Spring+SpringMVC+MyBatis+easyUI 整合系列文章, 也可以到我的GitHub 仓库或者开源中国代码仓库中查看源码及项目文档。