摘要:官網地址是用于幫助開發者更容易使用而開發的的插件官方地址本文代碼已開源在教程目標教會大家基于開發一個簡單的增刪查改應用。就這樣一個簡單的待辦事項就完成了呢
簡介
ICEREST是一個非常輕量級只有200k左右的RESTful路由框架,通過ICEREST你可以處理url的解析,數據的封裝,Json的輸出,和傳統的方法融合,請求的參數便是方法的參數,方法的返回值便是請求的返回值,同時我們希望ICEREST是一個能讓人倍感呵護的框架。
官網地址:http://icerest.cc
MongoDB-Plugin是用于幫助JAVA開發者更容易使用MongoDB而開發的的插件
官方地址:https://github.com/T-baby/Mon...
本文代碼已開源在GitHub:https://github.com/T-baby/ICE...
教程目標:教會大家基于ICEREST+MongoDB-Plugin開發一個簡單的增刪查改應用。
首先我們來看下這個demo的文件結構
相信大家一眼就能看出這是一個maven項目,在component文件夾中包含了兩個驗證器、一個bean類、一個model類。
首選我們為這個項目添加好依賴,在pom.xml中添加。
junit junit 4.10 test ch.qos.logback logback-classic 1.1.2 com.alibaba fastjson 1.2.7 javax.servlet javax.servlet-api 3.1.0 com.cybermkd ICEREST 1.0.1.2 com.cybermkd ICEREST-PLUGIN 1.0.0 com.cybermkd MongodbPlugin 1.0.6.3
添加完以后在config文件夾中創建AppConfig類:
public class AppConfig extends Config { /** * Config constant * 配置常量,目前只能配置render,其他全局配置會自動讀取根目錄下的application.properties文件,建議用默認 */ public void configConstant(ConstantLoader constantLoader) { //通過后綴來返回不同的數據類型 你可以自定義自己的 render,一般無需配置 //如:public class FreemarkerRender extends Render{} //目前支持json,text,file三種輸出 //constantLoader.addRender("ftl", new FreemarkerRender()); constantLoader.setDefaultForward("/"); //單頁應用會用到,用來跳過對/的攔截 } /** * Config resource * 配置Resource路由的掃描目錄,ICEREST是自動綁定路由的 */ public void configResource(ResourceLoader resourceLoader) { resourceLoader.addIncludePackages("com.cybermkd.component"); } /** * Config plugin * 配置插件 */ public void configPlugin(PluginLoader pluginLoader) { MongoIceRestPlugin mongoIcePlugin = new MongoIceRestPlugin(); mongoIcePlugin.add("127.0.0.1", 27017); mongoIcePlugin.setDatabase("item"); pluginLoader.add(mongoIcePlugin); } /** * Config interceptor applied to all actions. * 全局攔截,會在進入路由后,執行方法前執前 */ public void configInterceptor(InterceptorLoader interceptorLoader) { //權限攔截器 //interceptorLoader.add(new SecurityInterceptor(2, new MyAuthenticateService())); //Resource層事務的攔截器 @Transaction //interceptorLoader.add(new TransactionInterceptor()); } /** * Config handler * 全局的攔截,會在進入路由前執行 */ public void configHandler(HandlerLoader handlerLoader) { //跨域 handlerLoader.add(new CORSHandler("GET,POST,PUT,DELETE")); } /** * Call back after ICEREST start */ public void afterStart() { //ICEREST啟動前執行的操作 } /** * Call back before ICEREST stop */ public void beforeStop() { //ICEREST停止前執行的操作 } }
config這里沒有什么好說的,基本都已經寫在了代碼的注釋。
我們現在羅列下我們需要開發的功能,我們要開發的是一個記錄待辦事項的工具要實現以下功能:
增加事項
刪除事項
修改事項
獲取所有事項
一個事項中包含了id、內容和創建時間。所以我們可以建一個bean類:
public class ItemBean extends MongoValidate { @NotNull(message = "content can"t be empty") @NotBlank(message = "content can"t be empty") @Length(min = 1, max = 120, message = "content is too long or too short") private String content; private String creat_time; @NotNull(message = "id can"t be empty") @NotBlank(message = "id can"t be empty") private String id; public String getContent() { return content; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setContent(String content) { this.content = content; } public String getCreat_time() { return creat_time; } public void setCreat_time(String creat_time) { this.creat_time = creat_time; } }
為什么我們使用者mongodb卻要要建bean類呢?在實際開發中經常會有同時數個人開發同一個項目,mongodb允許每一行的結構都不一樣但這對于協同開發來說缺是噩夢。
所以為了方便協同工作建議使用bean類來約束數據的結構。
相信大家會看到@NotNull這樣的注釋,有什么用呢?在Mongodb Plugin 1.0.5后已經結合了hibernate的校驗功能,遵循JSR 303規范。
具體使用見:http://www.cybermkd.com/mongo...
如果bean繼承了MongoValidate這個類,就可以在創建bean對象的后用validation方法校驗全部屬性或者用validation(String... keys)校驗某個屬性。通過errorMessage獲取錯誤信息。
之所以沒命名為getErrorMessage是因為fastjson在反序列化的時候會自動處理帶有getXXX的方法的變量。我們實際使用中又不需要errorMessage。
緊接著我們需要創建一個Model來操作數據庫。MongoDB-Plugin的使用文檔見:http://www.cybermkd.com/mongo...
public class ItemModel { private static String collectionName = "storehouse"; public Listget() { return new MongoQuery().use(collectionName).findAll(); } public List get(String id) { return new MongoQuery().use(collectionName).byId(id).find(); } public boolean save(ItemBean bean) { System.out.println(JSON.toJSONString(bean)); bean.setId(null); //以免萬一清空id return new MongoQuery().use(collectionName).set(bean).save() > 0; } public boolean put(ItemBean bean) { MongoQuery query = new MongoQuery().use(collectionName).byId(bean.getId()); /*因為在controller是直接獲取整個對象的(在查詢的時候為了大家方便會自動將_id變為id,但是mongodb實際存的還是_id), / 為了避免將id插入進去,特意清空。*/ bean.setId(null); return query.modify(bean).update() > 0; } public boolean delete(ItemBean bean) { return new MongoQuery().use(collectionName).byId(bean.getId()).delete() > 0; } }
我們現在能操作數據了,在插入事項的時候我們需要校驗內容的長度,當刪除、更新的時候我們需要校驗這個事項是否存在,所以我們需要分別建兩個校驗器:
public class ContentValidator extends Validator { @Override public ValidResult validate(Params params, RouteMatch routeMatch) { ItemBean item = params.getObject(ItemBean.class); return new ValidResult().mongoValid(item, "content"); } }
在ICEREST 1.0.1以上的版本已經融入了MongoDB-Plugin的校驗功能,可以直接在攔截器中用new ValidResult().mongoValid(對象,屬性名)校驗,如果不加后面的屬性名則是校驗所有屬性。通過params.getObject就可以將獲取到的參數直接轉為某個對象,這個對象屬性中沒有的值全部拋棄。
在bean中的message注釋的文本,如果在校驗器中校驗發現傳的值是有問題的就會將這個message直接放入ValidResult中,格式如下:
{ "error":"", "errorMessage":"" }
public class IdValidator extends Validator { @Override public ValidResult validate(Params params, RouteMatch routeMatch) { ItemBean item = params.getObject(ItemBean.class); ValidResult result = new ValidResult(); result.mongoValid(item, "id"); if (result.isError()) { return result; } ItemModel m = new ItemModel(); try { if (m.get(params.get("id")).isEmpty()) { throw new RuntimeException(); } } catch (RuntimeException e) { result.addError("error", "100"); result.addError("errorMessage", "id is error."); } return result; } }
在IdValidator中相信大家會發現一個try catch,在mongodb java driver中如果傳來的id是隨便亂寫的那么會報錯,我們利用這一點建個try catch攔截錯誤,只要mongodb driver 拋出錯誤就代表id是錯的。
@API("/v1/item") public class ItemController extends Resource { ItemModel m = new ItemModel(); @GET() public WebResult get() { return render(m.get()); } @POST(valid = {ContentValidator.class}) public WebResult post() { ItemBean bean = getParams().getObject(ItemBean.class); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); bean.setCreat_time(df.format(new Date())); return render(m.save(bean)); } @PUT(valid = {IdValidator.class, ContentValidator.class}) public WebResult put() { return render(m.put(getParams().getObject(ItemBean.class))); } @DELETE(valid = {IdValidator.class}) public WebResult delete() { return render(m.delete(getParams().getObject(ItemBean.class))); } private WebResult render(Object obj) { JSONObject json = new JSONObject(); json.put("result", obj); return new WebResult(HttpStatus.OK, JSON.toJSONString(json)); } }
在controller類中,我們先利用@API聲明路徑,用@GET等注釋聲明請求類型。用render封裝了下返回的結果。
就這樣一個簡單的待辦事項api就完成了呢~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18890.html
摘要:官網地址是用于幫助開發者更容易使用而開發的的插件官方地址本文代碼已開源在教程目標教會大家基于開發一個簡單的增刪查改應用。就這樣一個簡單的待辦事項就完成了呢 簡介 ICEREST是一個非常輕量級只有200k左右的RESTful路由框架,通過ICEREST你可以處理url的解析,數據的封裝,Json的輸出,和傳統的方法融合,請求的參數便是方法的參數,方法的返回值便是請求的返回值,同時我們希...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數據增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協議和RESTful API相關資料. 阮一峰:理解RESTful架構 阮一峰:RESTful API 設計指南 RESTful API指南 依賴注入 D...
摘要:如圖連接成功后,顯示你的數據庫,在這個節目可以對數據庫進行操作。如圖安裝與加載首先假定你已經安裝了,命令行工具輸入在使用的文件中即可。創建讀取更新刪除單值讀取上文是在中基于對進行增刪查改操作的簡單介紹,以后會有進階的文章。 關鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
閱讀 2857·2023-04-26 02:49
閱讀 3441·2021-11-25 09:43
閱讀 3370·2021-10-09 09:43
閱讀 2985·2021-09-28 09:44
閱讀 2446·2021-09-22 15:29
閱讀 4507·2021-09-14 18:02
閱讀 2773·2021-09-03 10:48
閱讀 3426·2019-08-30 12:47