寫在前面的話
原計划這部分代碼的更新也是上傳到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>
<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包,其中的工具類規定了返回狀態碼及返回數據的基本格式。

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倉庫中去下載就好。
結語
推薦一下自己的達人課,感興趣的朋友可以看一下:SSM搭建精美實用的管理系統

首發於我的個人博客,新的項目演示地址:perfect-ssm,用戶名:admin,密碼:123456。

如果有問題或者有一些好的創意,歡迎給我留言,也感謝向我指出項目中存在問題的朋友,本篇主要講述了后端的實現,關於前端的修改會在下一篇文章中講述。
如果你想繼續了解該項目可以查看整個系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub倉庫或者開源中國代碼倉庫中查看源碼及項目文檔。
