Ofbiz 入门教程 2

程序中的处理大部分可以看懂的,其中有个功能,是
  Map paras = UtilMisc.getParameterMap(request);
这是 Ofbiz 的一个有趣但非常有用的功能,它是把 request 中各段的名字和值映射到一个 Map
对象中,然后使用
  cust.setNonPKFields(paras);
就可以赋给 Object cust 的各个段,免了我们使用 request.getParameter("name")来取各个
值,在值很多的时候这个功能可以大大减少冗余代码量。

  基本程序的逻辑是这样的,
  1.从 request 读取传来的值
 2.使用 delegator 来处理,Add/Update/Delete/Query
  3.将返回结果放到 Session 中传给 JSP

  我做了个 Ant build.xml 文件可以帮助编译,把这个文件放在:
   c:\ofbiz\ofbiz\testOfbiz\ 目录下,然后在命令行窗口下进入该目录,敲入 ant
  来编译(需要保证已经安装 Ant),编译后的 .class 会放在
   c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 下,
  拷贝 c:\ofbiz\ofbiz\testofbiz\com 目录到 c:\ofbiz\ofbiz\partymgr\webapp\WEB-INF\classes
  目录下。

  build.xml
>=============================================================================

<project name="TestOfbiz" default="dist" basedir=".">
    <description>
          Test ofbiz
    </description>

  <!--test cvs-->
  <!-- set global properties for this build -->

  <property name="src" location="."/>
  <property name="build" location="."/>

  <property name="lib_dir"  location="c:/ofbiz/catalina/shared/lib"/>
  <property name="lib1_dir"  location="c:/ofbiz/catalina/common/lib"/>

  <path id="project.class.path">
    <fileset dir="${lib_dir}">
       <include name="*.jar"/>
    </fileset>
    <fileset dir="${lib1_dir}">
       <include name="*.jar"/>
    </fileset>
  </path>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}">
      <classpath refid="project.class.path"/>
    </javac>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution" >
    <!-- Create the distribution directory -->
  </target>

  <target name="clean"
        description="clean up" >
    <!-- Delete the ${build} and ${dist} directory trees -->
  </target>
</project>


>=============================================================================

然后我们来创建 JSP 程序,JSP 程序全部放在
  c:\ofbiz\ofbiz\partymgr\webapp\party 下面

  1.listofbiz.jsp
>=============================================================================

<%@ taglib uri="ofbizTags" prefix="ofbiz" %>

<%@ page import="java.util.*, org.ofbiz.core.service.ModelService" %>
<%@ page import="org.ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %>
<%@ page import="org.ofbiz.core.entity.*" %>
<jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" />
<jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" />

<script language="JavaScript">
  function confirmDelete()
  {
     return confirm("Are your sure to delete?");
  }
</script>


<%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) {%>

<table width="600" align="center">
  <ofbiz:if name="search_results">
   <tr><th>Id</th><th>Name</th><th>Note</th><th></th></tr>
    <ofbiz:iterator name="cust" property="search_results">
      <tr>
        <td><ofbiz:entityfield attribute="cust" field="customerId"/></td>
        <td><ofbiz:entityfield attribute="cust" field="customerName"/></td>
        <td><ofbiz:entityfield attribute="cust" field="customerNote"/></td>
        <td>
          <a href='<ofbiz:url>/showtest?customerId=<ofbiz:entityfield attribute="cust" field="customerId"/></ofbiz:url>' class="buttontext">[Edit]</a>
          <a href='<ofbiz:url>/removetest?customerId=<ofbiz:entityfield attribute="cust" field="customerId"/></ofbiz:url>' class="buttontext" onclick="return confirmDelete()">[Remove]</a>
        </td>
      </tr>
     </ofbiz:iterator>
    </ofbiz:if>
</table>
<table width="200" align="center">
  <tr>
  <td><a href='<ofbiz:url>/createTestForm</ofbiz:url>'>Create customer</a></td>
  </tr>
</table>

<%}else{%>
  <h3>You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)</h3>
<%}%>

>=============================================================================

上面程序中需要说明的是
  <ofbiz:if name="search_results">

  <ofbiz:iterator name="cust" property="search_results">,

