第一部分

创建组件的定义文件

  1. hot-deploy/ 目录下新建一个子目录,命名为 practice,即 (hot-deploy/practice)。目录 的名称应该跟将要创建的新组件的名称一致。 注意: 所有关于这个组件的开发都应该只在这个子目录下进行。
  2. hot-deploy/practice 目录下新建一个 ofbiz-component.xml 文件,并将下面的内容复制到 这个文件中。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ofbiz-component name="practice"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/ofbiz-component.xsd">
  5. <resource-loader name="main" type="component"/>
  6. <webapp name="practice"
  7. title="Practice"
  8. server="default-server"
  9. base-permission="OFBTOOLS"
  10. location="webapp/practice"
  11. mount-point="/practice"
  12. app-bar-display="false"/>
  13. </ofbiz-component>

ofbiz-component.xml 文件的说明

ofbiz-component.xml 文件的作用是让 OFBiz 知道该组件资源的位置,同时将这个位置添加到 classpath 中。

<resource-loader> 标签中的 name 属性可以是任意的值,在本示例中我们用 maintype属性 告诉 OFBiz 我们要加载的是一个 component

  1. <resource-loader name="main" type="component"/>

<webapp>标签有7个属性:

  1. <webapp name="practice"
  2. title="Practice"
  3. server="default-server"
  4. base-permission="OFBTOOLS"
  5. location="webapp/practice"
  6. mount-point="/practice"
  7. app-bar-display="false"/>

下面的表格介绍了这些属性的意义:

属性 说明 是否必须
name web应用的名字
title 应用的标题,将会显示在导航的顶部
server 使用的服务器
base-permission 访问该组件所需的权限。在本例中,用户需要具有OFBTOOLS权限。因为admin用户具有这个权限,所以我们测试的时候并不需要创建一个新的用户
location 服务器默认的根目录
mount-point 用于访问该资源的 URL,在本例中,应该是 localhost:8080/practice
app-bar-display 如果设置为true,那么这个组件将会在主应用的 tabs 中显示,属于common OFBiz decorator 的一部分。

创建web应用的配置文件

我们创建的应用将遵循 J2EE webapp 的标准。

  1. practice组件中创建一个webapp目录(hot-deploy/practice/webapp)。这个目录将包含我们的组件中所有与 webapp 相关的文件。
  2. 因为我们要创建的应用的名称是practice,所以创建一个 hot-deploy/practice/webapp/practice 目录。 一个组件可以包含多个web应用。比如 marketing 组件就包含了 marketingsfa 两个web应用。
  3. 创建一个 hot-deploy/practice/webapp/practice/WEB-INF 目录。 OFBiz 的 web 应用需要两个配置文件,controller.xmlweb.xml。其中,controller.xml 用于告诉 OFBiz 如何去处理来自网站访问者的请求:调用哪个 action,渲染哪个页面等。web.xml 文件 用于告诉 OFBiz 哪些资源(数据库和业务逻辑)可以被这个web应用访问,以及如何去处理各种web有关的问题, 比如欢迎页面,重定向,和出错页面等。
  4. 创建 web.xml 文件(web.xml文件遵循 J2EE web 应用规范),文件的内容可以参考其他组件中的内容。 需要改动的重要的值有:<display-name>localDispatcherNamemainDecoratorLocationwebSiteId
  1. <context-param>
  2. <param-name>webSiteId</param-name>
  3. <param-value>PRACTICE</param-value>
  4. <description>A unique ID used to look up the WebSite entity to get information about catalogs, etc.</description>
  5. </context-param>
  6. <context-param>
  7. <param-name>localDispatcherName</param-name>
  8. <param-value>practice</param-value>
  9. <description>A unique name used to identify/recognize the local dispatcher for the Service Engine</description>
  10. </context-param>
  11. <context-param>
  12. <param-name>mainDecoratorLocation</param-name>
  13. <param-value>component://practice/widget/PracticeScreens.xml</param-value>
  14. <!-- change the path to the following if the above doesn't work for you -->
  15. <!-- <param-value>component://practice/webapp/practice/widget/PracticeScreens.xml</param-value> -->
  16. <description>The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files.</description>
  17. </context-param>
  • 目前我们先设置 websiteId 的值为 PRACTICE
  • 目前我们先设置 mainDecoratorLocation 的值为 “component://practice/widget/CommonScreens.xml”,这个配置项用于指定 screen 中主装饰器 的位置:
  1. ${parameters.mainDecoratorLocation}

