YangMVC- MVC 框架和 ORM 框架

网友投稿 673 2022-10-12 10:21:03

YangMVC- MVC 框架和 ORM 框架

开发目的

@copyright 杨同峰 保留所有权利

SSH框架配置复杂、难用。个人认为这不是一个框架应该有的样子。框架应该使用简单、配置简单、代码简洁。于是参照Django的一些特性,编写了这个MVC+ORM框架。

特性

大量的默认约定,避免了大量的配置使用此框架开发效率会很高支持延迟加载技术的List和JSTL无缝兼容

YangMVC的第零个例子-HelloWorld程序

public class IndexController extends Controller {    public void index(){        output("Hello YangMVC");    }}

他的作用就是显示一句话。如图

IndexController来处理应用的根目录下的请求。 index方法来处理这个目录下的默认请求。

YangMVC第一个Demo

在org.demo包下建立此类:

public class BookController extends Controller {    public void index(){        DBTool tool = Model.tool("book");        LasyList list = tool.all().limit(0, 30);        put("books", list);        render();    }}

在WebRoot/view/book/下建立一个index.jsp 其中核心的代码为

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>(此处省略一堆无关的HTML代码)                ${b.id }        ${b.name }        ${b.author }        ${b.chaodai }        ${b.tm_year }                    编辑            删除                

说明:

这个BookController是一个控制器,它的每一个公共方法都对应一个网页(如果不想对应,你需要将其设为私有的)

Model和DBTool是整个ORM框架的核心。Model表示模型,它用来与数据库表相对应。在创建一个Model时,会指定对应的表名。

这里和Hibernate不同,Hibernate需要预先生成所有数据库表的对应类, 而这个Model可以与任何表格关联,而不需要预先生成任何一个类。这正是YangMVC中的ORM的优势所在。

DBTool tool = Model.tool("book");

程序中使用Model的静态方法tool获取一个DBTool对象,tool传入的参数book是数据库的表名。 这样DBTool就和book表建立了关联。

LasyList list = tool.all().limit(0, 30);

伙计们快看,这是个LasyList,一个支持懒惰加载机制的列表。它是List类的子类,这也就是它为什么能在JSTL中使用foreach变量的原因。

首先我们调用了tool的all()方法,天哪,难道要加载book表的所有数据,兄弟不用害怕,在这个时候,它并没有进行任何数据的读写,指示记录了现在要访问book表的所有数据这一信息。all()方法会返回一个LasyList对象。这么设计的原因是我们后面可以跟一连串的过滤方法。方便我们编程。我们可以写出这样的东西:

list = tool.all().gt("id", 12).lt("id", 33).eq("name","haha").like("author","王");

这个例子相当于执行了如下SQL语句:

select * from book where id>12 and id<33 and name='haha' and author like '%王%'

在上面的例子中, all()返回的LasyList又调用了它的limit方法,这一步仍然没有真正访问数据库。 那么访问数据库从哪里开始呢?从你获取这个列表的一项时。

一个List,可以使用枚举的方法来访问

for(Model m : list){}

也可以使用get方法来访问。如

Model m = list.get(12)

在你访问具体它的一个元素(Model)时,数据库查询才会启动。而且也不是将所有数据放到内存中。比如你通过上面for的方法枚举时,其实它是通过ResultSet的next游标在移动,所以它很高效!也避免了无用的数据库操作。

put("book",list)

该方法将查询得到的book塞入request中,在jsp网页中就可以使用JSTL来使用它。因为它是一个List,所以用forEach去访问他。

Model 的一个对象对应于数据库表的一行(一条记录),Model是一个Map的子类!!!,所以在JSTL中,你可以使用 ${ b.name }的方式来访问名为b的Model 的name项。 它相当于

Model m = ....   m.get("name")

是不是很方便??? 真的是非常方便的。。

第二个Demo

添加书籍页面

