用户 本地化  消息和日志门面

用户门面用于管理当前用户和访问,登陆,授权及登出的信息。用户信息包括区域设置,时区以及币种/ec.user.nowTimestamp设置日期。
消息门面用于追踪用户的消息以及错误信息。错误消息列表ec.message.errors同样用于确定在一个服务调用或其他动作中是否存在错误。
日志门面用于记录日志。org.slf4j.Logger.
 
扩展和附加组件
组件目录结构
  data – 包含实体 XML数据文件, 其带有 根元素 entity-facade-xml,按照和 命令行指定的类型匹 配的 type 属性进行加载 (使用 -loadloadload 的可执行 WAR文件)如果没有指定 类型 ,可以为任何类型
 entity– 这个目录下存放  的是所有 将会被加载 的实体定义和 实体 ECA XML文件 ;实体 ECA文 件必须放在这个目录中并有件必须放在这个目录中并有 ".eecas.xml"的双重扩展名
 lib – 当 web 应用被部署的时候, 这个目录下的 JAR 文件将会被添加到 classpath中
 screen  – 约定 这个目录下的 界面会 被明确的引用( 通常过 "component://*" URL)
 script – 约定 这个目录下的 脚本 会被明确的引用( 通常过 "component://*" URL);Groovy,XML动作以及其他脚本都应位于这个目录下
 service  – 服务 将会按照服务 定义 XML文件中定义的路径进行加载, 同时不但位于组件 同时不但位于组件 同时不但位于组件 同时不但位于组件的服务 目录 之下还是 位于 "classpath://service/"之下的路径都会被找到; 服务 ECA文件必须放在这个目录中并 有".secas.xml"的双重扩展名  ;邮件 ECA文件必须放在这个目录中并有 ".emecas.xml"的扩展名 
 
组件安装
加载组件
1.将组件目录放在runtime/component目录里
2.在Moqui XML配置文件中添加一个component-list.component元素
 
装载界面
每个Moqui框架中的web应用(包括webroot)都必须有一个根界面,其指定在moqui-conf.webapp-list.webapp.root-screen-location属性中/默认根界面被调用时,将会加载位于runtime/compoment/webroot/screen/webroot.xml中的webroot应用。
 
对于源自于你组件中位于webroot界面下,界面路径所制定的可用界面来说,你需要令你组件中的每个顶层界面成为webroot界面祖先的子界面。有两种方式去实现。
1.添加一个screen.subscreens.subscreen-item元素到父界面
查看装载了example和工具应用界面的apps界面(runtime/component/webroot/screen/WebRoot/apps.xml)
2.添加一条SubscreenItem实体的记录,在screenLocation字段中指定自界面,装载点subscreenName字段中等同于subscreens-item.name属性,同时在userGroup字段中如果其值为ALL_USERS则表示适用于所有的用户,如果为一个实际的userGroupId则表示仅适用于这个用户组。
 
 
Moqui XML配置文件的设置
 
 
创建自己的组件
 
Moqui依照约定/配置优于编码的原则进行组件开发
创建目录
创建  runtime/component/tutorial/screen/tutorial.xml
以自界面的方式挂载
将该页面挂载到根界面下
定义根界面的webroot组件runtime/component/webroot/screen/webroot.xml
方式一在apps界面做修改,加入:
<subscreens-item name="Toturial" location="component://tutorial/screen/tutorial.xml"

                         menu-title="Toturial" menu-index="1"/>

  

方式二:
<entity-facade-xml>

<SubscreensItem screenLocation="component://webroot/screen/webroot/app.xml"

subscreenName="tutorial" userGroupId="ALL_USERS"

                subscreenLocation="component://tutorial/screen/tutorial.xml"

                menuTitle="Dutorial" menuIndex="2" menuInclude="Y"

/>

</entity-facade-xml>

  

 
 
子界面嵌入:
<screen require-authentication="false">

<widgets>

    <label type="hi" text="hello world"/>

    <render-mode>

        <text type="html" location="component://tutorial/screen/hello.html">

        </text>

    </render-mode>

</widgets>

</screen>

  

