`
zc-111
  • 浏览: 119707 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ofbiz Service&Entity

阅读更多
      package org.ofbiz.hello3;

      import java.util.HashMap;
      import java.util.Map;
      import org.ofbiz.base.util.Debug;
      import org.ofbiz.base.util.UtilMisc;
      import org.ofbiz.entity.GenericDelegator;
      import org.ofbiz.entity.GenericEntityException;
      import org.ofbiz.entity.GenericValue;
      import org.ofbiz.service.DispatchContext;
      import org.ofbiz.service.ServiceUtil;

      public class Hello3Services {

      public static final String module = Hello3Services.class.getName();

      //用于测试。

      public static Map createHelloPerson(DispatchContext dctx, Map context) {

      //JAVA服务写成一种标准的格式:一个公共类里有一个公共静态方法,该方法有两个参数,
  //一个DispatchContext用于取得对象(delegators, dispatchers, locale, and //security),
  //一个名叫context的影射Map包含了你的输入参数并返回一个结果影射
      
             GenericDelegator delegator = dctx.getDelegator();

      //步骤一、获取delegator(一个集成大部分地数据操作方法的牛B对象)
      //用DispatchContext类的getDelegator()方法取得和该dispatch/context相关联的GenericDelegator对象,即delegator. GenericDelegator是用于访问数据库的类
  //要操作数据库必须先取得该对象。
 
              try {

                  String helloPersonId = delegator.getNextSeqId("HelloPerson");

      //步骤二、用delegator调用方法取得序列号
      // GenericDelegator 类的getNextSeqId 方法用于从给定的序列中取得下一个有保证的//唯一的序列号;如果该序列不存在,该方法将创建它。方法原型为:
      //String getNextSeqId(java.lang.String seqName)

                  Debug.logInfo("helloPersonId = " + helloPersonId, module);

      // 输出到控制台或日志,仅仅是输出而已,可以帮助调试。

                  GenericValue helloPerson = delegator.makeValue("HelloPerson",

                          UtilMisc.toMap("helloPersonId", helloPersonId));

      //步骤三、调用delegator的makeValue方法创建GenericValue对象
      //GenericDelegator 类的makeValue方法用于创建GenericValue对象,该对象对应数据//库中一个具体实体,该方法的第一个参数是String型的实体名,第二个参数是一个映射。//方法原型为:
      //GenericValue makeValue (java.lang.String entityName, java.util.Map fields)

                  helloPerson.setNonPKFields(context);

      //步骤四、将输入参数中的非主码参数向GenericValue对象赋值(service.xml里传过来的参数,并且非主键参数)
      //GenericValue对象helloPerson调用GenericValue类的setNonPKFields方法将输入的//非主码域值传递给自己。该方法的原型为:
      //void setNonPKFields(java.util.Map fields)
      //其实该方法是GenericValue类继承GenericEntity类的方法得来的。

                  delegator.create(helloPerson);

      //步骤五、调用delegator的create方法将GenericValue对象写入数据库
      //调用GenericDelegator类的create()方法根据GenericValue 的格式创建实体,并将
      //实体写入数据源。该方法的原型是:GenericValue create(GenericValue value)

                  Map result = ServiceUtil.returnSuccess();

      // 由ServiceUtil类的returnSuccess()方法返回一个Map对象
      //方法原型是:static java.util.Map returnSuccess(java.lang.String successMessage)

                  result.put("helloPersonId", helloPersonId);

      // 在映射中关联指定对象的值到指定对象的码,即将输出参数放到映射中返回用户
      //方法原型为:Object put(Object key, Object value)

                  return result;

      // return Map
              } catch (GenericEntityException ex) { // required if you use delegator in Java

                  return ServiceUtil.returnError(ex.getMessage());

              }

          }

      }

      小结:

      步骤一、获取delegator

      步骤二、用delegator调用方法取得序列号

      步骤三、调用delegator的makeValue方法创建GenericValue对象

      步骤四、将输入参数中的非主码参数向GenericValue对象赋值

      步骤五、调用delegator的create方法将GenericValue对象写入数据库

      最后,通过MAP返回。




有公司这样用


      public class Hello3Services {

      public static final String module = Hello3Services.class.getName();

      //用于测试。

      public static Map createHelloPerson(HttpServletRequest request, HttpServletResponse response) {

             GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator");

String hname = request.getParameter("XXXX");
String hxml = request.getParameter("XXOO");


              try {
                  Map map = new HashMap();

                  String helloPersonId = delegator.getNextSeqId("HelloPerson");

  map.put("helloPersonId", helloPersonId);
  map.put("helloname", hname);
  map.put("helloxml", hxml);
                 // Debug.logInfo("helloPersonId = " + helloPersonId, module);

                  GenericValue helloPerson = delegator.makeValue("HelloPerson",map);
                  delegator.create(helloPerson);
                  return "SUCCESS";

      // return Map
              } catch (GenericEntityException ex) { // required if you use delegator in Java

                  return ServiceUtil.returnError(ex.getMessage());

              }

          }

      }


由于这两种方式是两个不同的EVENT,controller控制器(实际就是个servlet的映射)
先来看看两种情况的controller

<request-map uri="createHello">
  <security https="true" auth="true" />
  <event type="service" invoke="serviceName"/>
  <response name="success" type="view" value="updateButtonView" />
  <response name="error" type="view" value="updateButtonView" />
  </request-map>
<!--这是第一种,对应的controller处理type="service"-->
<request-map uri="createHello">
  <security https="true" auth="true" />
  <event type="java" invoke="createHello" path="com.sp.work.HelloManage" />
  <response name="success" type="view" value="updateButtonView" />
  <response name="error" type="view" value="updateButtonView" />
  </request-map>
<!--这是第二种,对应的controller处理type="java"-->

比较:
入参通过request对象获取
controller控制器需要返回的这个字符串决定转向,返回Map的话,不能正确转向。
所以在java方法里面我们需要返回一个String的字符串来决定转向。



入参通过service服务配置入参(IN)来传递给调用的java方法
[……局部代码……]
<attribute name="tabletype" type="String" mode="IN"optional="true" />
java返回参数放在map里面。service配置里面可以配置返回Map里面的所有元素
[……局部代码……]
<attribute name="entityId" type="String" mode="OUT"optional="true" />
返回并转向,可以调用ofbiz一个特殊的东西Modelservice
java代码应该这么写
map.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS);
---------------------------------------------------------------------
map = ServiceUtil.returnSuccess();
map.put("","");//ServiceUtil类大家可以看看,定义了许多这样方法,可以提高效率
---------------------------------------------------------------------
map.put(ModelService.RESPONSE_MESSAGE,"success");success对应controller里面的转向名
---------------------------------------------------------------------

map里面有多少元素,你需要哪些元素,你都可以这样去配置。但是你的name要与map中元素的键想对应.
如果想在页面上面获取这些值,我们可以通过在screen组件配置actions标签,然后set标签这样${parameters.XXXX}将Map里OUT过来的值set进来。
<set field="entityId" value=${parameters.entityId}/><!--请求中所代参数直接可以在这里set进来-->
我们页面就可以${entityId}


继续补充,有其他见解的朋友,希望可以留下联系方式,一同讨论

分享到:
评论

相关推荐

    ofbiz入门教程-初学者开发指南

    6. 开发业务逻辑:Ofbiz 提供服务(Service)和事件(Event)机制来处理复杂的业务逻辑。服务是可复用的代码单元,通常对应一个业务操作;事件则用于响应用户界面的交互。通过定义服务XML文件(servicedef.xml)和...

    ofbiz数据结构设计

    一、OFBiz的实体模型(Entity Model) OFBiz采用实体-关系(Entity-Relationship,简称ER)模型来组织数据。在OFBiz中,实体代表业务对象,如产品、订单、顾客等。每个实体由一组属性组成,这些属性描述了实体的...

    OFBIZ开发指南 英文2

    它的核心组件包括实体引擎(Entity Engine)、事务处理引擎(Transaction Engine)、服务引擎(Service Engine)、工作流引擎(WorkEffort Engine)以及事件驱动模型(Event Driven Model)。理解这些组件的功能和...

    OFBIZ10.04组件开发入门.doc

    OFBIZ提供了API进行数据访问,如EntityEngine接口,用于CRUD操作,以及服务事件中使用的Service Engine,可以调用复杂的业务逻辑。 ### 10. 事件(Event) 事件是OFBIZ处理用户请求和业务逻辑的核心机制,分为HTTP...

    eclipse如何配置ofbiz下的debug

    日志配置一般在OFBiz的`entityengine.xml`或`framework/service/config/service-engine.xml`等配置文件中。 通过以上步骤,你可以有效地在Eclipse中配置和使用OFBiz的调试环境,这对于理解和优化OFBiz应用的内部...

    Ofbiz快速开发入门详解

    在《Ofbiz开发快速入门》中,你将了解到Ofbiz的核心概念,如实体模型(Entity)、服务(Service)和组件(Component)。实体模型是Ofbiz的基础,它定义了业务数据结构;服务则负责处理业务逻辑,是Ofbiz实现功能的...

    ofbiz一个完整例子

    &lt;entity entity-name="Country" package-name="org.ofbiz.demo" table-name="demo_country"&gt; &lt;!-- 添加实体字段 --&gt; &lt;field name="countryCode" type="id-ne"&gt;&lt;description&gt;国家代码&lt;/description&gt;&lt;/field&gt; ...

    ofbiz开发者入门教程

    你可以继续添加实体定义(entity-engine.xml)、服务定义(service.xml)、屏幕布局(screen.xml)以及工作流定义(workflow.xml)等,来构建更复杂的业务逻辑。 在实践中,Ofbiz开发者还需要了解如何使用Ant或...

    OFBiz经典入门教程加速度编写

    OFBiz的核心功能包括产品目录管理、订单处理、库存控制、供应链管理、财务管理、客户服务等模块,这些模块之间通过服务组件架构(Service Component Architecture, SCA)紧密集成,使得开发者可以方便地进行定制和...

    ofbiz中文技术文档

    2. **架构概述**:Ofbiz基于Service Engine、Entity Engine、Event Engine、WorkEffort Engine等核心引擎,文档可能会解析这些组件的作用及其相互关系,帮助读者理解Ofbiz的设计理念。 3. **模块详解**:Ofbiz包含...

    ofbiz框架简单讲解

    &lt;entity entity-name="GroupForum" package-name="org.ofbiz.group"&gt; ... &lt;/entity&gt; ``` 此配置定义了一个名为`GroupForum`的实体,其对应数据库中的某个表,并指定了实体所在的包路径。 #### 三、总结 通过...

    ofbiz开发入门之CmsBackEnd实现的CRUD

    OFBiz采用Service Engine、Entity Engine、Component Engine和Web App Framework等核心组件,提供了一个灵活且可扩展的平台。在OFBiz中,CmsBackEnd是指内容管理系统(Content Management System)的后台部分,它...

    OFBiz Framework Quick Reference Book

    - **Entity & Service Config(实体与服务配置)** - **EntityConfig**:实体引擎配置,在 **entityengine.xml** 文件中定义。 - **EntityFieldType**:实体字段类型配置,在 **fieldtype*.xml** 文件中定义。 -...

    ofbiz重要的xml文件详解

    服务(service)是OFBiz中业务逻辑的基本单元,通过`&lt;service&gt;`元素定义,包括服务名称、实现类、输入输出参数等。 4. **webapp.xml**: 此文件配置了OFBiz的Web应用程序,包括页面调度、主题样式、国际化设置等。...

    ofbiz curd

    创建新记录涉及定义实体(Entity)和实体扩展(EntityExt),在OFBiz中,实体模型是XML文件,定义了数据表的结构。然后,使用服务(Service)来处理插入操作,服务可以通过XML定义,包含事务控制、输入输出参数等。...

    ofbiz-practice

    3. **OFBiz架构理解**:OFBiz使用模型-视图-控制器(MVC)设计模式,包含实体(Entity)、服务(Service)、组件(Component)、控制器(Controller)和视图(View)等部分。理解这些概念对于开发至关重要。 4. **...

    Ofbiz技术文档

    其核心组件包括实体引擎(Entity Engine)用于数据管理,工作流引擎(Work Effort)处理任务和事件,以及调度器(Scheduler)来安排和执行定时任务。此外,还有服务引擎(Service Engine)处理业务逻辑,以及渲染...

    ofbiz 入门+增删改查+实体

    实体在OFBiz中相当于数据库表,所以新建一个实体模型文件`entitymodel.xml`,定义部门表(Department)。在`ofbiz-component.xml`中添加对新实体的引用,确保在构建和加载数据时能识别这个实体。 构建OFBiz有两种...

    ofbiz 研究

    3. **核心组件**:解释Ofbiz中的Service Engine、Entity Engine、WorkEffort Engine等核心组件的功能和使用方法。 4. **业务实体管理**:描述如何使用Ofbiz的实体引擎来管理数据库中的业务对象,创建和修改实体模型...

Global site tag (gtag.js) - Google Analytics