`
zc-111
  • 浏览: 117252 次
  • 性别: 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}


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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics