10分鐘學會使用YangMVC構建HTTP-JSON服務器

編寫目的

當你做一個App時,或者使用異步方式設計一個網站的時候,你往往需要使用Web服務器提供JSON數據。這時候你可以了解一下YangMVC的使用。對于一個有經驗的開發人員來說,了解這個框架的使用,只需要10分鐘。

歡迎自由轉載!!!

環境搭建

A 下載jar并加到編譯路徑中

1 在下面的網站下載最新版的yangmvc-xxxx-boot.jar ,請注意下載boot版本。

https://gitee.com/yangtf/YangMVC/attach_files

注意是boot版本,下載后加到編譯路徑就好。下面的2,3是為初學者寫的步驟。

對于很多項目來說,你只需要加這一個jar包就好了!!!!

2 使用你的IDE建立一個Java Project.(不需要是web工程)
3 新建一個libs目錄,將下載的jar放入,將上述jar加到Build Path中。

這個jar包已經包含了jdbc驅動、fastjson等類庫,所以你無需再自行添加。

B 在src中添加配置文件

在src下面(源代碼根目錄下)新建一個web.properties ,內容如下

controller=org.demo
template=/view
dbhost=localhost
dbusr=root
dbpwd=123456
dbname=mvc_demo
dbport=3306
reloadable=true
dbtype=mysql

其中變量的含義不言自明。 controller的值為一個包名。所有的控制器都要寫在這個包下面。
db開頭的變量全都是數據庫的信息,包括主機(dbhost)、用戶(dbusr)、密碼(dbpwd)等。

數據庫類型目前支持 mysql和 postgresql

reloadable是一個強大的調試功能。允許你修改完一個控制器后,不需要重啟服務即刻生效。(即刻!)

C 開始寫控制器

5 在org.demo下建立控制器

package org.demo;

import org.docshare.mvc.Controller;
import org.docshare.orm.LasyList;

public class IndexController extends Controller {
    public void index(){
        LasyList list =T("book").all().limit(10);
        outputJSON(list);
    }
}

D 運行

選中工程點擊運行, 選擇主類為ServerMain。即可啟動工程。


這里寫圖片描述
這里寫圖片描述

控制臺里大概會這么顯示


這里寫圖片描述
2018-06-13 17:25:08,218 [ INFO]  Server start .........
2018-06-13 17:25:08,288 [DEBUG]  MIME load 407 items
2018-06-13 17:25:08,292 [DEBUG]  read prop from file:/C:/work/jspwork/TestYangMVCBoot/bin/web.properties
2018-06-13 17:25:08,292 [DEBUG]  class loader name sun.misc.Launcher$AppClassLoader@40affc70
2018-06-13 17:25:08,292 [ INFO]  Config file found ! 
2018-06-13 17:25:08,293 [ INFO]  web.properties loaded 
2018-06-13 17:25:08,295 [DEBUG]  try load init class org.demo.Init
2018-06-13 17:25:08,295 [DEBUG]  init class not found
2018-06-13 17:25:08,370 [ INFO]  view/ dir not found !  ,use classpath
2018-06-13 17:25:08,371 [ INFO]  Config [dbhost=localhost, dbname=mvc_demo, dbusr=root, dbpwd=[hidden], port = 3308, tpl_base=/view, ctr_base=org.demo,reloadable=true,useSSL=false,interceptors={}]
2018-06-13 17:25:08,384 [ INFO]  jetty-8.0.y.z-SNAPSHOT
2018-06-13 17:25:08,445 [ INFO]  Started {}
2018-06-13 17:25:08,446 [ INFO]  服務器已經開啟 Server is Started
2018-06-13 17:25:08,446 [ INFO]  please visit http://127.0.0.1:1985
2018-06-13 17:25:08,456 [ INFO]  本機的IP = 127.0.0.1
2018-06-13 17:25:08,457 [ INFO]  本機的IP = 192.168.1.150
2018-06-13 17:25:08,457 [ INFO]  每按一次回車鍵打開一次瀏覽器,Press Enter key to open browser

訪問

在控制臺上輸入回車,即可自動打開瀏覽器,您也可以手工打開瀏覽器,并輸入
http://localhost:1985

端口修改

如果您想修改端口號,您可以再運行配置中加入參數 80 ,這樣就會在80端口監聽。

這里寫圖片描述

說說控制器

控制器的路徑有的框架基于標注,有的框架基于配置, YangMVC基于命名約定。

如IndexController對應根目錄, 其中的index方法對應默認頁。


這里寫圖片描述

下面我們再建一個方法來說明這個問題。在IndexController中再建立一個方法

    public void haha(){
        output("this is a test");
    }

,那么我們使用/haha即可訪問它。如圖


這里寫圖片描述

即 方法對應的路徑為 http://localhost:1985/方法名

另外,BookController,對應 /book/ 目錄。 瀏覽器直接訪問 /book/目錄 ,框架會調用BookController的index方法。

/book/add 對應BookController的add方法。
/haha 對應 IndexController的haha方法。
/haha/ 對應HahaController的index方法。
/haha/ccc 對應HahaController的ccc方法

這就是基于命名約定的映射。因為現在要為app或前端提供數據,我們不需要給后端做太多的靈活性。
比如有人寫了一個
haha方法,希望他映射為 wuwu,這種需求往往直接修改方法名更為方便。

關于參數

獲取URL參數和Form參數,是非常常見的。Struts框架采用了注入到成員變量的方式, Spring采用了參數的方式,YangMVC使用param()函數獲取。

    public void testp(){
        String a = param("a");
        output("a  = "+a);
    }

