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}
继续补充,有其他见解的朋友,希望可以留下联系方式,一同讨论
分享到:
相关推荐
6. 开发业务逻辑:Ofbiz 提供服务(Service)和事件(Event)机制来处理复杂的业务逻辑。服务是可复用的代码单元,通常对应一个业务操作;事件则用于响应用户界面的交互。通过定义服务XML文件(servicedef.xml)和...
一、OFBiz的实体模型(Entity Model) OFBiz采用实体-关系(Entity-Relationship,简称ER)模型来组织数据。在OFBiz中,实体代表业务对象,如产品、订单、顾客等。每个实体由一组属性组成,这些属性描述了实体的...
它的核心组件包括实体引擎(Entity Engine)、事务处理引擎(Transaction Engine)、服务引擎(Service Engine)、工作流引擎(WorkEffort Engine)以及事件驱动模型(Event Driven Model)。理解这些组件的功能和...
OFBIZ提供了API进行数据访问,如EntityEngine接口,用于CRUD操作,以及服务事件中使用的Service Engine,可以调用复杂的业务逻辑。 ### 10. 事件(Event) 事件是OFBIZ处理用户请求和业务逻辑的核心机制,分为HTTP...
日志配置一般在OFBiz的`entityengine.xml`或`framework/service/config/service-engine.xml`等配置文件中。 通过以上步骤,你可以有效地在Eclipse中配置和使用OFBiz的调试环境,这对于理解和优化OFBiz应用的内部...
在《Ofbiz开发快速入门》中,你将了解到Ofbiz的核心概念,如实体模型(Entity)、服务(Service)和组件(Component)。实体模型是Ofbiz的基础,它定义了业务数据结构;服务则负责处理业务逻辑,是Ofbiz实现功能的...
<entity entity-name="Country" package-name="org.ofbiz.demo" table-name="demo_country"> <!-- 添加实体字段 --> <field name="countryCode" type="id-ne"><description>国家代码</description></field> ...
你可以继续添加实体定义(entity-engine.xml)、服务定义(service.xml)、屏幕布局(screen.xml)以及工作流定义(workflow.xml)等,来构建更复杂的业务逻辑。 在实践中,Ofbiz开发者还需要了解如何使用Ant或...
OFBiz的核心功能包括产品目录管理、订单处理、库存控制、供应链管理、财务管理、客户服务等模块,这些模块之间通过服务组件架构(Service Component Architecture, SCA)紧密集成,使得开发者可以方便地进行定制和...
2. **架构概述**:Ofbiz基于Service Engine、Entity Engine、Event Engine、WorkEffort Engine等核心引擎,文档可能会解析这些组件的作用及其相互关系,帮助读者理解Ofbiz的设计理念。 3. **模块详解**:Ofbiz包含...
<entity entity-name="GroupForum" package-name="org.ofbiz.group"> ... </entity> ``` 此配置定义了一个名为`GroupForum`的实体,其对应数据库中的某个表,并指定了实体所在的包路径。 #### 三、总结 通过...
OFBiz采用Service Engine、Entity Engine、Component Engine和Web App Framework等核心组件,提供了一个灵活且可扩展的平台。在OFBiz中,CmsBackEnd是指内容管理系统(Content Management System)的后台部分,它...
- **Entity & Service Config(实体与服务配置)** - **EntityConfig**:实体引擎配置,在 **entityengine.xml** 文件中定义。 - **EntityFieldType**:实体字段类型配置,在 **fieldtype*.xml** 文件中定义。 -...
服务(service)是OFBiz中业务逻辑的基本单元,通过`<service>`元素定义,包括服务名称、实现类、输入输出参数等。 4. **webapp.xml**: 此文件配置了OFBiz的Web应用程序,包括页面调度、主题样式、国际化设置等。...
创建新记录涉及定义实体(Entity)和实体扩展(EntityExt),在OFBiz中,实体模型是XML文件,定义了数据表的结构。然后,使用服务(Service)来处理插入操作,服务可以通过XML定义,包含事务控制、输入输出参数等。...
3. **OFBiz架构理解**:OFBiz使用模型-视图-控制器(MVC)设计模式,包含实体(Entity)、服务(Service)、组件(Component)、控制器(Controller)和视图(View)等部分。理解这些概念对于开发至关重要。 4. **...
其核心组件包括实体引擎(Entity Engine)用于数据管理,工作流引擎(Work Effort)处理任务和事件,以及调度器(Scheduler)来安排和执行定时任务。此外,还有服务引擎(Service Engine)处理业务逻辑,以及渲染...
实体在OFBiz中相当于数据库表,所以新建一个实体模型文件`entitymodel.xml`,定义部门表(Department)。在`ofbiz-component.xml`中添加对新实体的引用,确保在构建和加载数据时能识别这个实体。 构建OFBiz有两种...
3. **核心组件**:解释Ofbiz中的Service Engine、Entity Engine、WorkEffort Engine等核心组件的功能和使用方法。 4. **业务实体管理**:描述如何使用Ofbiz的实体引擎来管理数据库中的业务对象,创建和修改实体模型...