<ofbiz:if name="search_results"> 是用来检验在 session 或 pageContext 对象
中是否包含 search_results 对象,该对象是由我们的程序放到 session 中的。
<ofbiz:iterator name="cust" property="search_results"> 是用来循环读取对象
search_results(是个 Collection 对象)中存储的各对象,并赋给cust,然后在循环体
中,我们就可以用 cust 对象来读取各个段的值了。


2.createofbiz.jsp
>=============================================================================

<%@ taglib uri="ofbizTags" prefix="ofbiz" %>

<%@ page import="java.util.*, org.ofbiz.core.service.ModelService" %>
<%@ page import="org.ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %>
<%@ page import="org.ofbiz.core.entity.*" %>
<jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" />
<jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" />
<%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) {%>

<form method="post" action="<ofbiz:url>/createTest</ofbiz:url>" name="createofbiz">
<table width="300" align="center">
  <tr>
   <td>Id</td><td><input type="text" name="customerId" size="20"></td>
  </tr>
  <tr>
   <td>Name</td><td><input type="text" name="customerName" size="20"></td>
  </tr>
  <tr>
   <td>Note</td><td><input type="text" name="customerNote" size="30"></td>
  </tr>
  <tr>
   <td></td>
  <td><input type="submit"></td>
  </tr>
</table>
</form>

<%}else{%>
  <h3>You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)</h3>
<%}%>
>=============================================================================

  这个程序很容易理解,需要注意的是每个文本框的名字,要跟 Schema StudyCustomer 的各
个段一致,以使程序中跟容易处理。

3.showofbiz.jsp
>=============================================================================

<%@ taglib uri="ofbizTags" prefix="ofbiz" %>

<%@ page import="java.util.*, org.ofbiz.core.service.ModelService" %>
<%@ page import="org.ofbiz.core.util.*, org.ofbiz.core.pseudotag.*" %>
<%@ page import="org.ofbiz.core.entity.*" %>
<jsp:useBean id="security" type="org.ofbiz.core.security.Security" scope="request" />
<jsp:useBean id="delegator" type="org.ofbiz.core.entity.GenericDelegator" scope="request" />
<%if(security.hasEntityPermission("PARTYMGR", "_VIEW", session)) {%>

<form method="post" action="<ofbiz:url>/updateTest</ofbiz:url>" name="updateofbiz">
<table width="300" align="center">
  <tr>
   <td>Id</td><td><input type="text" name="customerId" size="20" value="<ofbiz:entityfield attribute="edit_cust" field="customerId"/>"></td>
  </tr>
  <tr>
   <td>Name</td><td><input type="text" name="customerName" size="20" value="<ofbiz:entityfield attribute="edit_cust" field="customerName"/>"></td>
  </tr>
  <tr>
   <td>Note</td><td><input type="text" name="customerNote" size="30" value="<ofbiz:entityfield attribute="edit_cust" field="customerNote"/>"></td>
  </tr>
  <tr>
   <td></td>
   <td><input type="submit"></td>
  </tr>
</table>
</form>

<%}else{%>
  <h3>You do not have permission to view this page. ("PARTYMGR_VIEW" or "PARTYMGR_ADMIN" needed)</h3>
<%}%>

>=============================================================================

  这个程序中,主要是通过
  <ofbiz:entityfield attribute="edit_cust" field="customerId"/>
  把取到的对象的段显示出来, 对象 edit_cust 是我们在程序中取到并放到 session 中的。

