10分钟学会使用YangMVC构建HTTP-JSON服务器

Posted TaiJi1985

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

托管在码云。。。

以上是关于10分钟学会使用YangMVC构建HTTP-JSON服务器的主要内容,如果未能解决你的问题,请参考以下文章

怎么在10分钟内学会Maven工程

怎么在10分钟内学会Maven工程

高效快捷简便易用的基于JSP的框架 MVC+ORM框架- YangMVC

10 分钟学会Linux常用 bash命令

技术干货 | 六分钟学会使用 HBuilder 引入构建 mPaaS 小程序

5分钟学会Flutter开发