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阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容