专注于企业信息化建设

OpenERP群:192766793 OFBIZ群:323570090
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

【转】Ofbiz学习经验谈

Posted on 2013-07-12 11:23  shardon  阅读(741)  评论(0编辑  收藏  举报

不可否认,OFBiz这个开源的系统功能是非常强大的,涉及到的东西太多了,其实对我们现在而言,最有用的只有这么几个:实体引擎、服务引擎、WebTools、用户权限管理。
最先要提醒各位的是,在配置一个OFBiz时,路径中千万不要包含空格,要不然老提示出错,无外乎是scoket write error之类的信息,会让你郁闷得不停^_^
用户登录鉴权这一块我们完全可以照搬OFBiz现有的东西,其实也就是调用包org.ofbiz.securityext.login.LoginEvents里面的一些方法来进行处理。 
Component定义:component-load.xml,可根据需要调整需在启动时引入的Component,比如增加一个Study,定义:
<load-component component-location="${ofbiz.home}/components/study"/>

首先需要进行如下几个项目的总体配置:
1、 entityengine.xml:实体引擎配置,主要是配置该数据的方式,如通过oracle访问,就配置一下localoracle,特别需要注意的是,在dataSource中配置中,一定要配置一个属性 - schema-name="OFBIZ",这个主要是为了在OFBiz启动时能够正常同数据库的对象进行匹配,如果没有进行配置,每次都会试图重新建立对象,会报对象名已经被占用的情况。
2、 serviceengine.xml:服务引擎配置,这个基本上不用作太大的修改,如要必要,可在这里边进行一些参数的调优,比如访问线程数配置等。
之后需要在components目录下新建一个目录study,目录里面的一些文件可直接从模板中拷贝,之后再进行必要的修改,涉及修改内容:  1、 entitygroup.xml & entitymodel 实体定义(3.0版本开始,各实体定义可在各自的Component下定义,而不必统一集中在commonapp下);定义实体及实体的相关属性(其实也就是相当于数据库的各种对象,需要注意的是,后续进行数据提取时,如果需要关联到多张表,也需要在这里面定义一个view-entity);
2、 services.xml:如果必要的话,可以这里边定义一些服务;
3、 data:一些初始配置数据,应该是相对固定,不经常变动的才放在这边,可通过Webtool工具导入到数据库中;
4、 src:如改动了一些Java源文件内容后,需要重新编译该目录的文件,可通过UltraEdit的工具配置来进行ant编译,非常方便,推荐使用,编译后的文件将生成到build目录下,生成的文件有各个class文件,也有一些.jar包(放在lib目录下),这些jar包是我们在Web应用中需要引用到的,当然,引用哪些包也是可配置的,下面会讲到;
5、 ofbiz-component.xml:主要的配置文件,需要注意的一些东西:
(1)<classpath type="jar" location="build/lib/*"/> 这是jar引用路径,我在考虑是否可改成直接引用class文件,也就是直接设置class文件所在的目录;
(2)title="Study" 这个就是我们通过appbar.ftl文件在主界面显示的那一排按钮上显示的内容,可根据需要调整,调整完要重启OFBiz,麻烦,可以考虑通过hot-deploy目录进行发布。
至于其他一些配置,很简单,看看就晓得。
下面讲一下Web应用配置,Web应用配置中涉及到的最重要的两个文件是:controller.xml和regions.xml,controller.xml文件主要是配置request-map,也就是请求映射关系,所有的请求映射都需要在这里边进行配置,也就是我们在Web页面上常看到的/login等,如果涉及到view-map类型是region,就需要从region.xml文件中去读取配置,其实也就是配置各个region引用的处理页面(可以是各种开发语言,比如Jsp、ftl等等)。另外,在region.xml配置文件中最重要的一部分就是MAIN_REGION的配置,就是整个网页布局的配置,包括header、appbar、error、content、footer等等,其中appbar就是我们在前面刚刚提到的主界面上那一排按钮的配置了,header、footer和error太简单,不说了,我们主要要修改的东西都是在content这一块上进行展现。  网页中用到的一些样式、公用的定义都是在main_template.jsp中写入的,也需要在MAIN_REGION的属性中配置引用的文件。样式定义文件是引用images这个component,所以这个也是关键,不能缺的。
最后,讲一讲我对数据库访问的一些简单的了解:对数据库的访问主要是通过GenericDelegator进行控制,包括一些常用的方法,如findAll、remove、store、create等等,具体的用法要去研究一下,其实也不算复杂,先建立一个GenericDelegator,如果是create、store就可以通过makeValue方法将一些字段的值设置到GenericValue,之后再进行store或是create,具体语法要去参考一些文档,还没去看这一块的东西。
最最需要访问的一些文档:OFBizChina 实体引擎配置指南、OFBizChina 区块(Region)指南、OFBizChina 服务引擎配置指南、OFBizChina JSP标签库指南,当然,研究OFBiz的前提是要首先要理解MVC模式的概念,也就是View-Model-Control,否则一切都是空谈。

补充几点: 1、 对于Ofbiz构造动态查询语句 (1) 构造查询条件 (2) 给每个条件之间加上逻辑关系,用mainCond = new EntityConditionList(andExprs, EntityOperator.AND); (3) 设置要显示的字段列表 (4) 设置排序字段列表 (5) 设置Distinct列表 EntityFindOptions findOpts = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true); (6) 获取实体列表 EntityListIterator pli = delegator.findListIteratorByCondition(entityName, mainCond, null, fieldsToSelect, orderBy, findOpts); (7) 一个动态查询语句的具体实例 <% String entityName="study"; List andExprs = new ArrayList(); String number=""; String name=""; String sex=""; String tel=""; //GenericDelegator delegator = GenericDelegator.getGenericDelegator("default"); EntityConditionList mainCond=null; if (request.getParameter("number")!=null)  number=request.getParameter("number").toString(); if (request.getParameter("name")!=null)  name=request.getParameter("name").toString(); if (request.getParameter("sex")!=null)  sex=request.getParameter("sex").toString(); if (request.getParameter("tel")!=null)  tel=request.getParameter("tel").toString(); //构造查询条件 if (number.compareTo("")!=0) andExprs.add(new EntityExpr("number",EntityOperator.EQUALS,number)); if (name.compareTo("")!=0) andExprs.add(new EntityExpr("name1",true,EntityOperator.LIKE,"%"+name+"%",true)); if (sex.compareTo("")!=0) andExprs.add(new EntityExpr("sex1",true,EntityOperator.LIKE,"%"+sex+"%",true)); if (tel.compareTo("")!=0) andExprs.add(new EntityExpr("tel",true,EntityOperator.LIKE,"%"+tel+"%",true)); //每个条件间的逻辑关系 if (andExprs.size() > 0)  mainCond = new EntityConditionList(andExprs, EntityOperator.AND); //要显示的字段列表 List fieldsToSelect = new ArrayList(); fieldsToSelect.add("number"); fieldsToSelect.add("name1"); fieldsToSelect.add("sex1"); fieldsToSelect.add("tel"); //排序字段列表 List orderBy = UtilMisc.toList("number", "name1"); //Distinct列表 EntityFindOptions findOpts = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true); //获取实体列表 EntityListIterator pli = delegator.findListIteratorByCondition(entityName, mainCond, null, fieldsToSelect, orderBy, findOpts); while(pli.hasNext()) { GenericValue cust = (GenericValue)pli.next();%> <tr> <td><%=cust.getString("number")%></td> <td><%=cust.getString("name1")%></td> <td><%=cust.getString("sex1")%></td> <td><%=cust.getString("tel")%></td> </tr> <%}%>
</table>
2、 对于所有的图片文件,都放在images目录下 3、 设置图片的标签<ofbiz:contenturl>图片路径</ofbiz:contenturl> 4、 链接Tag <ofbiz:url>control.xml里面设置的请求</ofbiz.url> 5、 <region:render section='header'/>引入header定义的文件 header这个标识在regions.xml里面定义 <define id='MAIN_REG' template='/templates/main_template1.jsp'> <put section='title'>Application Page</put> <!-- this is a default and is meant to overridden --> <put section='header' content='/includes/bottom.jsp'/> <put section='leftbar' content='/includes/left.jsp'/> <put section='middle' content='/includes/middle.jsp'/> <put section='content' content='/includes/middle.jsp'/> <!-- this is a default and is meant to overridden --> <put section='top' content='/includes/top.jsp'/> <put section='error' type="jpublish" content='/includes/errormsg.ftl'/> <!--<put section='footer' type="jpublish" content='/includes/footer.ftl'/>--> </define> 然后其它页面只要如下定义即可 <define id='BasePubEmp' region='MAIN_REG'> <put section='title'>View BasePubEmp</put> <put section='content' content='/BasePubEmp.jsp'/> </define> 注意,这边的content所指定的区块就是我们上面定义的content 6、 这些标签都挺简单的,Ofbiz里面都有例子,参照一下就可以了