下面我们来配置 controller.xml 和 regions.xml, 在 controller.xml 中加入:
>=============================================================================

   <request-map uri="createTestForm">
      <description>Show the create form</description>
      <security https="false" auth="false"/>
      <response name="success" type="view" value="createTestForm"/>
   </request-map>

   <request-map uri="testofbiz">
      <description>Test Ofbiz</description>
      <security https="false" auth="false"/>
      <response name="success" type="view" value="testofbiz"/>
   </request-map>
 
   <request-map uri="listtest">
      <description>List all records</description>
      <security https="false" auth="false"/>
      <event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="lookAllRecords" />
      <response name="success" type="view" value="listAllTest"/>
   </request-map>

   <request-map uri="showtest">
      <description>Show records</description>
      <security https="false" auth="false"/>
      <event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="findRecord" />
      <response name="success" type="view" value="showTest"/>
   </request-map>

   <request-map uri="createTest">
       <security https="true" auth="true"/>
       <event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="createNewRecord"/>
       <response name="success" type="request" value="listtest"/>
       <response name="error" type="view" value="createTestForm"/>
   </request-map>

   <request-map uri="updateTest">
      <description>update a record</description>
      <security https="false" auth="false"/>
      <event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="updateRecord" />
      <response name="success" type="request" value="listtest"/>
   </request-map>

   <request-map uri="removetest">
      <description>remove a record</description>
      <security https="false" auth="false"/>
      <event type="java" path="com.geeyo.ofbiz.TestOfbiz" invoke="removeRecord" />
      <response name="success" type="request" value="listtest"/>
   </request-map>

   <view-map name="listAllTest" type="region"/>
   <view-map name="createTestForm" type="region"/>
   <view-map name="showTest" type="region"/>
>=============================================================================

  在 regions.xml 中加入:
>=============================================================================
   <define id='createTestForm' region='MAIN_REGION'>
       <put section='title'>Create Ofbiz</put>
       <put section='content' content='/party/createofbiz.jsp'/>
   </define>

   <define id='listAllTest' region='MAIN_REGION'>
       <put section='title'>List Ofbiz</put>
       <put section='content' content='/party/listofbiz.jsp'/>
   </define>

   <define id='showTest' region='MAIN_REGION'>
       <put section='title'>Show Ofbiz</put>
       <put section='content' content='/party/showofbiz.jsp'/>
   </define>

>=============================================================================

  现在就完成了,我们重新启动 Ofbiz,然后用 IE 访问:
  http://localhost:8080/partymgr/control/listtest,用admin/ofbiz 登录后就可以
看到我们刚才的工作成果了,你现在可以增加/删除/修改记录。


6.Ofbiz 通过 XML 来完成数据库操作(非常强大的功能)

  这是 Ofbiz 的一个非常强大的功能,可能通过简单的 XML 文件来完成数据增/删/改的处理,
这些处理在数据库应用中是非常多的,因为很多需要维护的数据,所以写程序也是最花时间的,
Ofbiz 把这些操作通过 XML 来完成,不能不说是一大革命---使我们不用写程序就可以完成大
部分处理,这是每个程序员都向往的终极目标。

  我们下面举例来讲述一下,处理的数据还是利用我们前面创建的 StudyCustomer,使用 XML
配置文件来完成前面程序 TestOfbiz.java 的大部分操作。

  在 c:\ofbiz\ofbiz\testOfbiz\com\geeyo\ofbiz 目录下创建文件 TestOfbizServices.xml,
该文件的内容如下:

>=================================================================

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE simple-methods PUBLIC "-//OFBiz//DTD Simple Methods//EN" "http://www.ofbiz.org/dtds/simple-methods.dtd">

