【转】Ofbiz学习经验谈
不可否认,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里面都有例子,参照一下就可以了
【转】Ofbiz学习经验谈的更多相关文章
- Apache OFBiz 学习笔记 之 服务引擎 二
加载服务定义文件 ofbiz-component.xml:所有的服务定义文件在每个组件的ofbi-component.xml文件中 加载服务定义 例:framework/common/ofbi ...
- Apache OFBiz 学习笔记 之 实体引擎
1.概述 entity engine和常见的ORM有一点很大的不同,他的mapping object只有一个 GenericEntity,称它的entity engine 为adaptive ...
- Apache OFBiz 学习笔记 之 服务引擎 一
概述 服务定义为一段独立的逻辑顺序,当多个服务组合一起时可完成不同类型的业务需求 服务有很多类型,WorkFlow.Rules.Java.SOAP.BeanShell等.java类型的 ...
- ofbiz学习笔记
最新稳定版apache-ofbiz-13.07.02 最新源码ofbiz-release14.12 ant load-demo 载入演示样例数据 ant load-seed 仅仅载入种子数据 ant ...
- ofbiz学习笔记01--多表关联查询
不管做什么项目,肯定会用到多表关联查询数据,从网络查询得知ofbiz有三种多表关联查询方法 实现一:Screem.xml 中的 section 里,加 <action>, 加 get-re ...
- [置顶] Oracle学习经验谈
经常遇到朋友问oracle学习难不难,怎么才能成为高手等等,我想结合我的个人经验简单说几点: 1.打好基础,由浅入深 学习Oracle不能急于求成,寄希望于一天成为一个大侠.学习有个过程,应该由浅入深 ...
- 大数据Hadoop与Spark学习经验谈
昨晚听了下Hulu大数据基础架构组负责人–董西成的关于大数据学习方法的直播,挺有收获的,下面截取一些PPT的关键内容,希望对正在学习大数据的人有帮助. 现状是目前存在的问题,比如找百度.查书这种学习方 ...
- PHP Web项目开发学习,经验谈
列个表格吧,看着也比较方便: 时间 事项 六月 七月 八月 九月 工作任务 前端页面 服务端页面 地图定位 服务器搭建 图片上传 视频文件信息的获取 关键词 Css+div+js PHP,谷歌maps ...
- 4星|《JAC写给外贸公司老板的企管书》:善总结爱学习、有业绩的老外贸的经验谈
作者从事外贸10余年,作出了业绩,也善总结.爱学习.爱分享.本书是作者在外贸行业的从业经验集.有一些战略方面的,比如开发小语种市场,大部分都是战术方面的操作细节(比如如何做营销),应该是非常适合从业者 ...
随机推荐
- Ubuntu 取消sudo密码
需求:在Ubuntu下装了FQ代理goagent之后,为了goagent能够开机启动.因为goagent需要sudo权限,所以要去掉sudo密码. 要修改的文件位于/etc/sudoers,先备份: ...
- Linux 学习guideline
记得在中国人气和高手最多的linuxform上看到的一句话. 现在自己的书架上以后lkd2+ldd3+情景分析,再加上它ulk3,书架的linux kernel的四库全书已经凑齐,很充实. lkd2: ...
- platform_driver_register(),platform_device_register()区别
设备与驱动的两种绑定方式:在设备注册时进行绑定及在驱动注册时进行绑定. 以一个USB设备为例,有两种情形: (1)先插上USB设备并挂到总线中,然后在安装USB驱动程序过程中从总线上遍历各个设备,看驱 ...
- spring利用注解来注册bean到容器
1.spring利用注解来定义bean,或者利用注解来注册装配bean.包括注册到ioc中,装配包括成员变量的自动注入. 1.spring会自动扫描所有类的注解,扫描这些注解后,spring会将这些b ...
- C语言指针的概念
在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍.为了正确地访问 ...
- s1.charAt(x)=='a'
public class hhh{public static void main(String[]args) { String s1="hkdhskhegoihwhonfdsaaa&qu ...
- 如何获取多核、多cpu系统中指定cpu的序列号
如何获取多核.多cpu系统中指定cpu的序列号作者:SkyJacker(转贴请保持完整并注明作者和出处)http://www.cnpack.orgCnPack IV QQ Group: 130970 ...
- *Linux之rm命令
自己瞅: [root@winner ~]# rm --help//rm-->remove用法:rm [选项]... 文件... 删除 (unlink) 文件. -f, --force 强制删除. ...
- 爬虫Larbin解析(一)——Larbin配置与使用
介绍 功能:网络爬虫 开发语言:c++ 开发者:Sébastien Ailleret(法国) 特点:只抓取网页,高效(一个简单的larbin的爬虫可以每天获取500万的网页) 安装 安装平台:Ubun ...
- url、href、src 详解
发现自己居然没把url.href.src关系及使用搞清楚,今天就理一下.主要包括:url.src.href定义以及使用区别.顺便试下在segmentfault来一发. URL(Uniform Reso ...