OfBiz 使用示例

zgzlwm 贡献于2013-04-12

作者 xmust  创建于2003-08-18 02:20:00   修改者lemon  修改于2003-08-25 00:37:00字数8218

文档摘要:Ofbiz使用示例1概述1.1目的通过一个完整的例子,说明如何在Ofbiz架构上构建自己的应用。1.2要求(1)对OfBiz架构有一定的了解,了解Ofbiz中各部分Engine的运作原理。(2)对Rule的概念有一定的了解。(3)对Mandarax和Oryx有一定的了解。
关键词:

OfBiz 使用示例 Ofbiz使用示例 1 概述 1.1目的 通过一个完整的例子,说明如何在Ofbiz 架构上构建自己的应用。 1.2要求 (1) 对OfBiz 架构有一定的了解,了解Ofbiz中各部分Engine 的运作原理。 (2) 对 Rule 的概念有一定的了解。 (3) 对Mandarax和Oryx有一定的了解。 1.3效果 (1) 进一步熟悉Ofbiz的架构及其运作原理。 (2) 熟悉Ofbiz中 Entity Engine 包中核心API的用法。 (3) 进一步熟悉Rule的概念。 (4) 懂得运用oryx 制作 Rule。 (5) 懂得在Ofbiz的Service中通过Mandarax 的API 使用Rule。 (6) 懂得如何在Rule的实现类中调用本地”OfBiz的Service”。 1.4示例说明 本示例是一个银行存款的例子,即在存款过程中验证用户输入的信息是否有效。正确,则给出确认信息,反之则给出错误提示信息,如下图所示: Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 其中验证规则如下: (1) AccountID : 十二位的数字,并已存在于数据表中。 (2) CCY : 三位大写字母,并已存在于数据表中。 1.5系统应用环境说和系统架构示意图 (1) 应用环境 Mysql4 + ofbiz2.1.1 + mandarax2.3.1+oryx3.4.1+tomcat4.1.27 (2) 架构示意图 Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 2 Entity Engine 的配置和使用 2.1 EntityEngine概述 在Ofbiz中,EntityEngine的实质作用就是起 O-R Mapping的作用,,通过定义的xml与db的表进行映射,代码中不再需要sql语句 从而大大减轻了开发人员的工作量(关于EntityEngine概念的详细论述请参看Ofbiz的自带文档)。 (1) 结构示意图 (2)基本概念 数据库操作的中间层,数据库平台无关 通过xml定义数据库中的Table 三个配置文件: entityengine.xml:定义datasource entitygroup.xml: 定义datasource的表的清单 entitymodel_xxx.xml :定义表结构 2.2 配置entity配置文件 从前面的例子说明可知,我们需要两张的数据表:Account(AccountId,AccountName,balance)和 ExchangeRate(Ccy,Rate)。 (1)在%ofbiz_home%\commonapp\entitydef下新建entitymodel_Account.xml主要内容如下: (以“Account”为例,完整内容请参看相应的配置文件) Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 // 字段描述 // 主键描述 (2) 在%ofbiz_home%\commonapp\entitydef下修改 entitygroup.xml 在 其中加入 (3) 在%catalina_home%\shared\classes下修改entityengine.xml,在….之间增加: 。 (4) 在%catalina_home%\shared\classes下修改default delegator 将datasource-name="localhsql"改为datasource-name="localmysql",这样将” com.ofbiz.commonapp”包的entities对应的default delegator的数据源改到mysql。同时找到修改相应的设置,以保证能正确的连接到mysql 数据库。 2.3 新建数据表 (1)可以通过手工直接在mysql的test数据库上新建Account和ExchangeRate表。 (2)也可以让OFBiz自动生成。在%catalina_home%\bin下键入命令 ofbiz run启动ofbiz,然后到http://localhost:8080/webtools/control/install,点击load data,再点点击[yes,load now],再察看数据库,应有Account和ExchangeRate表的生成。 3 Service Engine的配置和使用 3.1 ServiceEngien概述 在Ofbiz中,ServerEngien使其核心部分,详细内容请参看Ofbiz自动的文档 Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 (1)基本概念 将大的逻辑分为多个小逻辑,通过对逻辑的组合来实现业务逻辑。 每个service由xml定义 Service的类型,java,simple,bsh Service对应的类,方法 Service的输入输出参数 输入输出参数通过Map来处理 (2) 结构示意图 3.2 配置准备 在配置Service之前,不妨先拷贝%ofbiz_home%下的partymgr为account_service。同时修改account_service\ webapp\WEB-INF下的web.xml,将 localDispatcherName partymgr 修改为 localDispatcherName account_service 其中,account_service可以为其他值,但要唯一,即其他的应用没有使用该值作为其localDipatcherName。 Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 3.3 配置Service 我们以Account表的“增、删、改,查,列表,存款”为例(ExchangaRate的操作服务在此忽略),我们需要定义5个的Service,为此需要在account_service\ webapp\WEB-INF下新建文件service.xml ,其内容如下: (以 Deposit Serice为例,具体内容请参看配置文件) deposit // 下面是该Service的 输入/输出 的参数描述 说明:mode 为IN的为从request传入的参数,mode为OUT的为传出的参数,ServiceEventHandler会将所有IN的参数包装为map 传给实现方法;optional,false表示该参数不能为空,ture表示能为空。其他方面请参照services.dtd。 4 Rule 的配置和使用 请注意上面的 “deposit”service,在该service的实现中我们就需要用到Rule,以用来验证“AccountID”和“CCY”的有效性。为此,我们在oryx中建立如下的Rule: (Rule所对应的实现类请参看相应文件) 4.1 建立Repository (1) java predicates checkAccountID(java.util.map) : 用来验证AccountID的有效性 checkCCY(java.util.map) : 用来验证 CCY 的有效性 Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 其中 java.util.map 是整个Rule的输入,当然在各个java predicate 中都只取它们所关心的参数,如checkAccontID 就只关心 AccountID 。 (2) simple predicates getRuleResult (java.util.map , java.lang.Double) : Rule的conclusion 其中java.util.Map 是Rule的输入(AccountID,CCYd等),java.lang.Double是Rule的输出(CCY对应的Rate)。 (3) java functions java.lang.Double getRate(java.util.map) : 取回CCY所对应的Rate(汇率) 其中java.util.map也就是整个Rule的输入。 4.2 建立Rule 根据以上的Repository,我们建立如下的Rule : if checkAccountID(Map inputMap) and checkCurrencyName(Map inputMap) then getRateResult(Map inputMap ,getRate(Map inputMap)); 并将该Rule存储为 : account_man.xml 文件,以便在 Ofbiz的Service实现类中使用。 说明: 利用 oryx建立rule 的操作步骤,请参看相应的文档。 5 Service 的实现类 只以”deposit”service的实现为例,其它service的实现请参看相应的文件。 public static Map deposit(DispatchContext dctx,Map context) throws Exception{ Map result = new HashMap(); //获得用户的输入的参数 String accountId = (String)context.get("accountId"); String currency = (String)context.get("currency"); Double amount = (Double)context.get("amount"); // 设定Rule所需要的条件 Integer accountLen = new Integer(12); Integer currencyLen = new Integer(3); // 构造Rule 的输入 Map Map inputMap = new HashMap(); Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 GenericDelegator delegator = dctx.getDelegator(); inputMap.put("accountId",accountId); inputMap.put("accountLen",accountLen); inputMap.put("currencyName",currency); inputMap.put("currencyLen", currencyLen); inputMap.put("delegator",delegator); // 使用 Mandarax的API ,进行Rule 的操作 KnowledgeBase kb = null; LogicFactorySupport lFactory = new LogicFactorySupport(); InferenceEngine ie = new ResolutionInferenceEngine(); XKBManager xkbManager = new XKBManager(); xkbManager.setDriver(new XKBDriver_2_1()); xkbManager.useDOM(); xkbManager.setDOMBuilder(new DOMBuilder()); // 调入 前面建立的Rule kb = xkbManager.importKnowledgeBase(new File("D:/OFBIZ/oryx_src_3.4.1/oryx-3.4.1-application/myxkb/account_man.xml")); // 构造查询 Class structs[] ={Map.class,Double.class} // 必须使用Rule中conclusion的名字 Predicate pp = new SimplePredicate("getRuleResult",structs); VariableTerm queryVariable = (VariableTerm)lFactory.variable("rate", Double.class); Fact f= lFactory.fact(pp,inputMap,queryVariable); // 进行查询 Query query = lFactory.query(f,"getRate"); ResultSet rs = ie.query(query,kb,InferenceEngine.ONE, InferenceEngine.BUBBLE_EXCEPTIONS); // 查看查询结果 if(rs.next()){ // Rule验证成功 rate = ((Double)rs.getResult(queryVariable)).doubleValue(); //存入 帐款 Map paras = new HashMap(); paras.put("accountId",accountId); GenericValue Account = delegator.findByPrimaryKey("Account",UtilMisc.toMap("AccountId",accountId)); double oldBalance = ((Double)Account.get("balance")).doubleValue(); double newBalance = amount.doubleValue()*rate+oldBalance; paras.put("balance",new Double(newBalance)); Account.setNonPKFields(paras); Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 Account.store(); // 返回存款结果 paras.put("currency",currency); paras.put("amount",amount); paras.put("rate",new Double(rate)); result.put("deposit",paras); } else {// wrong input // 验证失败,返回错误提示信息 result.put(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_ERROR); result.put(ModelService.ERROR_MESSAGE, "AccountID or Currency is wrong(please check...)"); return result; } return result; } 说明 : 上面的代码说明了如何在 service中 调用 Rule ,关键是mandarax包中几个核心API的使用。 6 View 的配置和使用 6.1 Web Engine概述 Ofbiz 的WebEngine 类似于 Apach的 Struts ,主要是使用了如下的设计模式,Filter,FrontControl,command helper 等,详细内容请参看Ofbiz自动的文档。 (1) 结构示意图 Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 (2) Web client调用过程 提交到controller,进行重定向 利用事件机制,调用某个类的方法 在此方法中调用某个service Service中通过ee进行逻辑处理 处理完成后,dispatch到某个view处理显示 说明 :这中间的每个部分几乎都可以重用,重用,必然导致很多的烦琐的定义。 6.2 controller 的配置 在 web-inf\controller.xml中加入如下的内容(以Deposit为例,具体内容请参看相应的配置文件), //用户访问的URL //是否需要身份验证 //要调用的Service //调用成功后的显示画面 //调用失败后的显示画面 // 说明: 在request mapping中,response的type如果是request则表示会继续执行一个request,如果是view则表示给出最后的显示。 Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved OfBiz 使用示例 6.3 Region 的配置 在 web-inf\region.xml 中加入如下的内容(只举一个例子,请查看相应的配置文件), // 为 View-map 的Type为region的view定义相应的region Create Account //对应的JSP文件 6.3 Jsp文件的编写 从 region.xml可知,可知我们需要编写的JSP文件,以 createAccount.jsp为例,详细的内容请参看相应的文件。 // 用到ofbiz的Taglib,请参看相应文档 <%@ taglib uri="ofbizTags" prefix="ofbiz" %>
AccountId
Name
Desc
CNY Equal
Confidential Page 10/15/2018 Copyright Ares International (Shanghai) Corp. All right reserved

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 7 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档