其中的render-mode是什么?在render-mode下,你可以为不同的渲染模式定义各种子元素,甚至是各种文本模式,如,html   xml   xsl-fo csv等。
 
 
第二步     实体
实体是一个基本的扁平列表的数据结构,并且通常为数据库中的一张表。一条实体值等价于数据库表的一行记录。Moqui框架没有使用对象关系映射方式,所以我们要做的就是定义一个实体,然后通过实体门面模式去写代码操作使用实体。
创建实体:
我们创建一个包含tutorialId和description两个字段的实体XML文件,并命名为Tutorial位于runtime/component/tutorial/entity/TutorialEntities.xml 
<entities>

    <entity entity-name="Tutorial" package-name="tutorial">

        <field name="tutorialId" type="id" is-pk="true"/>

        <field name="description" type="text-long"/>

    </entity>

</entities>

  

添加数据:
实体门面模式具有从XML文件中读取或写入数据的功能,这些XML文件中的节点元素需要和实体名对应,同样的属性名和字段名各需对应。
runtime/component/tutorial/data/TutorialData.xml 
<entity-facade-xml type="seed">

    <Tutorial tutorialId="TestOne" description="Test one description"/>

    <Tutorial tutorialId="TestTwo" description="Test two description"/>

</entity-facade-xml>

  

 
 
自动查询表单:
runtime/component/tutorial/screen/tutorial/FindTutorial.xml 

<screen require-authentication="anonymous-view">

    <transition name="findTutorial">

        <default-response url="."/>

    </transition>

    <action>

        <entity-find entity-name="Tutorial" list="tutorialList">

            <search-form-inputs/>

        </entity-find>

    </action>

    <widgets>

        <form-list name="ListTutorials" list="tutorialList"

        transition="findTutorial"

        >

            <auto-fields-entity entity-name="Tutorial" field-type="find-display"/>

        </form-list>

    </widgets>

</screen>

  

 
 
关键部分:
转换transition
转换/跳转指的是界面之间的链接。类似于一个顺序图易于,我们把每个界面当成一个个节点,那么界面中定义的转换/跳转就是“线”一般,从一个节点指向另外一个节点界面,并且同时有些跳转还包含动作或者服务。
    单个转换可以按照条件或者不同的错误结果返回各种响应页面,一切都取决于你的界面设计需求。
     个别转换会指向当前页面。(页面刷新)
查询实体动作  actions.entity-find
界面渲染时只有一个界面动作:查询实体(entity-find)
通常使用entity-find元素(或者调用java api使用EntityFind对象)时,你需要指定过滤条件,排序字段或者其他查询相关的信息去运行。
在上个例子中,我们使用了XML表单内的标准参数去进行实体查询,所以我么可以使用search-form-inputs子元素去自动生成处理字段。
如果想知道参数会长啥样只要查看浏览器中的html代码即可。这些都是基于XML表单定义自动生成的。
widgets.form-list
该例子中定义的是个真实的表单,指定的是多条记录/行数据的“列表”表单(相对于“单个”表单)
这里的name属性可以为任意值,但是需要XML界面内唯一
这里的list属性参照的是动作actions块中的entity-find返回的结果,transaction属性参照的是界面定义最上面的transaction元素。
ji既然目标是创建一个基于实体定义的表单,我们便给auto-fields-entity元素赋值为我们的Tutorial实体,设置field-type属性的值为find-display选项,表示会创建查询字段在头部并且在表格中生存并显示每条记录。
指定字段:
如果不想要默认的方式去生成description字段,要在form-list元素内添加一个field元素,并且跟在fields-entity元素之后
 
<form-list name="ListTutorials" list="tutorialList"

        transition="findTutorial">

            <auto-fields-entity entity-name="Tutorial" field-type="find-display"/>

             <field name="description">

             <header-field show-order-by="true">

                 <text-find find-options="true"/>

             </header-field>

            <default-field>

        <display/>

               </default-field>

            </field>

        </form-list>

  

