﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-梦在飞-文章分类-Jdon</title><link>http://www.blogjava.net/vso/category/16157.html</link><description>JAVA EE</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 18:26:31 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 18:26:31 GMT</pubDate><ttl>60</ttl><item><title>Jdon应用系统案例开发</title><link>http://www.blogjava.net/vso/articles/90439.html</link><dc:creator>vso</dc:creator><author>vso</author><pubDate>Thu, 28 Dec 2006 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/vso/articles/90439.html</guid><wfw:comment>http://www.blogjava.net/vso/comments/90439.html</wfw:comment><comments>http://www.blogjava.net/vso/articles/90439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/vso/comments/commentRss/90439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/vso/services/trackbacks/90439.html</trackback:ping><description><![CDATA[
		<h2 align="center">Jdon应用系统案例开发 </h2>
		<p align="left">jdon官方网站：<a href="http://www.jdon.com/jdonframework/app.htm">http://www.jdon.com/jdonframework/app.htm</a></p>
		<p>几乎大部分软件系统都有下面两个基本功能:</p>
		<ol>
				<li>
						<a href="http://www.jdon.com/jdonframework/threemin.htm#crud">新增/查询/修改/删除(CRUD)</a>; 
</li>
				<li>
						<a href="http://www.jdon.com/jdonframework/threemin.htm#batch">批量查询和分页显示</a>
				</li>
		</ol>
		<p>本文Step By Step详细讲解如何使用Jdon框架基于领域模型快速开发这两个功能，通过Jdon框架的可以快速完成<a href="http://www.jdon.com/mda/archetypes2.html" target="_blank">系统原型(ArcheType)</a>，使得开发者将真正精力集中在每个项目系统的特殊业务处理。</p>
		<p>
				<a href="http://www.jdon.com/jdonframework/train.rar">本文档源码下载</a>
		</p>
		<p>增删改查(CRUD)和批量分页查询是每个系统的基本功能，下面分这两部分描述。</p>
		<h3 align="center">
				<a name="crud">
				</a>CRUD开发步骤 </h3>
		<p>说明：每个应用系统中存在大量重复的CRUD开发流程，通过本框架可快速完成这些基本基础工作量，将精力集中在特殊功能设计上。 CRUD快速开发主要简化了表现层的流程，将其固化，或者是模板化，以配置替代代码编制，灵活而快速。每个Model一套固化CRUD流程。</p>
		<p>CRUD开发步骤分两个部分：代码编写 、配置。</p>
		<h4>CRUD代码：</h4>
		<blockquote>
				<p>代码只需要三步： <br />1、域建模：建立sample.model.Message，如下：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr>
										<td>
												<p>public class Message extends <strong>Model</strong> {<br />   private Long messageId;<br />   private String name;</p>
												<p>   public String getName() { return name; }<br />   public void setName(String name) { this.name = name; }</p>
												<p>   .......<br />}</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>注意点：</p>
		</blockquote>
		<blockquote>
				<ul>
						<li>模型类Message必须继承框架的com.jdon.controller.model.Model，或者实现com.jdon.controller.model.ModelIF接口。 
</li>
						<li>该模型类必须有一个能够标识其对象唯一性的主键，如messageId，这个主键相当于数据表的主键。 </li>
				</ul>
				<p>2、建立Model组件服务：首先建立模型Message的服务接口sample.service. MessageService：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr>
										<td>
												<p>public interface MessageService {<br />   void createMessage(EventModel em); <br />   void updateMessage(EventModel em);<br />   void deleteMessage(EventModel em);<br />   Message getMessage(String messageId);<br />}</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>至于MessageService的具体实现子类可以在现在或者以后建立，可见源码包中的sample.service.MessageServiceImp.</p>
		</blockquote>
		<blockquote>
				<p>3、建立Model的表现层边界模型：sample.web.MessageForm，必须继承框架的ModelForm，如下：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr>
										<td>
												<p>public class MessageForm extends <strong>ModelForm</strong> {</p>
												<p>   private String messageId;<br />   private String name;</p>
												<p>   public String getName() { return name; }<br />   public void setName(String name) { this.name = name; }<br />}</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>表现层MessageForm内容基本上是从业务层模型Message类中拷贝过来的，主要是为了保持MessageForm和Message的字段一致，我们就可以通过框架内MessageForm和Message的相同字段的复制进行数据传送，将业务层的Message数据传送到表现层MessageForm；或将界面表现层MessageForm传送到Message中。</p>
		</blockquote>
		<blockquote>
				<p>一个模型Message有关CRUD实现的代码工作到此结束，如果有其他模型，完全按照上述三个步骤再做一次，是不是不太费脑筋？有点模板化开发味道？下面谈谈CRUD实现第二组成部分：</p>
		</blockquote>
		<p>
				<strong>CRUD配置：</strong>
		</p>
		<p>两个配置文件分别是：</p>
		<ul>
				<li>将前面三步编写的类建立关系：jdonframework.xml 
