美文网首页
10分钟学会使用YangMVC构建HTTP-JSON服务器

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

作者: taiji1985 | 来源:发表于2018-06-13 18:35 被阅读14次

    编写目的

    当你做一个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服务器

          本文链接:https://www.haomeiwen.com/subject/hjkseftx.html