案例场景:每个系统都是从域建模入手设计,通过建模将业务需求转化为软件域范围的模型,本文以围绕一个模型实现该模型的基本功能:增删改查(crud)和批量分页查询,通过jdon框架的迅速简化高质量的开发,建立一个复杂系统的基础部分,使得开发者将真正精力集中在每个项目系统的特殊业务处理。
源码见jdon框架源码包中的jdonsample项目。
案例需求:简单的留言簿,实现留言message模型的新增、修改、删除和批量查询。
增删改查(crud)和批量分页查询是每个系统的基本功能,下面分这两部分描述。
crud开发步骤
说明:每个应用系统中存在大量重复的crud开发流程,通过本框架可快速完成这些基本基础工作量,将精力集中在特殊功能设计上。
crud快速开发主要简化了表现层的流程,将其固化,或者是模板化,以配置替代代码编制,灵活而快速。每个model一套固化crud流程。
开发步骤分两个小部分:代码编写和配置。
代码:三步代码编写
代码只需要三步:
第一步:域建模:建立sample.model.message,如下:
| public class message extends model { private long messageid; private string name; public string getname() { return name; } public void setname(string name) { this.name = name; } } |
注意点:
?模型类message必须继承框架的com.jdon.controller.model.model,或者实现com.jdon.controller.model.modelif接口。
?该模型类必须有一个能够标识其对象唯一性的主键,如messageid,这个主键相当于数据表的主键。
第二步:建立model组件服务:首先建立模型message的服务接口sample.service. messageservice:
| public interface messageservice { public void createmessage(eventmodel em); public void updatemessage(eventmodel em); public void deletemessage(eventmodel em); public message getmessage(string messageid); } |
至于messageservice的具体实现子类可以在现在或者以后建立,可见源码包中的sample.service.messageserviceimp。
第三步:建立model的表现层边界模型:sample.web.messageform,必须继承框架的modelform,如下:
| public class messageform extends modelform { private string messageid; private string name; public string getname() { return name; } public void setname(string name) { this.name = name; } } |
表现层messageform内容基本上是从业务层模型message类中拷贝过来的,主要是为了保持messageform和message的字段一致,我们就可以通过框架内messageform和message的相同字段的复制进行数据传送,将业务层的message数据传送到表现层messageform;或将界面表现层messageform传送到message中。
一个模型message有关crud实现的代码工作到此结束,如果有其他模型,完全按照上述三个步骤再做一次,是不是不太费脑筋?有点模板化开发味道?下面谈谈crud实现第二组成部分:配置。
配置分两个配置文件,这两个配置文件分别是:
?将前面三步编写的类建立关系:jdonframework.xml
?配置界面流程:struts-config.xml 配置之一:jdon框架配置文件
首先我们将前面三步编写的三个类:模型message、服务messageservice和界面模型messageform建立起联系,也就是告诉jdon框架这三者是解决一个模型增删改查crud功能实现的。
由于这个配置文件是告诉jdon框架的,因此,我们取名为jdonframework.xml,当然你也可以取其他名称,无论取什么名称,都要告诉jdon框架,在struts-config.xml中配置
| <plug-in classname="com.jdon.strutsutil.initplugin"> <set-property property="modelmapping-config" value="jdonframework.xml" /> </plug-in> |
jdonframework.xml配置内容如下:
| <models> <!-- 配置模型的类是message,其主键是messageid --> <model key="messageid" class ="sample.model.message"> <!-- 下行是配置界面模型messageform --> <actionform name="messageform"/> <handler> <!-- 以下配置messageservice --> <service ref="messageservice"> <getmethod name="getmessage" /> <createmethod name="createmessage" /> <updatemethod name="updatemessage" /> <deletemethod name="deletemessage" /> </service> </handler> </model> </models> <services> <!-- 以下配置messageservice --> <pojoservice name="messageservice" class="sample.service.messageserviceimp"/> </services> |
以上配置是配置模型message、模型服务messageservice和界面模型messageform三者关系的,下面详细说明三个部分的配置:
一、模型message的配置:
这是通过第一行中的class值来指定当前model是sample.model.message:
| <model key="messageid" class ="sample.model.message"> |
其中,message模型的主键是messageid,这个messageid必须是message类的一个字段;同时是用来唯一标识唯一的message模型对象,也就是object id,或者可以认为是模型message对应的数据表message的主键。
二、界面模型messageform配置:
| <actionform name="messageform"/> |
可能你已经注意到:这里并没有写界面模型完整类:sample.web.messageform,而好像是messageform类的名称messageform。
那么配置中messageform名称是从哪里来的呢?是struts-config.xml中actionform定义名称,如下:
| <struts-config> <form-beans> <form-bean name="messageform" type="sample.web.messageform" /> …… </form-beans> ….. </struts-config> |
可见我们的界面模型完整类sample.web.messageform是在struts-config.xml中form-beans中配置,并且命名为messageform,而这个messageform就是jdonframework.xml中的messageform。
三、模型服务messageservice配置:
在jdonframework.xml中首先申明messageservice完整实现是类sample.service.messageserviceimp,并且取名为messageservice:
<pojoservice name="messageservice" class="sample.service.messageserviceimp"/>
这样,我们就可以详细将我们自己编写的messageservice的crud方法名告诉jdon框架了:
| <handler> <!-- 以下配置messageservice --> <service ref="messageservice"> <getmethod name="getmessage" /> <createmethod name="createmessage" /> <updatemethod name="updatemessage" /> <deletemethod name="deletemessage" /> </service> </handler> |
黑体字部分正是messageservice所指的类sample.service.messageserviceimp所继承的接口sample.service. messageservice四个方法,可见前面代码步骤第二步。
配置之二:界面流程配置
界面流程主要是配置crud界面流程,jdon框架crud流程主要分两个部分:第一是推出供用户新增修改删除的页面;第二是接受用户提交新增修改过的数据,以便递交到业务层保存。
这部分配置主要是配置struts-config.xml:
第一、配置推出crud页面流程:
| <action name="messageform" path="/messageaction" type="com.jdon.strutsutil.modelviewaction" scope="request" validate="false"> <forward name="create" path="/message.jsp" /> <forward name="edit" path="/message.jsp" /> </action> |
其中com.jdon.strutsutil.modelviewaction是jdon框架类。只要客户端浏览器调用http://localhost:8080/messageaction.do,通过上述配置将激活forward的name="create"流程,就能得到一个空白表单的页面message.jsp;如果客户端浏览器调用http://localhost:8080/messageaction.do?action=edit&messageid=18,通过上述配置将激活forward name="edit"流程,得到一个填满数据的表单页面,供用户修改。
第二、配置:接受用户提交新增修改过的数据,以便递交到业务层保存:
| <action name="messageform" path="/messagesaveaction" type="com.jdon.strutsutil.modelsaveaction" scope="request" validate="true" input="/message.jsp"> <forward name="success" path="/result.jsp" /> <forward name="failure" path="/result.jsp" /> </action> |
其实在上一步的message.jsp中已经使用到这一步的配置,在message.jsp的表单action值就是本步配置的path值:/messagesaveaction.do:
| <html:form action="/messagesaveaction.do" method="post" > <html:hidden property="action"/> messageid:<html:text property="messageid"/> name:<html:text property="name"/> <html:submit property="submit" value="submit"/> </html:form> |
在上面message.jsp中一定要有<html:hidden property="action"/>一行。
至此,模型message的crud功能开发完毕。
代码:三步代码编写
第一步、表现层编写一个查询action,继承jdon框架的com.jdon.strutsutil.modellistaction,该类名称为sample.web. messagelistaction,完成getpageiterator和findmodelbykey两个方法。
其中getpageiterator方法内容是业务层messageservice的调用:
| messageservice messageservice= (messageservice) webapputil.getservice("messageservice",request); return messageservice.getallmessages(start, count); |
所以messageservice接口中必须有getallmessages这个方法,主要功能是返回pageiterator对象
findmodelbykey方法内容也是业务层messageservice的调用:
| messageservice messageservice= (messageservice) webapputil.getservice("messageservice", request); return messageservice.getmessage((string)key); |
messageservice接口中必须有getmessage方法。
第二步、业务层实现messageservice接口方法getallmessages内容,一般是直接调用持久层messagedao方法。
第三步、持久层实现返回pageiterator对象:
| public pageiterator getmessages(int start, int count) throws exception { string get_all_items_allcount = "select count(1) from testmessage "; string get_all_items = "select messageid from testmessage "; return pageiteratorsolverofmessage. getpageiterator (get_all_items_allcount, get_all_items, "",start, count); } |
如果有参数,可以如下查询:
| public pageiterator getmessages(long categoryid, int start, int count) { string get_all_items_allcount = "select count(1) from message where categoryid = ? "; string get_all_items = "select messageid from message where categoryid = ? "; collection params = new arraylist(1); params.add(categoryid);//参数放在collection中 return pageiteratorsolver.getpageiterator(get_all_items_allcount, get_all_items, params, start, count); } |
配置之一:jdon框架配置文件
本步骤主要是需要告诉jdonframework.xml我们的messageservice实现子类是什么,以及调用的messagedao等组件,jdonframework.xml如下:
| <services> <pojoservice name="messageservice" class="sample.service.messageserviceimp"/> <component name="messagedao" class="sample.dao.messagedao"/> <component name="constants" class="sample.constants"> <constructor value="java:/testds"/> </component> </services> |
因为messageserviceimp类中调用了messagedao,messagedao中又涉及jndi名称,所以它们之间依赖关系靠jdon框架的ioc容器实现。messageserviceimp必须有构造器如下:
| public class messageserviceimp implements messageservice{ private messagedao messagedao; public messageserviceimp(messagedao messagedao){ this.messagedao = messagedao; } } |
配置之二:界面流程配置
这一步主要是struts-config.xml配置,和通常struts的actionform和action配置类似:
| <form-beans> …… <form-bean name="listform" type="com.jdon.strutsutil.modellistform" /> </form-beans> |
其中com.jdon.strutsutil.modellistform是框架批量查询特别使用的类。
| <action name="listform" path="/messagelistaction" type="sample.web.messagelistaction" scope="request"> <forward name="success" path="/messagelist.jsp" /> </action> |
其中sample.web.messagelistaction是我们前面代码编写部分编写的代码。这样,客户端浏览器通过http://localhost:8080/ messagelistaction.do就可以实现所有message批量分页查询显示。
注意,messagelist.jsp中编码和通常struts的jsp编码是一样的,需要使用logic:iterator从actionform为listform的list字段中获取单个的message对象,然后显示这些单个message对象,,如下:
| <logic:iterate indexid="i" id="message" name="listform" property="list" > <bean:write name="message" property="name" /> ......... </logic:iterate |
在messagelist.jsp中加入下面标签库可以自动显示多页,缺省一个页面显示30个条目。
| <multipages:pager actionformname="listform" page="/messagelistaction.do"> <multipages:prev name="[prev ]" /> <multipages:index displaycount="1" /> <multipages:next name="[next ]" /> </multipages:pager> |
模型message的批量查询功能已经全部完成。
闽公网安备 35060202000074号