这样做的好处是提高了代码的独立性,让我们在需要更改主装饰器的位置时,不用到处去更新 screen 中的代码。 另一个好处是,它提高了 screen 代码的重用性,我们可以重用别的组件中的 screen,但是用自己的主装饰器 来装饰它。

  • 创建 controller.xml 文件(用于 ofbiz webapp 控制器),这个文件的内容刚开始的时候会比较简单, 但是会随着我们添加新的功能而不断增长。目前,先将下面的内容放进去:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <site-conf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/site-conf.xsd">
  4. <include location="component://common/webcommon/WEB-INF/common-controller.xml"/>
  5. <description>Practice Component Site Configuration File</description>
  6. <owner>Copyright 2001-2009 The Apache Software Foundation</owner>
  7. <handler name="screen" type="view" class="org.ofbiz.widget.screen.ScreenWidgetViewHandler"/>
  8. <!-- Request Mappings -->
  9. <request-map uri="main">
  10. <security https="false" auth="false"/>
  11. <response name="success" type="view" value="main"/>
  12. </request-map>
  13. <!-- end of request mappings -->
  14. <!-- View Mappings -->
  15. <view-map name="main" type="screen" page="component://practice/widget/PracticeScreens.xml#main"/>
  16. <!-- change the path to the following if the above doesn't work for you -->
  17. <!-- <view-map name="main" type="screen" page="component://practice/webapp/practice/widget/PracticeScreens.xml#main"/> -->
  18. <!-- end of view mappings -->
  19. </site-conf>

创建用户接口

  1. 创建一个新的目录 hot-deploy/practice/webapp/practice/error
    • error 目录下创建一个 error.jsp 文件。文件中的内容可以参考其他任意模块中的 error.jsp 文件。error 页面的位置需要在 controller.xml 文件的开头设置,例如 <errorpage>/error/error.jsp</errorpage>
  2. 创建一个子目录 hot-deploy/practice/widget。这个目录用于存放表单,菜单和 screen 等UI文件。
  3. widget 目录中创建一个 PracticeScreens.xml 文件。目前,先放入下面的内容:
    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <screens xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/widget-screen.xsd">
    4. <screen name="main">
    5. <section>
    6. <widgets>
    7. <label text="This is first practice"/>
    8. </widgets>
    9. </section>
    10. </screen>
    11. </screens>

应用预览

到目前为止,我们已经创建了一个应用的基本的元素。让我们来预览一下应用被访问的整个流程。首先,浏览器端会发送一个请求, 比如:“localhost:8080/practice/control/main”

  • 当 OFBiz 收到这个请求,它会首先查看/practice,这是因为在 ofbiz-component.xml 文件中 我们定义了 mount point/practice。现在 OFBiz 知道 practice 组件将会接手剩下的处理。
  • OFBiz 接下来会查看 controller.xml 文件。在这个文件中,我们定义了 request-mapsview-maps。 如果 OFBiz 找到名称为 main 的 request-map, 它会使用与其对应的 view-map。 request-map 可以被配置为指向一个 view,或者也可以指向一个 event 或者 service。如果指向的是 view,那么程序会继续向下查找 controller.xml 文件,去查找对应的 view-map。
  • 为了让教程简单,让我们先配置所有的 view 都指向一个 type=screen。这样,page 标签就会指定 screen 定义文件的路径,并且在#后面制定用于显示的 screen 名字。

运行 Practice 应用

  1. 现在,让我们来第一次运行我们创建的应用! 启动服务器,并且在浏览器中输入 http://localhost:8080/practice/control/main,浏览器应该出现 如下的页面显示 “This is first practice”。

第一部分 - 图1

  1. practice目录下创建一个 index.jsp 文件。这个文件用于当你访问 http://localhost:8080/practice/ 这样的 URL 时做出响应。如果你输入 http://localhost:8080/practice/unknown/request 这样的 URL,请求将会按照 web.xml 中定义 的重定向路径进行跳转。在这种情况下,ContextFilter 会被用于过滤该请求,并且使用重定向路径来跳转请求。