不可否认,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 服务引擎配置指南、OFBizChinaJSP标签库指南,当然,研究OFBiz的前提是要首先要理解MVC模式的概念,也就是View-Model-Control,否则一切都是空谈。
1、 对于Ofbiz构造动态查询语句
(1) 构造查询条件
(2) 给每个条件之间加上逻辑关系,用mainCond = new EntityConditionList(andExprs, EntityOperator.AND);
(3) 设置要显示的字段列表
(4) 设置排序字段列表
(5) 设置Distinct列表
EntityFindOptionsfindOpts = 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列表
EntityFindOptionsfindOpts = 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里面都有例子,参照一下就可以了