<simple-methods>

   <!-- TestOfbiz methods -->
   <simple-method method-name="createNewRecord" short-description="Create a new record">
       <check-permission permission="STUDYCUSTOMER" action="_CREATE"><fail-message message="Security Error: to run createRecord you must have the STUDYCUSTOMER_CREATE permission"/></check-permission>        <check-errors/>

       <make-value entity-name="StudyCustomer" value-name="newEntity"/>
       <set-pk-fields map-name="parameters" value-name="newEntity"/>
       <set-nonpk-fields map-name="parameters" value-name="newEntity"/>

       <create-value value-name="newEntity"/>
   </simple-method>
   <simple-method method-name="updateRecord" short-description="Update a record">
       <check-permission permission="STUDYCUSTOMER" action="_UPDATE"><fail-message message="Security Error: to run updateRecord you must have the STUDYCUSTOMER_UPDATE permission"/></check-permission>

       <check-errors/>

       <make-value entity-name="StudyCustomer" value-name="lookupPKMap"/>
       <set-pk-fields map-name="parameters" value-name="lookupPKMap"/>
       <find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="lookedUpValue"/>
       <set-nonpk-fields map-name="parameters" value-name="lookedUpValue"/>
      
       <store-value value-name="lookedUpValue"/>
   </simple-method>

   <simple-method method-name="findRecord" short-description="lookup a record">
       <check-errors/>

       <make-value entity-name="StudyCustomer" value-name="lookupPKMap"/>
       <set-pk-fields map-name="parameters" value-name="lookupPKMap"/>
       <find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="edit_cust"/>
              <field-to-session field-name="edit_cust"/>
   </simple-method>

   <simple-method method-name="removeRecord" short-description="Delete a record">
       <check-permission permission="STUDYCUSTOMER" action="_DELETE"><fail-message message="Security Error: to run deleteRecord you must have the STUDYCUSTOMER_DELETE permission"/></check-permission>
       <check-errors/>

       <make-value entity-name="StudyCustomer" value-name="lookupPKMap"/>
       <set-pk-fields map-name="parameters" value-name="lookupPKMap"/>
       <find-by-primary-key entity-name="StudyCustomer" map-name="lookupPKMap" value-name="lookedUpValue"/>
       <remove-value value-name="lookedUpValue"/>
   </simple-method>

   <simple-method method-name="lookAllRecords" short-description="lookup suitable records">
       <check-errors/>
       <find-by-and entity-name="StudyCustomer" list-name="search_results"/>
              <field-to-session field-name="search_results"/>
   </simple-method>
  
</simple-methods>


>=================================================================

上面的 XML 基本是不用解释的,定义了

  createNewRecord
  updateRecord
  lookAllRecords
  removeRecord
  findRecord

  这几个方法,而且都有对用户权限的检查,这几个方法对应于前面 TestOfbiz.java 中的几个方法,
这样来做数据库操作显然比用 Java 程序写要简单得多,

  下面还需要在 controller.xml(具体文件得位置请参照前面的教程)更改一下 mapping 的设置,
更改如下,以前使用 TestOfbiz.java 时的配置我以注释的方式保留着以做参照:

>=================================================================

   <request-map uri="createTestForm">
      <description>Show the create form</description>
      <security https="false" auth="false"/>
      <response name="success" type="view" value="createTestForm"/>
   </request-map>

   <request-map uri="listtest">
      <description>List all records</description>
      <security https="false" auth="false"/>
         <event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="lookAllRecords" />
      <response name="success" type="view" value="listAllTest"/>
   </request-map>

   <request-map uri="showtest">
      <description>Show records</description>
      <security https="false" auth="false"/>
         <event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="findRecord" />
      <response name="success" type="view" value="showTest"/>
   </request-map>

   <request-map uri="createTest">
       <security https="true" auth="true"/>
       <event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="createNewRecord"/>
       <response name="success" type="request" value="listtest"/>
       <response name="error" type="view" value="createTestForm"/>
   </request-map>

   <request-map uri="updateTest">
      <description>update a record</description>
      <security https="false" auth="false"/>
      <event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="updateRecord" />
      <response name="success" type="request" value="listtest"/>
   </request-map>

   <request-map uri="removetest">
      <description>remove a record</description>
      <security https="false" auth="false"/>
      <event type="simple" path="com/geeyo/ofbiz/TestOfbizServices.xml" invoke="removeRecord" />
      <response name="success" type="request" value="listtest"/>
   </request-map>

   <view-map name="listAllTest" type="region"/>
   <view-map name="createTestForm" type="region"/>
   <view-map name="testofbiz" type="region"/>
   <view-map name="showTest" type="region"/>

>=================================================================

  配置该文件的方法请参照前面的教程,regions.xml 不需改动。

  配置完后请用前面讲过的方法访问 URL: http://localhost:8080/partymgr/control/listtest

  现在我们可以看到,Ofbiz 在 MVC 方面做得非常好,我们可以把后端的处理程序从 java 改
成用 XMl 控制,而其他部分(像 JSP)不需任何改动,这可以保证我们系统各部分的独立性。

猜你喜欢

转载自liuruirui1986.iteye.com/blog/1538193