public void add(){        DBTool tool = Model.tool("book");        //处理提交数据        if(isPost()){ //isPost            Model m = tool.create(); //创建新的            Log.d(m);            paramToModel(m);            tool.save(m);            put("msg","添加成功");        }        //显示数据        renderForm(tool.create());    }

对应的/view/book/add.jsp (这是默认对应的模板地址)的核心内容

  

添加书籍 ${msg }

  ${book_form }  

上面的例子控制器其实是对应两个页面。在收到Get请求的时候显示表单,在用户提交数据时,做插入操作,并显示表单。(我们当然可以把这两个页面写到两个不同的方法中)我们还是使用Model.tool获取一个DBTool。

先来看显示表单,就一句话

renderForm(tool.create());

tool的create方法会返回一个Model对象,这个对象和book表相关联(因为tool和book表关联)。并将这个Model传递给renderForm方法。这个方法会根据book表格的元数据自动创建一个表格。 哇偶!

那么这个Form插入到网页的什么位置呢? 将 ${book_form } 放入网页中 即可。

如果来的是POST请求(使用isPost()方法来判断) 使用tool的create方法创建一个新的Model,尽快还有其他创建Model对象的方式,但如果你希望插入,请尽量使用这种方式。 paramToModel(m),这个方法会自动查找表单中,名字与数据库字段名匹配的项,并自动赋值给Model的相应项。是不是很方便。。。

想起了Struts那悲催的功能定义。 泪奔。。。。

随后直接调用tool的save方法将其保存到数据库中!OK了!万事大吉!

细心的小朋友会问: 数据库中的字段名都是英文的如name,为什么在网页上显示的是中文??? 看看我的数据库表格定义

CREATE TABLE `book` (  `id` int(11) NOT NULL auto_increment COMMENT '编号',  `file_name` varchar(50) default NULL,  `name` varchar(50) default NULL COMMENT '名称',  `author` varchar(50) default NULL COMMENT '作者',  `chaodai` varchar(50) default NULL COMMENT '朝代',  `tm_year` varchar(50) default NULL COMMENT '年代',  `about` longtext COMMENT '简介',  `type` varchar(50) default NULL COMMENT '类型',  `catalog_id` int(11) default NULL COMMENT '分类',  PRIMARY KEY  (`id`),  KEY `catalog` USING BTREE (`catalog_id`)) ENGINE=InnoDB AUTO_INCREMENT=912 DEFAULT CHARSET=utf8;

真相大白与天下,我是通过给字段加注释实现的这一点。只要你将数据库表格加上注释,它就会自动获取注释并显示,对于没有注释的字段,则会显示字段名。如那个扎眼的file_name

好了,这几行代码就搞定了输入表单和表单的处理。

第三个demo-编辑(自动创建的修改表单)

细心的朋友发现,我们是按照CRUD的逻辑来将的。下面是编辑网页。

public void edit() throws NullParamException{        DBTool tool = Model.tool("book");        //处理提交数据        if(isPost()){ //isPost            Model m = tool.get(paramInt("id"));            Log.d(m);            paramToModel(m);            tool.save(m);            put("msg","修改成功");        }        //显示数据        Integer id = paramInt("id");        checkNull("id", id);        renderForm(tool.get(id));    }

HTML页面放在/view/book/edit.jsp中,核心代码只是将add.jsp中的添加二字改为了”编辑“二字。

  

编辑书籍 ${msg }

  ${book_form }  

这个代码长了一点, 有17行。对于用YangMVC的,已经算够长的了。它仍然是两个网页!!! 你可以吧显示表单的代码和处理表单的分到两个方法中写。

先看显示数据。 首先使用paramInt方法获取URL参数id,我们就是要编辑id指定的书籍。 调用checkNull来检查一下。在我的开发生涯中,遇到各种参数检查,所以这个功能是必须有的,如果checkNull不过,就会抛出一个异常。这样做的目的是不要让这种参数检查干扰我们正常的逻辑。这不就是异常之所以存在的意义么?

如果缺少这个参数,页面会提示说缺少这个参数。下面使用tool.get(id)方法来获取一个Model(一条记录)。这个方法是根据表格的主键进行查询,返回的不是列表而是一个具体的Model对象。在这里我建议主键应当是整数、且是数据库自增的。renderForm传入一个model,这个model中有数据,就会被显示出来。

就这样。编辑功能写好了。

有的朋友问,如果不想用默认的表单怎么办?那你自己写一个表单在你的模板里就是了。只不过,你可以先用这个方法吧表单生成出来,然后按你的意图修改就成了。这也节省大量时间啊。做过Form的请举手。

第四个DEMO-删除

public void del(){        Integer id = paramInt("id");        Model.tool("book").del(id);        jump("index");    }

瞧瞧就这点代码了, 获取参数id,并调用tool的del方法删除。最后一句我们第一次见,就是跳转。跳转到同目录下的index这个默认页(显示的是书籍列表)

配置

新建一个WebProject(MyEclipse为例)将以下三个jar放到WebRoot/Web-INF下面 yangmvc-1.0.jar fastjson-1.2.0.jar mysql-connector-java-5.1.23-bin.jar在web.xml中(web-app标签内)加入yangmvcorg.docshare.mvc.MVCFilter  controller  org.demo  template  /view

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:一文教会你用mybatis查询数据库数据
下一篇:WPF 颜色生成器
相关文章