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}


继续补充,有其他见解的朋友,希望可以留下联系方式,一同讨论
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值