﻿<?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-阿正的博客-随笔分类-other open resources</title><link>http://www.blogjava.net/kentsong/category/12395.html</link><description>嘿嘿嘿...... I love Java</description><language>zh-cn</language><lastBuildDate>Sat, 03 Mar 2007 04:45:20 GMT</lastBuildDate><pubDate>Sat, 03 Mar 2007 04:45:20 GMT</pubDate><ttl>60</ttl><item><title> Ofbiz 入门教程</title><link>http://www.blogjava.net/kentsong/archive/2006/06/21/54359.html</link><dc:creator>Kent</dc:creator><author>Kent</author><pubDate>Wed, 21 Jun 2006 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/kentsong/archive/2006/06/21/54359.html</guid><wfw:comment>http://www.blogjava.net/kentsong/comments/54359.html</wfw:comment><comments>http://www.blogjava.net/kentsong/archive/2006/06/21/54359.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kentsong/comments/commentRss/54359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kentsong/services/trackbacks/54359.html</trackback:ping><description><![CDATA[
		<p>转贴：<img height="19" src="http://www.blogjava.net/Emoticons/72_72.gif" width="19" border="0" /> Ofbiz 入门教程</p>
		<p>1.Ofbiz 介绍：</p>
		<p>  Ofbiz(<a href="http://www.ofbiz.org">http://www.ofbiz.org</a>) 是 Open Source 的商务软件系统，充分利用了各优秀的的Open Source 项目，<br />像 Tomcat, Ant, BeanShell, Jboss 等，构建了一个强大的系统平台，Ofbiz 已经完成了大部分商务类软件系统<br />都需要的部件，像用户认证、工作流、商务规则处理等，Ofbiz 的核心技术在于 Entity Engine，其他的组件基本都<br />是基于它的。简单来说 Entity Engine 的主要功能是将数据库表创建、对象与数据表的映射、对象的查询等做了强大<br />封装，你可以在一个简单的 XML 文件中定义数据库表结构，Ofbiz 会自动帮你在数据库建表，并动态生成映射对象，<br />你在程序中可以只考虑对 Object 的处理，Ofbiz 会自动通过事务逻辑更新到数据库中。Ofbiz 宣称的优点之一是用<br />很少的 Code 完成复杂的处理。 </p>
		<p>2.Ofbiz 下载与安装</p>
		<p>  首先要安装 J2SDK1.4，到 <a href="http://java.sun.com">http://java.sun.com</a> 上下载，安装后设定 JAVA_HOME 环境变量为 J2SDK 的安装目录。</p>
		<p>  访问网站 <a href="http://www.ofbiz.org">http://www.ofbiz.org</a>，上面有下载的连接，请选择 Complete 包，因为这个包中已经包含了运行 Ofbiz <br />的所有东西，下载下来解开后就可以运行了。</p>
		<p>  解开 Ofbiz 包到一个目录下，假设是 “C:\ofbiz”，该目录下将会有 catalina 和 ofbiz 两个目录， catalina <br />目录是 Tomcat 的目录，Ofbiz 对其配置做了修改，ofbiz 目录是 Ofbiz 的程序代码目录。在命令行状态下进入 <br />“c:\ofbiz\catalina\bin” 目录，运行“ ofbiz run”命令，就可以启动 Ofbiz，启动后你可以用浏览器访问 <br />“http://localhost:8080/ecommerce”，这可以访问 Ofbiz 的电子商务模块，通过页面上面的连接你可以访问到<br />其他模块。</p>
		<p>
				<br />3.Ofbiz Schema 的创建 </p>
		<p>Ofbiz 应用入门：</p>
		<p>  以一个实例说明，假设我们需要建一个客户资料表，起名为 StudyCustomer，各个段分别如下：<br />  StudyCustomer {<br />    customerId      Integer,<br />    customerName    String,<br />    customerNote    String,<br />  }</p>
		<p>  我们来实现基本的数据操作---增/删/改/查询，具体步骤如下：</p>
		<p>
				<br />  1.在 XML 文件中定义数据 Schema：<br />    需要用到三个文件，一个是我们要建的项目的 entitymodel_xxx.xml 和 entityengine.xml，还有<br />    entitygroup.xml,<br />    entitymodel_xxx.xml 是需要我们自己创建的，假设我们起名为 entitymodel_study.xml，放在 <br />                “c:\ofbiz\ofbiz\commonapp\entitydef”目录下，<br />    entityengine.xml 是 Ofbiz 已经有的，放在 “c:\ofbiz\commonapp\etc”目录下，用来包含我们<br />                定义的 entitymodel 文件。<br />    entitygroup.xml  也是 Ofbiz 已经有的，跟 engityengine.xml 在同一目录下，我们需要把我们的<br />                Schema 定义加入到该文件中</p>
		<p>    entitymodel_study.xml 文件的定义格式如下：<br />&lt;!--================================================================================--&gt;</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE entitymodel PUBLIC "-//OFBiz//DTD Entity Model//EN" </p>
		<p>"<a href="http://www.ofbiz.org/dtds/entitymodel.dtd">http://www.ofbiz.org/dtds/entitymodel.dtd</a>"&gt;</p>
		<p>&lt;entitymodel&gt;<br />   &lt;title&gt;Entity of an Open For Business Project Component&lt;/title&gt;<br />   &lt;description&gt;None&lt;/description&gt;<br />   &lt;copyright&gt;Copyright (c) 2002 The Open For Business Project - <a href="http://www.ofbiz.org&lt;/copyright">www.ofbiz.org&lt;/copyright</a>&gt;<br />   &lt;author&gt;None&lt;/author&gt;<br />   &lt;version&gt;1.0&lt;/version&gt;</p>
		<p>  &lt;!-- ========================================================= --&gt;<br />  &lt;!-- ======================== Data Model ===================== --&gt;<br />  &lt;!-- The modules in this file are as follows:                  --&gt;<br />  &lt;!--  - org.ofbiz.commonapp.study --&gt;<br />  &lt;!-- ========================================================= --&gt;</p>
		<p>
				<br />  &lt;!-- ========================================================= --&gt;<br />  &lt;!-- org.ofbiz.commonapp.study --&gt;<br />  &lt;!-- ========================================================= --&gt;</p>
		<p>   &lt;entity entity-name="StudyCustomer"<br />         package-name="org.ofbiz.commonapp.study"<br />   title="Study Customer Entity"&gt;<br /> &lt;field name="customerId" type="id-ne"&gt;&lt;/field&gt;<br /> &lt;field name="customerName" type="long-varchar"&gt;&lt;/field&gt;<br /> &lt;field name="customerNote" type="long-varchar"&gt;&lt;/field&gt;<br /> &lt;prim-key field="customerId"/&gt;<br />  &lt;/entity&gt;<br /> &lt;/entitymodel&gt;</p>
		<p>&lt;!--================================================================================--&gt;</p>
		<p>  这个 XML 文件中的 Tag 基本是看得明白的，只是 field 的 type 是 Ofbiz 已经预定义好的，这<br />是为了保证数据库间的迁移。</p>
		<p>  在 entityengine.xml 加入我们刚才定义的文件，加入一行在合适的位置：<br />   &lt;resource loader="mainfile" location="entitymodel_study.xml"/&gt;<br />  具体放的位置我们可以通过查看 entityengine.xml 找到，里面已经有加好的其他文件。</p>
		<p>  在 entitygroup.xml 加入我们的 Schema 定义，在后面加入一行<br />   &lt;entity-group group="org.ofbiz.commonapp" entity="StudyCustomer" /&gt;</p>
		<p>  这样我们就定义好了 Schema，现在把 c:\ofbiz\commonapp\etc\entityengine.xml 拷贝到<br />  c:\ofbiz\catalina\shared\classes 目录下，这点要切记，我以前就因为没有拷贝，最后 Schema<br />  怎么也创建不了。</p>
		<p>  重新启动 Ofbiz，访问 URL: <a href="http://localhost:8080/webtools">http://localhost:8080/webtools</a>，点击右上方的 "Login" 链接，<br />  用 admin/ofbiz 登录，登录进入后选择链接“Check/Update Database”，这时会出现 Check 的 Form，<br />  该表单可以只检验 Schema 是否改变，默认的 GroupName 是“org.ofbiz.commonapp”，这个不需要变，<br />  点击“Check Only”按钮，Ofbiz 会检验变动情况，显示出一个完整的列表，你可以查一下是否有我们刚建的<br />  "StudyCustomer"，如果没有，可能是我们前面定义的有些问题，检查一下再重新做。</p>
		<p>  在检查到以后，可以再选择“Check and Add Missing”，这是 Ofbiz 很强大的一个功能，你在 XML 中新<br />  增了表，或在某个表中新增了段，它会自动映射到数据库中，避免我们去直接操作数据库。</p>
		<p>  现在已经完成了 StudyCustomer Schema 的创建,如果想检验一下是否有表创建，我们可以用编辑器打开<br />  c:\ofbiz\data\ofbiz.script ，在里面查询 CREATE TABLE StudyCustomer 的字样，如果前面没有<br />  问题，我们可以找到的。</p>
		<p> </p>
		<p>4.如何使用已经定义的 Schema</p>
		<p>如何使用已经定义的 Schema</p>
		<p>   Ofbiz 遵循 MVC 的设计模式，在 View 端，即 JSP 端主要使用 Ofbiz 定义的 Tag 来显示或<br />   提取数据，Control 是一个 Controller Servlet，我们在 Controller Servlet 的 URI mapping<br />   配置文件中定义各 URL 应该指向什么程序，这样，通过这个 mapping 配置文件，可以保证我们各个页面<br />   及具体处理程序之间的独立性，例我们可以通过修改这个配置文件就可以改变某个 Form 的 Post Action<br />   的 URL，而不需要修改实际的 HTML 或 JSP 代码。</p>
		<p>   Ofbiz 中定义了 Regions 的概念，即将一个 HTML 页面分成几个区域，像 Top, Left, Right, Main<br />   等，通过这些 Regions 我们可以方便的组合 UI 界面，并且可以方便改变各部分所处的位置，如我们可以<br />   把菜单很容易的从上方移到下方，只需要改变一个配置文件。Regions 类似于 HTML 中的 Frame，但它是<br />   通过一个页面来组合界面，Frame 是通过几个页面显示在不同的帧中，Frame 的控制比较复杂，而且需要<br />   改变相关的程序。</p>
		<p>   在 Ofbiz 中，我们可以直接在 JSP 中操作 Schema 定义的 Object，即我们刚定义的 StudyCustomer，<br />   示例如下：</p>
		<p>
				<br />&lt;%@ taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
		<p>&lt;%@ page import="java.util.*" %&gt;<br />&lt;%@ page import="org.ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />&lt;%@ page import="org.ofbiz.core.entity.*" %&gt;</p>
		<p>&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;<br />&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;</p>
		<p>&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) {%&gt;</p>
		<p>&lt;%<br />  try {<br />    delegator.create("StudyCustomer",<br />      UtilMisc.toMap("customerId","1","customerName","Cust1","customerNote","Customer Note 1"));</p>
		<p>    Iterator custs =               </p>
		<p>UtilMisc.toIterator(delegator.findAll("StudyCustomer",UtilMisc.toList("customerId","customerName","customerNote")));</p>
		<p>    while(custs.hasNext())<br />    {<br /> GenericValue cust = (GenericValue)custs.next();<br /> out.println(cust.getString("customerId"));<br /> out.println(cust.getString("customerName"));<br /> out.println(cust.getString("customerNote"));<br />    }<br />  } catch(Exception e)<br />  {<br />    out.println(e.getMessage());<br />  }<br />%&gt;<br />&lt;%}else{%&gt;<br />  &lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />&lt;%}%&gt;</p>
		<p>
				<br />  这段程序挺容易理解，先是通过 delegator 创建一个 Object，该 Object 将会由 Ofbiz 自动同步到<br />数据库中。然后通过 delegator 的 findAll 取到所有已保存的 Object，最后通过一个 Iterator 对象<br />显示出来。</p>
		<p>  这个程序起名为 testofbiz.jsp，为简单起见，我们放到 Ofbiz 已有的一个 Webapp 的目录下，放到<br />c:\ofbiz\ofbiz\partymgr\webapp\party 目录下。然后我们需要修改两个配置文件：controller.xml<br />和 regions.xml，这两个文件就是我们上面提到的 mapping 和 regions 配置文件。</p>
		<p>  这两个文件都在：c:\ofbiz\ofbiz\partymgr\webapp\WEB-INF 下，在 controller.xml 中加入下面</p>
		<p>   &lt;request-map uri="testofbiz"&gt;<br />      &lt;description&gt;Test Ofbiz&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;response name="success" type="view" value="testofbiz"/&gt;<br />   &lt;/request-map&gt;<br />  和<br />   &lt;view-map name="testofbiz" type="region"/&gt;<br />  <br />  加入位置请参照 controller.xml 中已经有的配置。在 regions.xml 中加入：<br />   &lt;define id='testofbiz' region='MAIN_REGION'&gt;<br />       &lt;put section='title'&gt;Test Ofbiz&lt;/put&gt;<br />       &lt;put section='content' content='/party/testofbiz.jsp'/&gt;<br />   &lt;/define&gt;<br />  具体加入位置请参考已有的配置。</p>
		<p>  配置完后，重新启动 ofbiz，然后访问 URL:<br />  <a href="http://localhost:8080/partymgr/control/testofbiz">http://localhost:8080/partymgr/control/testofbiz</a></p>
		<p>  由于我们在 testofbiz.jsp 程序中使用了 Ofbiz 的安全控制机制，系统会提示现在没有访问<br />  权限，需要登录，点击右边的“Login” 用 admin/ofbiz 登录后会看到我们程序 testofbiz.jsp<br />  的运行结果。如果需要增加新记录，请修改</p>
		<p>  UtilMisc.toMap("customerId","1","customerName","Cust1","customerNote","Customer Note 1"));</p>
		<p>  中的各个段的值，然后再访问 <a href="http://localhost:8080/partymgr/control/testofbiz">http://localhost:8080/partymgr/control/testofbiz</a>，如果不修改<br />  而直接访问那个 URL 时，系统会提示 Primary key 冲突。</p>
		<p>
				<br />5.按照显示与逻辑分离的原则使用 Schema:</p>
		<p>  上篇讲了如何在 JSP 中使用创建的 Schema 对象，这次我们来讲述一下如何把程序<br />逻辑放到 JavaBeans 中，把显示处理放到 JSP 中，并使用 controller.xml 将两<br />部分整合起来。</p>
		<p>  首先我们来创建一个 JavaBeans，来完成Add/Get/Delete/Update Schema 对象<br />的操作，程序文件名为 TestOfbiz.java，放置在 <br />  c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 目录下, 具体程序如下：</p>
		<p>&gt;=================================================================<br />package com.geeyo.ofbiz;</p>
		<p>import javax.servlet.*;<br />import javax.servlet.http.*;<br />import java.util.*;<br />import java.net.*;<br />import org.ofbiz.core.util.*;<br />import org.ofbiz.core.entity.*;<br />import org.ofbiz.core.service.*;<br />import org.ofbiz.core.security.*;<br />import org.ofbiz.core.stats.*;</p>
		<p>public class TestOfbiz<br />{<br />  public static void main(String[] args)<br />  throws Exception<br />  {<br />     GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />     delegator.create("StudyCustomer",UtilMisc.toMap("customerId","3","customerName","Kane3","customerNote","This is test customer.3"));</p>
		<p>     Iterator custs = UtilMisc.toIterator(delegator.findAll("StudyCustomer",UtilMisc.toList("customerId","customerName","customerNote")));</p>
		<p>     while(custs.hasNext())<br />     {<br />        GenericValue cust = (GenericValue)custs.next();<br />        System.out.println(cust.getString("customerId"));<br />        System.out.println(cust.getString("customerName"));<br />        System.out.println(cust.getString("customerNote"));<br />     }<br />  }</p>
		<p>  public static String createNewRecord(HttpServletRequest request, HttpServletResponse response)<br />  throws Exception<br />  {<br />     Map paras = UtilMisc.getParameterMap(request);</p>
		<p>     GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />     delegator.create("StudyCustomer",paras);</p>
		<p>     return "success";<br />  }</p>
		<p>  public static String lookAllRecords(HttpServletRequest request, HttpServletResponse response)<br />  throws Exception<br />  {<br />     GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />     Iterator custs = UtilMisc.toIterator(delegator.findAll("StudyCustomer",UtilMisc.toList("customerId","customerName","customerNote")));</p>
		<p>     Collection col = new ArrayList();</p>
		<p>     while(custs.hasNext())<br />     {<br />        GenericValue cust = (GenericValue)custs.next();<br />        col.add(cust);<br />   <br />     }</p>
		<p>     request.getSession().setAttribute("search_results",col);</p>
		<p>     return "success";<br />  }</p>
		<p>  public static String findRecord(HttpServletRequest request, HttpServletResponse response)<br />  throws Exception<br />  {<br />     String id = (String)request.getParameter("customerId");</p>
		<p>     GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");</p>
		<p>     try {<br />        GenericValue cust = delegator.findByPrimaryKey("StudyCustomer",UtilMisc.toMap("customerId",id));</p>
		<p>        request.getSession().setAttribute("edit_cust",cust);<br />     } catch (GenericEntityException gee) {<br />        Debug.logWarning(gee);<br />     }</p>
		<p>     return "success";<br />  } </p>
		<p>  public static String updateRecord(HttpServletRequest request, HttpServletResponse response)<br />  throws Exception<br />  {<br />     Map paras = UtilMisc.getParameterMap(request);</p>
		<p>     GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />     GenericValue cust = delegator.findByPrimaryKey("StudyCustomer",UtilMisc.toMap("customerId",paras.get("customerId")));<br />     cust.setNonPKFields(paras);<br />     cust.store();</p>
		<p>     request.getSession().setAttribute("edit_cust",cust);</p>
		<p>     return "success";<br />  }</p>
		<p>  public static String removeRecord(HttpServletRequest request, HttpServletResponse response)<br />  throws Exception<br />  {<br />     String strId = request.getParameter("id");<br />     GenericDelegator delegator = GenericDelegator.getGenericDelegator("default");<br />     GenericValue cust = delegator.findByPrimaryKey("StudyCustomer",UtilMisc.toMap("customerId",strId));<br />     cust.remove();</p>
		<p>     return "success";<br />  }<br /> <br />}</p>
		<p>
				<br />&gt;=================================================================</p>
		<p>
				<br />程序中的处理大部分可以看懂的，其中有个功能，是<br />  Map paras = UtilMisc.getParameterMap(request);<br />这是 Ofbiz 的一个有趣但非常有用的功能，它是把 request 中各段的名字和值映射到一个 Map<br />对象中，然后使用<br />  cust.setNonPKFields(paras);<br />就可以赋给 Object cust 的各个段，免了我们使用 request.getParameter("name")来取各个<br />值，在值很多的时候这个功能可以大大减少冗余代码量。</p>
		<p>  基本程序的逻辑是这样的，<br />  1.从 request 读取传来的值<br /> 2.使用 delegator 来处理，Add/Update/Delete/Query<br />  3.将返回结果放到 Session 中传给 JSP</p>
		<p>  我做了个 Ant build.xml 文件可以帮助编译，把这个文件放在:<br />   c:\ofbiz\ofbiz\testOfbiz\ 目录下，然后在命令行窗口下进入该目录，敲入 ant<br />  来编译（需要保证已经安装 Ant），编译后的 .class 会放在<br />   c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 下，<br />  拷贝 c:\ofbiz\ofbiz\testofbiz\com 目录到 c:\ofbiz\ofbiz\partymgr\webapp\WEB-INF\classes<br />  目录下。</p>
		<p>  build.xml<br />&gt;=============================================================================</p>
		<p>&lt;project name="TestOfbiz" default="dist" basedir="."&gt;<br />    &lt;description&gt;<br />    Test ofbiz<br />    &lt;/description&gt;</p>
		<p>  &lt;!--test cvs--&gt;<br />  &lt;!-- set global properties for this build --&gt;</p>
		<p>  &lt;property name="src" location="."/&gt;<br />  &lt;property name="build" location="."/&gt;</p>
		<p>  &lt;property name="lib_dir"  location="c:/ofbiz/catalina/shared/lib"/&gt;<br />  &lt;property name="lib1_dir"  location="c:/ofbiz/catalina/common/lib"/&gt;</p>
		<p>  &lt;path id="project.class.path"&gt;<br />    &lt;fileset dir="${lib_dir}"&gt;<br />       &lt;include name="*.jar"/&gt;<br />    &lt;/fileset&gt;<br />    &lt;fileset dir="${lib1_dir}"&gt;<br />       &lt;include name="*.jar"/&gt;<br />    &lt;/fileset&gt;<br />  &lt;/path&gt;</p>
		<p>  &lt;target name="init"&gt;<br />    &lt;!-- Create the time stamp --&gt;<br />    &lt;tstamp/&gt;<br />    &lt;!-- Create the build directory structure used by compile --&gt;<br />    &lt;mkdir dir="${build}"/&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="compile" depends="init"<br />        description="compile the source " &gt;<br />    &lt;!-- Compile the java code from ${src} into ${build} --&gt;<br />    &lt;javac srcdir="${src}" destdir="${build}"&gt;<br />      &lt;classpath refid="project.class.path"/&gt;<br />    &lt;/javac&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="dist" depends="compile"<br />        description="generate the distribution" &gt;<br />    &lt;!-- Create the distribution directory --&gt;<br />  &lt;/target&gt;</p>
		<p>  &lt;target name="clean"<br />        description="clean up" &gt;<br />    &lt;!-- Delete the ${build} and ${dist} directory trees --&gt;<br />  &lt;/target&gt;<br />&lt;/project&gt;</p>
		<p>
				<br />&gt;=============================================================================</p>
		<p>然后我们来创建 JSP 程序，JSP 程序全部放在 <br />  c:\ofbiz\ofbiz\partymgr\webapp\party 下面</p>
		<p>  1.listofbiz.jsp<br />&gt;=============================================================================</p>
		<p>&lt;%@ taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
		<p>&lt;%@ page import="java.util.*, org.ofbiz.core.service.ModelService" %&gt;<br />&lt;%@ page import="org.ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />&lt;%@ page import="org.ofbiz.core.entity.*" %&gt;<br />&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;<br />&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;</p>
		<p>&lt;script language="JavaScript"&gt;<br />  function confirmDelete()<br />  {<br />     return confirm("Are your sure to delete?");<br />  }<br />&lt;/script&gt;</p>
		<p>
				<br />&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) {%&gt;</p>
		<p>&lt;table width="600" align="center"&gt;<br />  &lt;ofbiz:if name="search_results"&gt;<br />   &lt;tr&gt;&lt;th&gt;Id&lt;/th&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Note&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;<br />    &lt;ofbiz:iterator name="cust" property="search_results"&gt;<br />      &lt;tr&gt;<br />        &lt;td&gt;&lt;ofbiz:entityfield attribute="cust" field="customerId"/&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;ofbiz:entityfield attribute="cust" field="customerName"/&gt;&lt;/td&gt;<br />        &lt;td&gt;&lt;ofbiz:entityfield attribute="cust" field="customerNote"/&gt;&lt;/td&gt;<br />        &lt;td&gt;<br />          &lt;a href='&lt;ofbiz:url&gt;/showtest?customerId=&lt;ofbiz:entityfield attribute="cust" field="customerId"/&gt;&lt;/ofbiz:url&gt;' class="buttontext"&gt;[Edit]&lt;/a&gt;<br />          &lt;a href='&lt;ofbiz:url&gt;/removetest?customerId=&lt;ofbiz:entityfield attribute="cust" field="customerId"/&gt;&lt;/ofbiz:url&gt;' class="buttontext" onclick="return confirmDelete()"&gt;[Remove]&lt;/a&gt;<br />        &lt;/td&gt;<br />      &lt;/tr&gt;<br />     &lt;/ofbiz:iterator&gt;<br />    &lt;/ofbiz:if&gt;<br />&lt;/table&gt;<br />&lt;table width="200" align="center"&gt;<br />  &lt;tr&gt;<br />  &lt;td&gt;&lt;a href='&lt;ofbiz:url&gt;/createTestForm&lt;/ofbiz:url&gt;'&gt;Create customer&lt;/a&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />&lt;/table&gt;</p>
		<p>&lt;%}else{%&gt;<br />  &lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />&lt;%}%&gt;</p>
		<p>&gt;=============================================================================</p>
		<p> 上面程序中需要说明的是<br />  &lt;ofbiz:if name="search_results"&gt;<br /> 和<br />  &lt;ofbiz:iterator name="cust" property="search_results"&gt;，<br /> <br /> &lt;ofbiz:if name="search_results"&gt; 是用来检验在 session 或 pageContext 对象<br />中是否包含 search_results 对象，该对象是由我们的程序放到 session 中的。<br /> &lt;ofbiz:iterator name="cust" property="search_results"&gt; 是用来循环读取对象<br />search_results（是个 Collection 对象）中存储的各对象，并赋给cust，然后在循环体<br />中，我们就可以用 cust 对象来读取各个段的值了。</p>
		<p>
				<br />2.createofbiz.jsp<br />&gt;=============================================================================</p>
		<p>&lt;%@ taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
		<p>&lt;%@ page import="java.util.*, org.ofbiz.core.service.ModelService" %&gt;<br />&lt;%@ page import="org.ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />&lt;%@ page import="org.ofbiz.core.entity.*" %&gt;<br />&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;<br />&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;<br />&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) {%&gt;</p>
		<p>&lt;form method="post" action="&lt;ofbiz:url&gt;/createTest&lt;/ofbiz:url&gt;" name="createofbiz"&gt;<br />&lt;table width="300" align="center"&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;Id&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerId" size="20"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerName" size="20"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;Note&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerNote" size="30"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;&lt;/td&gt;<br />  &lt;td&gt;&lt;input type="submit"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;/form&gt;</p>
		<p>&lt;%}else{%&gt;<br />  &lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />&lt;%}%&gt;<br />&gt;=============================================================================</p>
		<p>  这个程序很容易理解，需要注意的是每个文本框的名字，要跟 Schema StudyCustomer 的各<br />个段一致，以使程序中跟容易处理。</p>
		<p> 3.showofbiz.jsp<br />&gt;=============================================================================</p>
		<p>&lt;%@ taglib uri="ofbizTags" prefix="ofbiz" %&gt;</p>
		<p>&lt;%@ page import="java.util.*, org.ofbiz.core.service.ModelService" %&gt;<br />&lt;%@ page import="org.ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %&gt;<br />&lt;%@ page import="org.ofbiz.core.entity.*" %&gt;<br />&lt;jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" /&gt;<br />&lt;jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" /&gt;<br />&lt;%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) {%&gt;</p>
		<p>&lt;form method="post" action="&lt;ofbiz:url&gt;/updateTest&lt;/ofbiz:url&gt;" name="updateofbiz"&gt;<br />&lt;table width="300" align="center"&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;Id&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerId" size="20" value="&lt;ofbiz:entityfield attribute="edit_cust" field="customerId"/&gt;"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;Name&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerName" size="20" value="&lt;ofbiz:entityfield attribute="edit_cust" field="customerName"/&gt;"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;Note&lt;/td&gt;&lt;td&gt;&lt;input type="text" name="customerNote" size="30" value="&lt;ofbiz:entityfield attribute="edit_cust" field="customerNote"/&gt;"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />  &lt;tr&gt;<br />   &lt;td&gt;&lt;/td&gt;<br />   &lt;td&gt;&lt;input type="submit"&gt;&lt;/td&gt;<br />  &lt;/tr&gt;<br />&lt;/table&gt;<br />&lt;/form&gt;</p>
		<p>&lt;%}else{%&gt;<br />  &lt;h3&gt;You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)&lt;/h3&gt;<br />&lt;%}%&gt;</p>
		<p>&gt;=============================================================================</p>
		<p>  这个程序中，主要是通过<br />  &lt;ofbiz:entityfield attribute="edit_cust" field="customerId"/&gt;<br />  把取到的对象的段显示出来, 对象 edit_cust 是我们在程序中取到并放到 session 中的。</p>
		<p>下面我们来配置 controller.xml 和 regions.xml, 在 controller.xml 中加入:<br />&gt;=============================================================================</p>
		<p>   &lt;request-map uri="createTestForm"&gt;<br />      &lt;description&gt;Show the create form&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;response name="success" type="view" value="createTestForm"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="testofbiz"&gt;<br />      &lt;description&gt;Test Ofbiz&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;response name="success" type="view" value="testofbiz"/&gt;<br />   &lt;/request-map&gt;<br />  <br />   &lt;request-map uri="listtest"&gt;<br />      &lt;description&gt;List all records&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="lookAllRecords" /&gt;<br />      &lt;response name="success" type="view" value="listAllTest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="showtest"&gt;<br />      &lt;description&gt;Show records&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="findRecord" /&gt;<br />      &lt;response name="success" type="view" value="showTest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="createTest"&gt;<br />       &lt;security https="true" auth="true"/&gt;<br />       &lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="createNewRecord"/&gt;<br />       &lt;response name="success" type="request" value="listtest"/&gt;<br />       &lt;response name="error" type="view" value="createTestForm"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="updateTest"&gt;<br />      &lt;description&gt;update a record&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="updateRecord" /&gt;<br />      &lt;response name="success" type="request" value="listtest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="removetest"&gt;<br />      &lt;description&gt;remove a record&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="removeRecord" /&gt;<br />      &lt;response name="success" type="request" value="listtest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;view-map name="listAllTest" type="region"/&gt;<br />   &lt;view-map name="createTestForm" type="region"/&gt;<br />   &lt;view-map name="showTest" type="region"/&gt;<br />&gt;=============================================================================</p>
		<p>  在 regions.xml 中加入：<br />&gt;=============================================================================<br />   &lt;define id='createTestForm' region='MAIN_REGION'&gt;<br />       &lt;put section='title'&gt;Create Ofbiz&lt;/put&gt;<br />       &lt;put section='content' content='/party/createofbiz.jsp'/&gt;<br />   &lt;/define&gt;</p>
		<p>   &lt;define id='listAllTest' region='MAIN_REGION'&gt;<br />       &lt;put section='title'&gt;List Ofbiz&lt;/put&gt;<br />       &lt;put section='content' content='/party/listofbiz.jsp'/&gt;<br />   &lt;/define&gt;</p>
		<p>   &lt;define id='showTest' region='MAIN_REGION'&gt;<br />       &lt;put section='title'&gt;Show Ofbiz&lt;/put&gt;<br />       &lt;put section='content' content='/party/showofbiz.jsp'/&gt;<br />   &lt;/define&gt;</p>
		<p>&gt;=============================================================================</p>
		<p>  现在就完成了，我们重新启动 Ofbiz，然后用 IE 访问：<br />  <a href="http://localhost:8080/partymgr/control/listtest">http://localhost:8080/partymgr/control/listtest</a>，用admin/ofbiz 登录后就可以<br />看到我们刚才的工作成果了，你现在可以增加/删除/修改记录。</p>
		<p>
				<br />6.Ofbiz 通过 XML 来完成数据库操作（非常强大的功能）</p>
		<p>  这是 Ofbiz 的一个非常强大的功能，可能通过简单的 XML 文件来完成数据增/删/改的处理，<br />这些处理在数据库应用中是非常多的，因为很多需要维护的数据，所以写程序也是最花时间的，<br />Ofbiz 把这些操作通过 XML 来完成，不能不说是一大革命---使我们不用写程序就可以完成大<br />部分处理，这是每个程序员都向往的终极目标。</p>
		<p>  我们下面举例来讲述一下，处理的数据还是利用我们前面创建的 StudyCustomer，使用 XML<br />配置文件来完成前面程序 TestOfbiz.java 的大部分操作。</p>
		<p>  在 c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 目录下创建文件 TestOfbizServices.xml，<br />该文件的内容如下：</p>
		<p>&gt;=================================================================</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />&lt;!DOCTYPE simple-methods PUBLIC "-//OFBiz//DTD Simple Methods//EN" "<a href="http://www.ofbiz.org/dtds/simple-methods.dtd">http://www.ofbiz.org/dtds/simple-methods.dtd</a>"&gt;</p>
		<p>&lt;simple-methods&gt;</p>
		<p>   &lt;!-- TestOfbiz methods --&gt;<br />   &lt;simple-method method-name="createNewRecord" short-description="Create a new record"&gt;<br />       &lt;check-permission permission="STUDYCUSTOMER" action="_CREATE"&gt;&lt;fail-message message="Security Error: to run createRecord you must have the STUDYCUSTOMER_CREATE permission"/&gt;&lt;/check-permission&gt;        &lt;check-errors/&gt;</p>
		<p>       &lt;make-value entity-name="StudyCustomer" value-name="newEntity"/&gt;<br />       &lt;set-pk-fields map-name="parameters" value-name="newEntity"/&gt;<br />       &lt;set-nonpk-fields map-name="parameters" value-name="newEntity"/&gt;</p>
		<p>       &lt;create-value value-name="newEntity"/&gt;<br />   &lt;/simple-method&gt;<br />   &lt;simple-method method-name="updateRecord" short-description="Update a record"&gt;<br />       &lt;check-permission permission="STUDYCUSTOMER" action="_UPDATE"&gt;&lt;fail-message message="Security Error: to run updateRecord you must have the STUDYCUSTOMER_UPDATE permission"/&gt;&lt;/check-permission&gt;</p>
		<p>       &lt;check-errors/&gt;</p>
		<p>       &lt;make-value entity-name="StudyCustomer" value-name="lookupPKMap"/&gt;<br />       &lt;set-pk-fields map-name="parameters" value-name="lookupPKMap"/&gt;<br />       &lt;find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="lookedUpValue"/&gt;<br />       &lt;set-nonpk-fields map-name="parameters" value-name="lookedUpValue"/&gt;<br />       <br />       &lt;store-value value-name="lookedUpValue"/&gt;<br />   &lt;/simple-method&gt;</p>
		<p>   &lt;simple-method method-name="findRecord" short-description="lookup a record"&gt;<br />       &lt;check-errors/&gt;</p>
		<p>       &lt;make-value entity-name="StudyCustomer" value-name="lookupPKMap"/&gt;<br />       &lt;set-pk-fields map-name="parameters" value-name="lookupPKMap"/&gt;<br />       &lt;find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="edit_cust"/&gt;<br />   &lt;field-to-session field-name="edit_cust"/&gt;<br />   &lt;/simple-method&gt;</p>
		<p>   &lt;simple-method method-name="removeRecord" short-description="Delete a record"&gt;<br />       &lt;check-permission permission="STUDYCUSTOMER" action="_DELETE"&gt;&lt;fail-message message="Security Error: to run deleteRecord you must have the STUDYCUSTOMER_DELETE permission"/&gt;&lt;/check-permission&gt;<br />       &lt;check-errors/&gt;</p>
		<p>       &lt;make-value entity-name="StudyCustomer" value-name="lookupPKMap"/&gt;<br />       &lt;set-pk-fields map-name="parameters" value-name="lookupPKMap"/&gt;<br />       &lt;find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="lookedUpValue"/&gt;<br />       &lt;remove-value value-name="lookedUpValue"/&gt;<br />   &lt;/simple-method&gt;</p>
		<p>   &lt;simple-method method-name="lookAllRecords" short-description="lookup suitable records"&gt;<br />       &lt;check-errors/&gt;<br />       &lt;find-by-and entity-name="StudyCustomer" list-name="search_results"/&gt;<br />   &lt;field-to-session field-name="search_results"/&gt;<br />   &lt;/simple-method&gt;<br />   <br />&lt;/simple-methods&gt;</p>
		<p>
				<br />&gt;=================================================================</p>
		<p> 上面的 XML 基本是不用解释的，定义了</p>
		<p>  createNewRecord<br />  updateRecord<br />  lookAllRecords<br />  removeRecord<br />  findRecord</p>
		<p>  这几个方法，而且都有对用户权限的检查，这几个方法对应于前面 TestOfbiz.java 中的几个方法，<br />这样来做数据库操作显然比用 Java 程序写要简单得多，</p>
		<p>  下面还需要在 controller.xml（具体文件得位置请参照前面的教程）更改一下 mapping 的设置，<br />更改如下，以前使用 TestOfbiz.java 时的配置我以注释的方式保留着以做参照：</p>
		<p>&gt;=================================================================</p>
		<p>   &lt;request-map uri="createTestForm"&gt;<br />      &lt;description&gt;Show the create form&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;response name="success" type="view" value="createTestForm"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="listtest"&gt;<br />      &lt;description&gt;List all records&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />         &lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="lookAllRecords" /&gt;<br />      &lt;response name="success" type="view" value="listAllTest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="showtest"&gt;<br />      &lt;description&gt;Show records&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />         &lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="findRecord" /&gt;<br />      &lt;response name="success" type="view" value="showTest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="createTest"&gt;<br />       &lt;security https="true" auth="true"/&gt;<br />       &lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="createNewRecord"/&gt;<br />       &lt;response name="success" type="request" value="listtest"/&gt;<br />       &lt;response name="error" type="view" value="createTestForm"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="updateTest"&gt;<br />      &lt;description&gt;update a record&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="updateRecord" /&gt;<br />      &lt;response name="success" type="request" value="listtest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;request-map uri="removetest"&gt;<br />      &lt;description&gt;remove a record&lt;/description&gt;<br />      &lt;security https="false" auth="false"/&gt;<br />      &lt;event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="removeRecord" /&gt;<br />      &lt;response name="success" type="request" value="listtest"/&gt;<br />   &lt;/request-map&gt;</p>
		<p>   &lt;view-map name="listAllTest" type="region"/&gt;<br />   &lt;view-map name="createTestForm" type="region"/&gt;<br />   &lt;view-map name="testofbiz" type="region"/&gt;<br />   &lt;view-map name="showTest" type="region"/&gt;</p>
		<p>&gt;=================================================================</p>
		<p>  配置该文件的方法请参照前面的教程，regions.xml 不需改动。</p>
		<p>  配置完后请用前面讲过的方法访问 URL: <a href="http://localhost:8080/partymgr/control/listtest">http://localhost:8080/partymgr/control/listtest</a></p>
		<p>  现在我们可以看到，Ofbiz 在 MVC 方面做得非常好，我们可以把后端的处理程序从 java 改<br />成用 XMl 控制，而其他部分（像 JSP）不需任何改动，这可以保证我们系统各部分的独立性。<br /></p>
<img src ="http://www.blogjava.net/kentsong/aggbug/54359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kentsong/" target="_blank">Kent</a> 2006-06-21 21:28 <a href="http://www.blogjava.net/kentsong/archive/2006/06/21/54359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>