編寫目的
當你做一個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
托管在碼云。。。