這裏主要是接上篇java web開發(四) 接口開發補坑1文章的。如果你還未了解接口開發方面的文章,請先看這篇文章, java web開發(二) 接口開發!今天這篇文章繼續來細說,demo項目中的代碼!
一、cn.xinxing.json 這個包中是處理有關json操作的。博文中留言有關響應狀態碼問題的小夥伴們,請仔細看這部分!
1.1 .cn.xinxing.json.core 這個包中定義了響應對象。下面具體看看這幾個類。
1.1.1 AbstractJsonObject 這個類是所有響應對象的基類,定義了響應狀態碼、響應狀態描述以及時間戳!
package cn.xinxing.json.core;
import java.util.Date;
import cn.xinxing.json.status.StatusObject;
/**
* 響應基類
*/
public class AbstractJsonObject {
private String code;//響應狀態碼
//
private String msg;//響應狀態描述
private Long time = new Date().getTime();//時間戳
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
/**
* @return the time
*/
public Long getTime() {
return time;
}
/**
* @param time
* the time to set
*/
public void setTime(Long time) {
this.time = time;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public void setContent(String code, String msg) {
this.code = code;
this.msg = msg;
}
public void setStatusObject(StatusObject statusObject) {
this.code = statusObject.getCode();
this.msg = statusObject.getMsg();
}
}
其中 code 是響應狀態碼,msg是響應狀態描述,time 是時間戳。code之前也一直提到過,這裏再次強調,code的值是項目中接口的運行狀態!例如當接口運行運行成功,會設置code爲‘ok’。具體code值是多少,這個要接口自己定義一個規範,當調用者拿到這個code時,就知道如何處理了!下面會給出這個項目中定義的code!
1.1.2 SingleObject ,這個對象中定了一個對象。主要是用來在返回單個對象時使用!
package cn.xinxing.json.core;
/**
*單個對象
*/
public class SingleObject extends AbstractJsonObject {
private Object object;//單個對象
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
當響應的內容是一個對象時,就定義這個SingleObject類,將對象設置給SingleObject類,然後返回SingleObject即可!
1.1.3 ListObject,這個對象中定了一個列表對象。是用來返回列表對象!
package cn.xinxing.json.core;
import java.util.List;
/**
* 列表對象
*/
public class ListObject extends AbstractJsonObject {
private List<?> items;// 列表對象
public List<?> getItems() {
return items;
}
public void setItems(List<?> items) {
this.items = items;
}
}
當響應的內容是一個列表時,我們就可以使用這個ListObject,將列表放置到items屬性中,然後返回ListObject就可以了!
這裏我只給出了以上這兩種返回結果!當然還有其他的返回結果,例如分頁形式的!這些規則都需要在項目開發時制定好,在開發時,纔會順利便捷!
1.2 cn.xinxing.json.responseUtils 這個包中是響應處理,有一個類ResponseUtils,看具體實現,
package cn.xinxing.json.responseUtils;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
/**
* 響應處理
*/
public class ResponseUtils {
/**
* 返回json 串
*
* @param response
* @param text
*/
public static void renderJson(HttpServletResponse response, String text) {
// System.out.print(text);
render(response, "text/plain;charset=UTF-8", text);
}
/**
* 發送內容。使用UTF-8編碼。
*
* @param response
* @param contentType
* @param text
*/
public static void render(HttpServletResponse response, String contentType, String text) {
response.setContentType(contentType);
response.setCharacterEncoding("utf-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
try {
response.getWriter().write(text);
} catch (IOException e) {
}
}
}
將結果串設置到response中,返回給調用者!
1.3 cn.xinxing.json.status 這個包定義響應狀態有關的。
1.3.1 StatusCode ,定義響應狀態碼
package cn.xinxing.json.status;
/**
*
* 返回code
*/
public class StatusCode {
public static String CODE_SUCCESS = "ok";//訪問成功
public static String CODE_ERROR = "0001"; //訪問錯誤
public static String CODE_ERROR_PARAMETER = "0002";//參數錯誤
public static String CODE_ERROR_PROGRAM = "0003";//程序異常
public static String CODE_ERROR_NO_LOGIN_OR_TIMEOUT = "0004";//未登錄或登錄超時,請重新登錄
public static String CODE_ERROR_EXIST_OPERATION = "0005";//已操作
}
這個類中定義了接口中使用到的所有響應狀態碼。具體的定義規則,都是開發者定義的!沒有什麼標準規範!
1.3.2 StatusHouse,將code和msg組裝到一起,在使用時更加方便!
package cn.xinxing.json.status;
/**
* 狀態封裝類
* 將code和msg組合到一起,方便使用
*/
public class StatusHouse {
public static StatusObject COMMON_STATUS_OK = new StatusObject(StatusCode.CODE_SUCCESS, "訪問成功");
public static StatusObject COMMON_STATUS_ERROR = new StatusObject(StatusCode.CODE_ERROR, "訪問錯誤,錯誤碼:(" + StatusCode.CODE_ERROR + ")");
public static StatusObject COMMON_STATUS_NO_LOGIN_OR_TIMEOUT = new StatusObject(StatusCode.CODE_ERROR_NO_LOGIN_OR_TIMEOUT, "未登錄或登錄超時,請重新登錄,錯誤碼:(" + StatusCode.CODE_ERROR_NO_LOGIN_OR_TIMEOUT + ")");
public static StatusObject COMMON_STATUS_ERROR_PROGRAM = new StatusObject(StatusCode.CODE_ERROR_PROGRAM, "程序異常,錯誤碼:(" + StatusCode.CODE_ERROR_PROGRAM + ")");
public static StatusObject COMMON_STATUS_ERROR_PARAMETER = new StatusObject(StatusCode.CODE_ERROR_PARAMETER, "參數錯誤,錯誤碼:(" + StatusCode.CODE_ERROR_PARAMETER + ")");
public static StatusObject COMMON_STATUS_EXIST_OPERATION = new StatusObject(StatusCode.CODE_ERROR_EXIST_OPERATION, "已操作,錯誤碼:(" + StatusCode.CODE_ERROR_EXIST_OPERATION + ")");
}
1.3.3 StatusObject 定義了擁有code和msg屬性的對象,在上面的StatusHouse類中使用到!
package cn.xinxing.json.status;
/**
* 狀態對象
*/
public class StatusObject {
// 狀態碼
private String code;
// 狀態信息
private String msg;
public StatusObject(String code, String msg) {
super();
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
1.4 cn.xinxing.json.utils 這個包是有關json解析的,只有一個JackJsonUtils 類。
1.4.1 JackJsonUtils ,因爲項目中使用的是jackjson來處理json。
package cn.xinxing.json.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* jackjson
*/
public class JackJsonUtils {
static ObjectMapper objectMapper;
/**
* 解析json
*
* @param content
* @param valueType
* @return
*/
public static <T> T fromJson(String content, Class<T> valueType) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.readValue(content, valueType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 生成json
*
* @param object
* @return
*/
public static String toJson(Object object) {
if (objectMapper == null) {
objectMapper = new ObjectMapper();
}
try {
return objectMapper.writeValueAsString(object);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
這個類有兩個方法,fromJson()和toJson(),他們分別是解析json和生成json字符串的!
好了,有關響應以及json這麼多。有疑問的,請多看幾遍!
二、cn.xinxing.model 這個包定義實體類。只有一個Students類,類中定義了幾個屬性,以及實現了get()和set()方法。此處就不展開了!
三、 cn.xinxing.service.student 定義一個服務層,用於提供數據以及封裝下層實現。
3.1 StudentService 這是接口,定義了獲取學生數據相關的方法。
package cn.xinxing.service.student;
import java.util.List;
import cn.xinxing.model.Students;
/**
* 獲取學生數據接口
*/
public interface StudentService {
public List<Students> getAllStudents();//獲取所有的學生數據
}
3.2 cn.xinxing.service.student.impl 這個包實現了上文中定義的接口,只有一個實現類StudentServiceImpl ,看具體實現,
package cn.xinxing.service.student.impl;
import java.util.List;
import cn.xinxing.business.StudentBusiness;
import cn.xinxing.model.Students;
import cn.xinxing.service.student.StudentService;
/**
* 接口實現
*/
public class StudentServiceImpl implements StudentService{
@Override
public List<Students> getAllStudents() {
// TODO Auto-generated method stub
return StudentBusiness.getAllStudents(); //調用具體的獲取學生數據方法
}
}
getAllStudents()方法只是調用了其他地方的獲取數據的方法。這個地方就是這麼簡單!
至此,項目中的全部代碼都已經展示完了!相信仔細閱讀這兩篇文章後,大家應該對java web 接口開發有了更深的瞭解!如果,還有其他疑問,歡迎指出!
最後補上,例子下載地址。
PS: 這裏還想再多說幾句!java接口開發,這個在正式項目中,需要涉及很多方面的知識,例如,數據庫使用框架來維護,整個服務部署至雲服務上等等!想要掌握這些東西,需要花費很多的時間和精力!我自己是一直做Android應用,接口開發是自己的自學的。java 接口開發這幾篇博文呢,都只是初級的入門級的,在正式項目中呢,肯定不能這樣做。目前的還有需要學習很多東西,希望和大家一塊學習!