1.当客户端发出请求时,调用第一个配置文件WEB-INF/controller.xml,根据请求的地址
处理方法1:直接调用java类的方法
<request-map uri="login">
<security https="true"
auth="false"/>
<event type="java"
path="org.ofbiz.webapp.control.LoginWorker"
invoke="login"/>
<response name="success" type="view"
value="main"/>
<response name="error" type="view"
value="login"/>
</request-map>
如果为login,会查找path="org.ofbiz.webapp.control.LoginWorker"这个类的invoke="login"
这个方法进行处理
处理方式2:通过service配置文件取查找对应的service(常用)
<request-map uri="createForum">
<security https="true"
auth="true"/>
<event type="service" path=""
invoke="createForum"/>
<response name="success" type="view"
value="FindForum"/>
<response name="error" type="view"
value="FindForum"/>
</request-map>
表示调用的类型为type="service"调用的方法为invoke="createForum"
2.进入servicedef/services.xml,这是service的配置文件
从里面找到上面对应的配置信息
<service name="createForum"
default-entity-name="GroupForum" engine="simple"
location="org/ofbiz/group/GroupServices.xml" invoke="createForum"
auth="true">
<description>Create a
GroupForum</description>
<permission-service
service-name="exampleGenericPermission"
main-action="CREATE"/>
<auto-attributes include="pk" mode="OUT"
optional="false"/>
<auto-attributes include="nonpk" mode="IN"
optional="true"/>
<override name="forumName"
optional="false"/>
</service>
文件配置的createForum这个文件实现的相关信息location="org/ofbiz/group/GroupServices.xml"表示实现
是通过minilanguage配置文件
3.进入script下面的org/ofbiz/group/GroupServices.xml文件
通过minilanguage配置文件
<simple-method method-name="createForum"
short-description="create a GroupForum">
<make-value entity-name="GroupForum"
value-name="newEntity"/>
<sequenced-id-to-env sequence-name="GroupForum"
env-name="newEntity.forumId"/> <!--
get the next sequenced ID -->
<field-to-result field-name="newEntity.forumId"
result-name="forumId"/>
<set-nonpk-fields map-name="parameters"
value-name="newEntity"/>
<create-value
value-name="newEntity"/>
</simple-method>
配置了对entity-name="GroupForum"实体的创建的相关信息和操作,该步骤可以用java代码实现.
4.进入实体配置文件部分
entitymodel.xml
<entity entity-name="GroupForum"
package-name="org.ofbiz.group" title="GroupForum
Entity">
<field name="forumId"
type="id-ne"><!-- primary sequenced
ID --></field>
<field name="forumName"
type="name"></field>
<field name="description"
type="description"></field>
<field name="authorID"
type="id"></field>
<field name="created"
type="date-time"></field>
<prim-key field="forumId"/>
</entity>
配置了entity-name="GroupForum" 的实体与数据库映射文件
entitygroup.xml
<entitygroup
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.ofbiz.org/dtds/entitygroup.xsd">
<entity-group group="org.ofbiz"
entity="GroupForum"/>
<entity-group group="org.ofbiz"
entity="GroupCategory"/>
<entity-group group="org.ofbiz"
entity="GroupThread"/>
<entity-group group="org.ofbiz"
entity="GroupPost"/>
</entitygroup>
配置了实体名称的组
5.service执行成功后会返回到展现逻辑配置部分,也就是WEB-INF/controller.xml中
<request-map uri="login">
<security https="true"
auth="false"/>
<event type="java"
path="org.ofbiz.webapp.control.LoginWorker"
invoke="login"/>
<response name="success" type="view"
value="main"/>
<response name="error" type="view"
value="login"/>
</request-map>
现在会请求到main中,
<view-map name="main" type="screen"
page="component://group/widget/group/CommonScreens.xml#main"/>
在WEB-INF/controller.xml中找到main的配置信息
该显示用screen配置显示component://group/widget/group/CommonScreens.xml#main
6.现在根据地址找到配置文件component://group/widget/group/CommonScreens.xml
#main表示该文件中name为main的screen
<screen name="main">
<section>
<actions>
<set field="titleProperty"
value="OrderOrderTaskList"/>
<set field="headerItem"
value="tasklist"/>
<script
location="component://order/webapp/ordermgr/WEB-INF/actions/task/ordertasklist.bsh"/>
</actions>
<widgets>
<decorator-screen
name="main-decorator">
<decorator-section name="body">
<container style="screenlet">
<container
style="screenlet-header">
<label style="boxhead" text="Main
Page"/>
</container>
<container
style="screenlet-body">
<section>
<condition><if-empty
field-name="userLogin"/></condition>
<widgets>
<container><label
text="${uiLabelMap.ExampleMessage}"/></container>
</widgets>
</section>
<container><label
text="${uiLabelMap.Welcome}"/></container>
</container>
</container>
</decorator-section>
</decorator-screen>
</widgets>
</section>
</screen>
<screen name="login">
<section>
<widgets>
<decorator-screen
name="main-decorator">
<decorator-section name="body">
<platform-specific>
<html><html-template
location="component://common/webcommon/login.ftl"/></html>
</platform-specific>
</decorator-section>
</decorator-screen>
</widgets>
</section>
</screen>
</screens>
该配置文件配置了显示的数据以及显示的格式
其中数据是通过.bsh文件和service提供的,而显示的格式为ftl文件提供的
7.进入group\webapp\group\WEB-INF\actions\forum在
bsh为beansheel配置文件,语法与java类似,在这儿是为了提供显示数据
import java.util.*;
import java.io.*;
import org.ofbiz.entity.*;
import org.ofbiz.base.util.*;
security = request.getAttribute("security");
delegator = request.getAttribute("delegator");
userLogin = session.getAttribute("userLogin");
person = null;
if (userLogin != null ) {
person =
userLogin.getRelatedOne("Person");
}
forumId = request.getParameter("forumId");
categoryId = request.getParameter("categoryId");
if ( categroyId == null ||UtilValidate.isEmpty(categoryId) ){
categoryId = delegator.getNextSeqId("GroupCategory");
}
groupCategory = delegator.findByPrimaryKey("GroupCategory",
UtilMisc.toMap("categoryId", categoryId));
context.put("forumId", forumId);
context.put("categoryId", categoryId);
context.put("groupCategory", groupCategory);
context.put("person", person);
该文件把需要的数据放到返回的上下文中
8.进入到group\webapp\group\forum\listForum.ftl
该文件为Freemarker的文件,作用是代替jsp作显示层
<#if forums?has_content>
Some of the famous celebrities who have visited our site:
<table>
<ul>
<#list forums as forum>
<tr>
<li><td><a
href
="EditForum?forumId=${forum.forumId?if_exists}">${forum.forumId?if_exists}</a></td>
<td>12
${forum.forumName?if_exists}</td>
<td>
${forum.description?if_exists}</td>
<li><td><a
href
="deleteForum?forumId=${forum.forumId?if_exists}">${forum.forumId?if_exists}</a></td>
</tr>
<tr>
<li><td><a
href
="FindCategory?forumId=${forum.forumId?if_exists}">${forum.forumId?if_exists}</a></td>
<td><a href
="EditCategory?forumId=${forum.forumId?if_exists}">${forum.forumId?if_exists}</a></td>
<td>
</td>
<li><td></td>
</tr>
</#list>
</ul>
</table>
</#if>
通过一些表达式和判断把数据显示出来,这样整个请求完毕
其他配置文件的作用:
data目录下的配置文件:
<entity-engine-xml>
<UserLogin userLoginId="DemoBuyer"
currentPassword="47ca69ebb4bdc9ae0adec130880165d2cc05db1a"
passwordHint=""/>
<UserLogin userLoginId="DemoRepAll"
currentPassword="47ca69ebb4bdc9ae0adec130880165d2cc05db1a"
passwordHint=""/>
<UserLogin userLoginId="DemoRepStore"
currentPassword="47ca69ebb4bdc9ae0adec130880165d2cc05db1a"
passwordHint=""/>
<UserLogin userLoginId="DemoCustCompany"
currentPassword="47ca69ebb4bdc9ae0adec130880165d2cc05db1a"
passwordHint=""/>
<UserLogin userLoginId="DemoCustAgent"
currentPassword="47ca69ebb4bdc9ae0adec130880165d2cc05db1a"
passwordHint=""/>
<UserLogin userLoginId="DemoCustomer"
currentPassword="47ca69ebb4bdc9ae0adec130880165d2cc05db1a"
passwordHint=""/>
<UserLogin userLoginId="supplier"
partyId="externaluser"
currentPassword="47ca69ebb4bdc9ae0adec130880165d2cc05db1a"
passwordHint=""/>
<UserLoginSecurityGroup groupId="ORDERSUPPLIER_LTD"
userLoginId="supplier" fromDate="2001-01-01
12:00:00.0"/>
</entity-engine-xml>
配置了系统启动时后需要添加的一些数据
config目录下的配置文件:为国际化配置信息
<property
key="OrderCaughtExceptionOnCartUpdate">
<value xml:lang="en">Caught exception
on cart update. </value>
<value xml:lang="es">Excepción
capturada en la actualización del
carro.</value>
<value xml:lang="fr">%Exception
attrapée dans la mise à jour du chariot.
%</value>
<value xml:lang="it">Eccezione
sull‘aggiornamento carrello.
</value>
<value xml:lang="ro">Exceptie la
actualizarea cosului. </value>
<value xml:lang="zh">更新购物车时发生意外情况
</value>
</property>
widget里面的form配置文件:
<form name="OrderPurchaseProductOptions"
type="single" target="OrderPurchaseReportProduct.pdf" title=""
extends="OrderPurchaseReportOptions">
<field name="fromOrderDate"
title="${uiLabelMap.OrderReportFromDate}"><date-time
type="timestamp"/></field>
<field name="thruOrderDate"
title="${uiLabelMap.OrderReportThruDate}"><date-time
type="timestamp"/></field>
<field name="submitButton"
title="${uiLabelMap.CommonRun}"
widget-style="smallSubmit"><submit
button-type="button"/></field>
</form>
配置了一些表单信息,和screen一样,但是他可以直接显示数据不需要使用Freemaerker的文ftl文件作页面布局,根据配置信息可以直接生成
ofbiz-componet.xml文件配置了项目要加载的配置文件的信息,它可以告诉OFBIZ应用程序组件的相关信息:数据模型,商业逻辑,用户接口,种子数据,以及其他程序需要的资源。
<ofbiz-component name="order"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd">
<resource-loader name="main"
type="component"/>
<classpath type="jar"
location="build/lib/*"/>
<classpath type="dir"
location="config"/>
<classpath type="dir"
location="script"/>
<classpath type="dir"
location="email"/>
<entity-resource type="model" reader-name="main"
loader="main"
location="entitydef/entitymodel.xml"/>
<entity-resource type="model" reader-name="main"
loader="main"
location="entitydef/entitymodel_old.xml"/>
<entity-resource type="model" reader-name="main"
loader="main"
location="entitydef/entitymodel_view.xml"/>
<entity-resource type="group" reader-name="main"
loader="main"
location="entitydef/entitygroup.xml"/>
<entity-resource type="eca" reader-name="main"
loader="main" location="entitydef/eecas.xml"/>
<entity-resource type="data" reader-name="seed"
loader="main"
location="data/OrderTypeData.xml"/>
<entity-resource type="data"
reader-name="seed-initial" loader="main"
location="data/OrderScheduledServices.xml"/>
<entity-resource type="data" reader-name="seed"
loader="main"
location="data/OrderSecurityData.xml"/>
<entity-resource type="data" reader-name="demo"
loader="main"
location="data/OrderDemoUser.xml"/>
<entity-resource type="data" reader-name="demo"
loader="main"
location="data/OrderProcessWorkflow.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_cart.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_shoppinglist.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_request.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_quote.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_requirement.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_return.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_opportunity.xml"/>
<service-resource type="model" loader="main"
location="servicedef/services_upgrade.xml"/>
<service-resource type="eca" loader="main"
location="servicedef/secas.xml"/>
<test-suite loader="main"
location="testdef/OrderTest.xml"/>
<webapp name="order"
title="Order"
server="default-server"
location="webapp/ordermgr"
base-permission="OFBTOOLS,ORDERMGR"
mount-point="/ordermgr"/>
</ofbiz-component>
eca.xml配置了调用指定的entity或者service触发的对应事件
entity:
<eca entity="OrderHeader" operation="create-store"
event="return">
<condition field-name="statusId" operator="equals"
value="ORDER_COMPLETED"/>
<condition field-name="needsInventoryIssuance"
operator="equals" value="Y"/>
<action service="issueImmediatelyFulfilledOrder"
mode="sync"/>
</eca>
service:
<eca service="changeOrderItemStatus"
event="commit">
<condition field-name="statusId" operator="equals"
value="ITEM_CANCELLED"/>
<action service="cancelOrderInventoryReservation"
mode="sync"/>
<action service="recalcShippingTotal"
mode="sync"/>
<action service="recalcTaxTotal"
mode="sync"/>
<action service="resetGrandTotal"
mode="sync"/>
<action service="checkOrderItemStatus"
mode="sync"/>
</eca>
entityengine.xml配置了数据库连接的相关信息
<datasource name="localmssql"
helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
schema-name="dbo"
field-type-name="mssql"
check-on-start="true"//启用的数据库连接
add-missing-on-start="true"
join-style="ansi"
alias-view-columns="false"
use-fk-initially-deferred="false">
<read-data reader-name="seed"/>
<read-data
reader-name="seed-initial"/>
<read-data reader-name="demo"/>
<read-data reader-name="ext"/>
<inline-jdbc
jdbc-driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc-uri="jdbc:sqlserver://10.0.70.15:1433;databaseName=ofbiz;SelectMethod=cursor;"
jdbc-username="ofbiz"
jdbc-password="ofbiz"
isolation-level="ReadCommitted"
pool-minsize="2"
pool-maxsize="250"/>
<!-- <jndi-jdbc
jndi-server-name="default" jndi-name="comp/env/jdbc/xa/localmssql"
isolation-level="ReadCommitted"/> -->
<!-- Orion Style JNDI name -->
</datasource>