Moqui学习Day2的更多相关文章

  1. NodeJS学习day2

    今天还是接着学习IO,主要方面是文件路径相关操作 练习代码如下: const fs = require('fs') // 执行C:\CS\Node.js>node .\day2\fsRoad.j ...

  2. Python学习-day2

    这周时间充裕,把第一周的两个作业登陆验证和三级菜单做完后又用零零散散的时间看完了第二周的课程,不得不说老男孩这个教育方式感觉还是不错的,其实说白了就是花钱找个人监督自己学习呗,而且还强行让我们养成一些 ...

  3. Moqui学习之代码分析mantle priceServices.xml

    <?xml version="1.0" encoding="UTF-8"?> <!-- This software is in the pub ...

  4. Moqui学习之数据与资源

    资源位置: 资源门面位置的字符串类似于URL的构成方式:协议,主机,可选端口和文件名.它支持标准的java URL协议(http https ftp jar file).同样也支持一些扩展的协议: c ...

  5. Moqui学习Day4

    添加一个新建表单 添加一个按钮来弹出新建表单,并创建一个转换来处理输入数据操作. 在FindTutorial.xml文件中添加一个转换. <!--新增 列表 --> <transit ...

  6. Moqui学习Day3

    添加一个新建表单 添加一个按钮来弹出新建表单,并创建一个转换来处理输入数据操作. 在FindTutorial.xml文件中添加一个转换. <!--新增 列表 --> <transit ...

  7. Moqui学习Day1

    运行时目录以及Moqui的xml配置文件 Moqui框架部署运行主要有三个核心部分: 可执行的war包文件 运行时目录 Moqui配置文件XML格式 不管怎么使用这个可执行的war文件,你必须拥有一个 ...

  8. python学习day2

    一.模块初识 python模块 模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用 ...

  9. python全栈学习--day2

    一.in的使用 说明:in有相当多的用处,比如判断,循环for 等. 实例一:in 操作符用于判断关键字是否存在于变量中 s = '男人john' print('男孩' in s) print('男孩 ...

随机推荐

  1. 迅为4412开发板Linux驱动教程之GPIO的初始化

    视频下载地址:http://pan.baidu.com/s/1c06oiti GPIO的初始化 • 在内核源码目录下使用命令“ls drivers/gpio/*.o”,可以看到“gpio-exynos ...

  2. [麦先生]学习PDO循序渐进使用方式

    使用方式  特点一:支持跨数据库 1:首先实例化PDO,创建PDO对象的四个必备参数:host(哪一种类型的数据库,mysql/orcal/SQLserver等);dbname(数据库的名称);cha ...

  3. openfire+asmack搭建的安卓即时通讯(五) 15.4.12

    这一篇博客其实是要昨天写的,但昨天做了作修改就停不下来了,这次的修改应该是前期开发的最终回了,其余的功能有空再做了,下周可能要做一些好玩的东西,敬请期待! 1.修改下Logo:(Just We) ht ...

  4. Java向上转型与向下转型

    一.向上转型 例如:Parent p=new Son(); 这样引用p只能调用子类中重载父类的方法:但属性是父类的:如果想调用子类属性的话,可以用getter()方法. 二.向下转型 子类对象的父类引 ...

  5. OC基础数据类型-NSSet

    1.集合:集合(NSSet)和数组(NSArray)有相似之处,都是存储不同的对象的地址:不过NSArray是有序的集合,NSSet是无序的集合.集合是一种哈希表,运用散列算法,查找集合中的元素比数组 ...

  6. mac os利用xampp实现apache下的cgi

    折腾了两天终于把问题解决了,mac os是10.10.3..够新了吧 系统原生的apache配置cgi老是配不好,突然发现xampp也有macos版的,准备下下来试试. 安装完成后,打开apache服 ...

  7. SGU 180 Inversions

    题意:求逆序数对数量. 思路一:暴力,O(N^2),超时. 思路二:虽然Ai很大,但是n比较小,可以离散化,得到每个Ai排序后的位置Wi,然后按照输入的顺序,每个Ai对答案的贡献是Wi-Sum(Wi- ...

  8. 我的Unity学习路线

    前言 上班的时间内都很忙在做项目,休息时间里闲下来了,却觉得没什么事做不自在.难道真是苦逼的命不会享受? 想了一下这一段时间以来的过程:先是重新看了一遍Unity的基础部分,然后买了<3D数学基 ...

  9. 经典71道Android试题及答案

    本文为开发者奉献了70道经典Android面试题加答案--重要知识点几乎都涉及到了,你还等啥,赶紧收藏吧!! 1. 下列哪些语句关于内存回收的说明是正确的? (b) A. 程序员必须创建一个线程来释放 ...

  10. (转) C#多线程赛跑实例

    专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...