咱也可以用標注

    public void testp2(@Param("a")int a,@Param("b")int b){
        output(a+b+"");
    }

訪問試試


這里寫圖片描述

大量參數如何處理

我們有時候一個表單中有大量的參數,使用這種調用函數的方式很不方便。YangMVC提供了強大的方法,paramToModel()可以將參數根據命名匹配的原則直接放入Model對象中。 這個我們結合數據庫再講。

ORM框架(數據庫讀寫)

通用POJO和DAO類方式

YangMVC提供了兩種方式,一種是通用的POJO類,叫做Model(有的框架叫做Record),通用的DAO類,叫做DBTool, 查詢得到的Model的數組叫做LasyList.

,一種是通過YangMVC提供的工具自動生成POJO類。

先來看第一種方式。創建一個DAO類

DBTool tool = Model.tool("book");  //book為表名
Model m = tool.get(12); //根據主鍵查詢
Model m2  = tool.get("name","yang"); //根據其他唯一性的列進行查詢。 
LasyList list = tool.all().eq("catalog_id",12); //相當于 select * from book where catalog_id = 12;
list = tool.all().gt("id",100).lt("id",120); //相當于 select *from book where id >100 and id<120 
list = tool.all().limit(10,20).orderby("id",true); //相當于 select * from book order by id asc limit 10,20 

上面的例子是各種查詢,下面看刪除

Model m = ...(通過查詢獲取)。。。。。
m.remove() ; //刪除該數據

根據主鍵刪除

Model.tool("book").del(12); //相當于delete from book where id = 12;

修改

Model m = 先查詢獲取
m.put("name","新的值");//name為列名
m.save(); //保存即可更新數據庫數據

生成類方式

運行項目時,選擇主類 ConfigCreater , 根據提示輸入用戶名和密碼后,即可生成出對應的java類。下面有一個數據庫表

mysql> desc book;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| name       | varchar(50) | YES  |     | NULL    |                |
| catalog_id | int(11)     | YES  | MUL | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
9 rows in set

mysql> 

它生成出的Book類的代碼如下。 它將傳統的POJO和DAO結合起來,并沒有使用setter和getter這種冗余的寫法。

package org.demo.pojo;

import org.docshare.orm.LasyList;
import java.util.List;
import org.docshare.orm.Model;

public class Book{
    public String id;   
    public String name; 
    public Integer catalog_id;  
    public static final String TABLE_NAME = "book";
    /**
    *   更新
    */
    public int update(){
        return Model.tool(TABLE_NAME).save(this);
    }
    /**
    *   插入
    */
    public int insert(){
        return Model.tool(TABLE_NAME).save(this,true);
    }
    
    /**
    *   根據主鍵獲取
    */
    public static Book findByKey(Object id){
        return Model.tool(TABLE_NAME).get(id).toObject(new Book());
    }
    /**
    *   根據其他列的值進行獲取,如果獲取結果有多個,則輸出第一個。
    */
    public static Book findByColumn(String column,Object id){
        return Model.tool(TABLE_NAME).get(column,id).toObject(new Book());
    }
    /**
    *   LasyList對象轉對象數組
    */
    public static List<Book>  fromList(LasyList list){
        return list.toArrayList(Book.class);
    }
    /**
    *   根據主鍵進行刪除
    */
    public static int delByKey(Object key){
        return Model.tool(TABLE_NAME).del(key);
    }
    /**
    *   刪除當前對象
    */
    public void remove(){
        Model.tool(TABLE_NAME).del(id);
    }
    
    /**
     * 外鍵查詢
     * @return
     */
    public Catalog getCatalog(){
        return Catalog.findByKey(catalog_id);
    }
}

使用舉例

//獲取
        Book b = Book.findByKey(1);
        Log.i(b);
        //更新
        b.name = "測試"+new Date().getSeconds();
        b.update();
        
        //插入
        Book b2= new Book();
        b2.name = "haha";
        
        b2.catalog_id =1;
        b2.insert();
        
        Book b3= new Book();
        b3.name = "wuwu";
        
        b3.catalog_id =1;
        b3.insert();
        
        
        //刪除
        Book.delByKey(2);
        b3.remove();

對于列表,可以先通過上面查詢得到LasyList,在通過Book.fromList(list);轉換為Book數組。如

    LasyList list = Model.tool("book").limit(30); //通過前面的查詢獲取,這里只是舉例
    List<Book> books = Book.fromList(list);

如何將上面得到的列表輸出?

outputJSON(list) ; //這個list為LasyList對象

或者

outputJSON(books) ; //這個books為List<Book>對象。```

JSON類庫我們使用了fastjson,因為他支持public 的成員變量,可以不用setter和getter。

還有很多不清楚

完整的文檔請看
https://gitee.com/yangtf/YangMVC/wikis/pages

javadoc 地址
http://yangtf.gitee.io/yangmvc/YangMVC/doc/index.html

最核心的幾個類的Javadoc
基本上來說,只要掌握這三個核心的類,就可以自如使用這個框架。

控制器Controller類

http://yangtf.gitee.io/yangmvc/YangMVC/doc/org/docshare/mvc/Controller.html

DBTool類 http://yangtf.gitee.io/yangmvc/YangMVC/doc/org/docshare/orm/DBTool.html

LasyList類 http://yangtf.gitee.io/yangmvc/YangMVC/doc/index.html

只看文檔還不清楚? 看視頻教程

https://www.bilibili.com/video/av22089850?from=search&seid=6426261635261016249

在B站上的視頻。。。夠詳細了吧?

還是有不清楚的?看源代碼,開源的啊。

https://gitee.com/yangtf/YangMVC

托管在碼云。。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容