</li>
				<li>配置界面流程：struts-config.xml </li>
		</ul>
		<p>一、Jdon框架配置文件</p>
		<blockquote>
				<p>首先我们将前面三步编写的三个类：模型Message、服务MessageService和界面模型MessageForm建立起联系，也就是告诉Jdon框架这三者是解决一个模型增删改查CRUD功能实现的。 由于这个配置文件是告诉Jdon框架的，因此，我们取名为jdonframework.xml，当然你也可以取其他名称，无论取什么名称，都要告诉Jdon框架，在struts-config.xml中配置:</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>&lt;plug-in className="com.jdon.strutsutil.InitPlugIn"&gt;<br />   &lt;set-property property="modelmapping-config"                            value="jdonframework.xml" /&gt;<br />&lt;/plug-in&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>jdonframework.xml配置内容如下：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;models&gt;<br />&lt;!-- the Model class is sample.model.Message, and the primary key of the Model class is messageId --&gt;<br />   &lt;model key="messageId" class ="sample.model.Message"&gt;<br />      &lt;!-- configuration about UI Form: MessageForm --&gt;<br />      &lt;actionForm name="messageForm"/&gt;<br />         &lt;handler&gt;<br />            &lt;!-- configuration about the Model service : MessageService --&gt;<br />            &lt;service ref="messageService"&gt; <br />            &lt;getMethod name="getMessage" /&gt;<br />            &lt;createMethod name="createMessage" /&gt;<br />            &lt;updateMethod name="updateMessage" /&gt;<br />            &lt;deleteMethod name="deleteMessage" /&gt;<br />         &lt;/service&gt;<br />       &lt;/handler&gt;<br />   &lt;/model&gt;</p>
												<p>   ......<br />&lt;/models&gt;<br />&lt;services&gt;<br />   &lt;!-- the Ioc configuration about MessageService --&gt;<br />   &lt;pojoService name="messageService" class="sample.service.MessageServiceImp"/&gt;</p>
												<p>   ......<br />&lt;/services&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>以上配置是配置模型Message、模型服务MessageService和界面模型MessageForm三者关系的，下面详细说明三个部分的配置：</p>
		</blockquote>
		<blockquote>
				<p>1、模型Message的配置：<br />这是通过第一行中的class值来指定当前Model是sample.model.Message：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr>
										<td>
												<p>&lt;model key="messageId" class ="sample.model.Message"&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>其中，Message模型的主键是messageId，这个messageId必须是Message类的一个字段；同时是用来唯一标识唯一的Message模型对象，也就是Object ID，或者可以认为是模型Message对应的数据表message的主键。</p>
		</blockquote>
		<blockquote>
				<p>2、界面模型MessageForm配置：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr>
										<td>
												<p>&lt;actionForm name="messageForm"/&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>可能你已经注意到：这里并没有写界面模型完整类：sample.web.MessageForm，而好像是MessageForm类的名称messageForm。 那么配置中messageForm名称是从哪里来的呢？是struts-config.xml中ActionForm定义名称，如下：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>&lt;struts-config&gt;<br />   &lt;form-beans&gt;   <br />      &lt;form-bean name="messageForm"                            type="sample.web.MessageForm" /&gt;<br />      …… <br />   &lt;/form-beans&gt;<br />….. <br />&lt;/struts-config&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>可见我们的界面模型完整类sample.web.MessageForm是在struts-config.xml中form-beans中配置，并且命名为messageForm，而这个messageForm就是jdonframework.xml中的messageForm。 </p>
		</blockquote>
		<blockquote>
				<p>3、模型服务MessageService配置：<br />在jdonframework.xml中首先申明MessageService完整实现是类sample.service.MessageServiceImp，并且取名为messageService：<br />&lt;pojoService name="<strong>messageService</strong>" class="sample.service.MessageServiceImp"/&gt;<br />这样，我们就可以详细将我们自己编写的messageService的CRUD方法名告诉Jdon框架了：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;handler&gt;<br />   &lt;!-- this will refer to service: messageService--&gt;   <br />   &lt;service ref="messageService"&gt; <br /><br />         &lt;!--getMessage is the method name of MessageService --&gt;<br />         &lt;getMethod name="getMessage" /&gt;</p>
												<p>         &lt;!--createMessage is the method name of MessageService --&gt;<br />         &lt;createMethod name="createMessage" /&gt;</p>
												<p>         &lt;!--updateMessage is the method name of MessageService --&gt;<br />         &lt;updateMethod name="updateMessage" /&gt;</p>
												<p>          &lt;!--deleteMessage is the method name of MessageService --&gt;<br />         &lt;deleteMethod name="deleteMessage" /&gt;</p>
												<p>      &lt;/service&gt;<br />&lt;/handler&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>黑体字部分正是messageService所指的类sample.service.MessageServiceImp所继承的接口sample.service. MessageService四个方法，可见前面代码步骤第二步。 </p>
		</blockquote>
		<p>二、界面流程配置</p>
		<blockquote>
				<p>界面流程主要是配置CRUD界面流程，Jdon框架CRUD流程主要分两个部分：第一是推出供用户新增修改删除的页面；第二是接受用户提交新增修改过的数据，以便递交到业务层保存。<br />这部分配置主要是配置struts-config.xml：<br />1、配置推出CRUD页面流程：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;action name="messageForm" path="/messageAction"          type="com.jdon.strutsutil.ModelViewAction"<br />         scope="request" validate="false"&gt;<br />                  &lt;forward name="create" path="/message.jsp" /&gt;<br />                  &lt;forward name="edit" path="/message.jsp" /&gt;<br />&lt;/action&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>其中com.jdon.strutsutil.ModelViewAction是Jdon框架类。只要客户端浏览器调用<a href="http://localhost:8080/messageAction.do">http://localhost:8080/messageAction.do</a>，通过上述配置将激活forward的name=”create”流程，就能得到一个空白表单的页面message.jsp；如果客户端浏览器调用<a href="http://localhost:8080/messageAction.do?action=edit&amp;messageId=18">http://localhost:8080/messageAction.do?action=edit&amp;messageId=18</a>，通过上述配置将激活forward name=”edit”流程，得到一个填满数据的表单页面，供用户修改。</p>
		</blockquote>
		<blockquote>
				<p>2、配置：接受用户提交新增修改过的数据，以便递交到业务层保存：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;html:form action="/messageSaveAction.do" method="POST" &gt;</p>
												<p>&lt;html:hidden property="action"/&gt; &lt;!-- this is a rule --&gt;</p>
												<p>MessageId：&lt;html:text property="messageId"/&gt;<br />&lt;br&gt;Name：&lt;html:text property="name"/&gt;<br />&lt;br&gt;&lt;html:submit property="submit" value="Submit"/&gt;<br />&lt;/html:form&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>其实在上一步的message.jsp中已经使用到这一步的配置，在message.jsp的表单action值就是本步配置的path值：/messageSaveAction.do：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;action name="messageForm" path="/messageSaveAction"         type="com.jdon.strutsutil.ModelSaveAction"<br />        scope="request" validate="true" input="/message.jsp"&gt;<br />                &lt;forward name="success" path="/result.jsp" /&gt;<br />                &lt;forward name="failure" path="/result.jsp" /&gt;<br />&lt;/action&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>在上面message.jsp中一定要有&lt;html:hidden property="action"/&gt;一行。至此，模型Message的CRUD功能开发完毕。 </p>
		</blockquote>
		<blockquote> </blockquote>
		<hr />
		<p> </p>
		<h3 align="center">
				<a name="batch">
				</a>批量分页查询实现</h3>
		<p>批量分页查询开发步骤也分两个部分：代码编写 、配置。</p>
		<h4>批量查询代码实现：</h4>
		<blockquote>
				<p>代码也分三步实现。<br />1、表现层编写一个查询Action，继承Jdon框架的com.jdon.strutsutil.ModelListAction，该类名称为sample.web. MessageListAction，完成getPageIterator和findModelByKey两个方法。<br />其中getPageIterator方法内容是业务层MessageService的调用：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />MessageService messageService = (MessageService)                                  WebAppUtil.getService("messageService",request);<br />return messageService.getAllMessages(start, count);</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>所以MessageService接口中必须有getAllMessages这个方法，主要功能是返回PageIterator对象<br />findModelByKey方法内容也是业务层MessageService的调用：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />MessageService messageService = (MessageService)                                WebAppUtil.getService("messageService", request);<br />return messageService.<strong>getMessage</strong>((String)key);</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>essageService接口中必须有<strong>getMessage</strong>方法。</p>
		</blockquote>
		<blockquote>
				<p>2、业务层实现MessageService接口方法<strong>getAllMessages</strong>内容，一般是直接调用持久层MessageDao方法。</p>
				<p>3、持久层实现返回PageIterator对象：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />public PageIterator getMessages(int start, int count) throws Exception {<br />        String GET_ALL_ITEMS_ALLCOUNT =<br />                "select count(1) from testmessage ";<br />        String GET_ALL_ITEMS = <br />               "select messageId from testmessage ";<br />        return pageIteratorSolver. getPageIterator (GET_ALL_ITEMS_ALLCOUNT, GET_ALL_ITEMS, "",start, count);<br />}</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>如果有参数，可以如下查询：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />public PageIterator getMessages(Long categoryId, int start, int count) {<br />       String GET_ALL_ITEMS_ALLCOUNT =<br />                  "select count(1) from message where categoryId = ? ";<br />       String GET_ALL_ITEMS = <br />                   "select messageId from message where categoryId = ? ";<br />       Collection params = new ArrayList(1);<br />       params.add(categoryId);//paramters will be put into Collection<br />       return pageIteratorSolver.getPageIterator(GET_ALL_ITEMS_ALLCOUNT,                                                  GET_ALL_ITEMS, params, start, count);<br />}</p>
										</td>
								</tr>
						</tbody>
				</table>
		</blockquote>
		<h4>批量查询配置</h4>
		<p>一、Jdon框架配置文件</p>
		<blockquote>
				<p>本步骤主要是需要告诉jdonframework.xml我们的MessageService实现子类是什么，以及调用的MessageDao等组件，jdonframework.xml如下：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;services&gt;<br />       &lt;pojoService name="messageService"                               class="sample.service.MessageServiceImp"/&gt;<br />       &lt;component name="messageDAO"                               class="sample.dao.MessageDAO"/&gt; <br />       &lt;component name="constants" class="sample.Constants"&gt;<br />              &lt;constructor value="java:/TestDS"/&gt;<br />       &lt;/component&gt; <br />&lt;/services&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>因为MessageServiceImp类中调用了MessageDAO，MessageDAO中又涉及JNDI名称，所以它们之间依赖关系靠Jdon框架的IOC容器实现。MessageServiceImp必须有构造器如下：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />public class MessageServiceImp implements MessageService{</p>
												<p>       private MessageDAO messageDAO;</p>
												<p>       public MessageServiceImp(MessageDAO messageDAO){</p>
												<p>              this.messageDAO = messageDAO;</p>
												<p>       }</p>
												<p>}</p>
										</td>
								</tr>
						</tbody>
				</table>
		</blockquote>
		<p>二、界面流程配置</p>
		<blockquote>
				<p>这一步主要是struts-config.xml配置，和通常struts的ActionForm和Action配置类似：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;form-beans&gt;<br />……<br />&lt;form-bean name="listForm" type="com.jdon.strutsutil.ModelListForm" /&gt;<br />&lt;/form-beans&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>其中com.jdon.strutsutil.ModelListForm是框架批量查询特别使用的类。</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;action name="listForm" path="/messageListAction" <br />       type="sample.web.MessageListAction" scope="request"&gt;<br />              &lt;forward name="success" path="/messageList.jsp" /&gt;<br />&lt;/action&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>其中sample.web.MessageListAction是我们前面代码编写部分编写的代码。这样，客户端浏览器通过http://localhost:8080/ messageListAction.do就可以实现所有Message批量分页查询显示。<br />注意，messageList.jsp中编码和通常Struts的Jsp编码是一样的，需要使用logic:iterator从ActionForm为listForm的list字段中获取单个的Message对象，然后显示这些单个Message对象,，如下：</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;logic:iterate indexId="i" id="message" name="listForm" property="list" &gt; </p>
												<p>       &lt;bean:write name="message" property="name" /&gt;</p>
												<p>       .........</p>
												<p>&lt;/logic:iterate</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>在messageList.jsp中加入下面标签库可以自动显示多页，缺省一个页面显示30个条目。</p>
				<table width="90%" bgcolor="#cccccc" border="0">
						<tbody>
								<tr bgcolor="#cccccc">
										<td>
												<p>
														<br />&lt;MultiPages:pager actionFormName="listForm"       page="/messageListAction.do"&gt;</p>
												<p>       &lt;MultiPages:prev name="[Prev ]" /&gt;<br />       &lt;MultiPages:index displayCount="1" /&gt;<br />       &lt;MultiPages:next name="[Next ]" /&gt;<br />&lt;/MultiPages:pager&gt;</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>模型Message的批量查询功能已经全部完成。 </p>
		</blockquote>
		<p> </p>
		<p>以上是介绍基于开源Jdon框架开发软件系统中的CRUD和批量查询功能步骤，遵循模板化开发，开发人员使用起来轻松而不容易出错，适合软件生产和严格的项目管理。</p>
<img src ="http://www.blogjava.net/vso/aggbug/90439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/vso/" target="_blank">vso</a> 2006-12-28 10:20 <a href="http://www.blogjava.net/vso/articles/90439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>