Moqui学习之数据与资源

资源位置:

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

  1. classpath://  java类路径的资源
  2. content://内容仓库的资源(JCR 经由Jackrabbit客户端):路径中协议前缀后的第一个元素是内容仓库的名称,其在Moqui的XML配置文件中被repository.name属性指定。
  3. component://相对于组件所在位置的路径。无论组件位于何处(文件系统,,内容仓库等)
  4. dbresource://由于一个虚拟的文件系统,通过moqui.resource.DbResource和DbResourceFile实体在数据库中持久化实体门面。

其他的协议可以通过实现org.moqui.context.ResourceReference接口,并添加一个resource-facade.resource-reference元素到Moqui XML配置文件来完成。

已经支持的协议配置在MoquiDefaultConf.xml文件中。

使用资源

按照已支持的协议使用一个资源,就是直接去读取文本或者二进制内容。从一个资源位置获得文本使用ec.resource.getLocationText(String location,boolean cache)方法。获取二进制输入流或者大文本资源使用ec.resource.getLocationStream(String location).

除了直接读取资源,还有相当多的操作可以使用ec.resource.getLocationReference(String location)方法获得org.moqui.context.ResourceReference接口的一个实例,这个接口类似于资源门面方法一样,有从资源中获取文本和二进制流数据的一些方法。接口还有一些方法用于目录资源获得下级资源,按照名称递归查找所有下级文件或目录,写文本或者二进制流数据以及移动资源到其他的位置。

模板渲染和运行脚本

单独的方法去渲染某个资源路径下的模板:

ec.resource.renderTemplateInCurrentContext(String location,Writer writer).这个方法不返回任何东西,只是简单的输出模板到writer,。默认支持FTL(Freemaker  Template Language)和Gstring(Grovvy String)模板。

其他的模板可通过实现org.moqui.context.TemplateReader接口,并在Moqui  XML配置文件中添加resource-facade.template-renderer元素来完成。

通过资源门面运行脚本使用Object ec.resource.runScriptCurrentContext(String location,String method)方法。脚本的位置以及脚本中要运行的方法作为指定的入参,将会返回脚本对应的方法返回值或者计算结果的Object对象。在资源门面中这个方法还有变异的用法,它可以方便的接受一个Map类型的additionalContext参数。通过javax.script.ScriptEngineManager.Moqui框架默认支持Grovvy XML动作,javascript以及任意脚本引擎支持的脚本。

添加脚本执行器的方法:

1.javax.script的方式为任何脚本语言去实现javax.script.ScripeEngine接口,并可以通过javax.script.ScriptEngineManager去发现脚本。Moaui框架就是使用这种扩展方式,基于脚本的文件名去发现将会编译脚本,并为了在一个给定的位置更快速的反复执行一个脚本,以编译的形式缓存脚本。

2.实现org.moqui.context.ScriptRunner接口,并在MoquiXML配置文件中添加一个resource-facade.script-runner元素节点,Moqui框架通过这个接口使用Grovvy的XML操作是因为他提供了额外的便利性,但通过javax.script接口无法使用。

由于Grovvy是Moaui框架中默认的表达式语言,这里有一些资源门面的方法可用于简单的不同目的的表达式计算:

  • boolean evaluateCondition(String expression ,String debugLocation)用于计算一个Grovvy条件表达式并返回bolean结果。
  • Object evaluateCondition(String expression ,String debugLocation)用于计算表达式返回上下文中的一个字段,通常更多的用于计算人额好Grovvy表达式并返回结果。
  • String evaluateCondition(String expression ,String debugLocation)用于扩展输入的字符串,将其当成一个GString(Grovvy String)并返回扩展后的字符串

都接受了一个debugLocation参数用于处理错误信息。为了计算速度,这些都被缓存起来了。

数据模型定义:

<entity entity-name="DataSource" package-name="moqui.basic" cache="true">

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

    <field name="dataSourceTypeEnumId" type="id" />

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

    <relationship type="one" title="DataSourceType" related-entity-name="Enumeration">

        <key-map field-name="dataSourceTypeEnumId"/>

    </relationship>

    <seed-data>

        <moqui.basic.EnumerationType description="Purchased Data " enumTypeId="DataSourceType" enumId="DST_PURCHASED_DATA"/>

        <moqui.basic.EnumerationType description="Data Source Type" enumTypeId="DataSourceType"/>

    </seed-data>

</entity>

  

就像一个java类,实体有一个包名,实体的全名就是包名加上实体名,${package-name}.${entity-name}

基于这种模式,实体的全名就是:moqui.basic.DataSource

这个例子中有个entity.cache属性设置为true,这意味着实体将会被缓存,除非代码另外指定去查找。

第一个字段(dataSourceId)的is-pk属性设置为true,意味着这个字段是实体的其中一个主键字段。

第三个字段(description)是一个用于保存数据的简单字段,它不是主键的一部分,并且也不是起亚实体的外键。

field.tyoe用于指定字段的数据类型,MoquiDefaultConf.xml文件中通过database-list-dictionary-type元素定义了默认的选项。这些元素为每个字典类型都指定了默认的类型设置,并且可以使用database.database-type元素为每种数据库去重新定义覆盖类型的设置。

第二个字段(dataSourceTypeEnumId)是枚举实体的外键,通过实体定义中的relationship元素来表示。seed-data元素下的两条记录里定义了枚举类型(EnumerationType)去组成枚举(Enumeration)选项,并且其中一个枚举选项是为dataSourceTypeEnumId字段设置的。seed-data元素下的记录通过seed类型使用命令行的load操作进行加载。

这里有个很重要的模式,允许框架知道使用哪个枚举类型enumTypeId来自动生成的表单中过滤一个字段的枚举Enumeration选项,注意relationship.title属性的值匹配enumTypeId.换句话说,无论如何对于枚举来说这里有这个约定:relationship.title的值就是类型的ID用来过滤下拉列表。

本例中有一个key-map元素位于relationship元素下面,这仅对于这个实体的字段名称和相应的关联实体的字段名称不匹配才需要。由于外键字段名字是dataSourceTypeEnumId而不是简单的enumId,所以我们需要告诉框架使用哪个字段去关联。框架知道关联实体的主键字段,但除非字段的名称匹配主键字段的名称,否则框架不知道实体的哪些西段对应哪些字段。

可以不适用key-map元素。简单的如下使用

<relationship type="one" related-entity-name="Enumeration"/>

seed-data元素允许你定义使用实体式必要的一些基本数据,并且也可以定义数据模型的一个方面,这些记录通过在entity-facade-xml文件中将type属性设置为seed,来呗加载到数据库中。

<entity-facade-xml type="seed">

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

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

</entity-facade-xml>

  

其他实体属性:

group-name:实体门面(entity-facade)用来将一个实体为某个数据库放入分组中,所有数据库都可用。这个值应当匹配Moqio xml配置文件 中的moqui-conf.entoty-facade.datasource.group-name元素。如果没有值被指定,那么将使用默认的moqui-conf.entity-facade.default-group-name元素的值。配置默认可用的值包括:transaction(默认的),analytical,tenantcommon以及nosql.

sequence-bank-size:保存在内训中的序列储库的大小。每当在SequenceValueItem记录中的序列号seqNum被序列中的储库消耗完了,将按照这个数量进行增加。

sequence-primary-stagger:最大数量的交错就是序列ID。入伙增长序列为1则会增加1,此外,当前的序列号ID还可以按照一个1和最大间隔之间的随机数来进行增长

sequence-secondeondary-padded-length:如果能指定了前垫部分,后面都以零进行填充到本属性指定的长度默认的长度为2.

optimistic-lock:当设置为true,实体门面在更新记录时,会比较在内存中的lastUpdateStamp字段和数据库中相同的字段,如果时间戳不匹配那么就会产生一个错误,默认为false。

no-update-stamp:实体门面默认为每个实体添加一个字段用于乐观锁机制以及数据同步。如果不想创建可设置为false

cache:可以设置以下值,默认为false

true:使用缓存查找-代码可覆盖

false:不要缓存查找-代码可覆盖

never:不要缓存查找-代码不可覆盖

authorize-skip:能设置以下值:默认为false

true:掠过这个实体所有的权限校验

false:不掠过权限校验

create:为新建操作掠过权限校验

view: 为查询和只读操作掠过权限校验

view-create:为查询和新建操作略过权限校验

其他字段属性:

encrypt:当设置为true时,在数据库加密该字段。默认为false

enable-audit-log:设置为true时,将日志记录本字段的所有变化及变化时间和修改人。日志数据记录在EntityAuditLog实体中。默认为false。

enable-localization:当实体属性被设置为itrue,获取本字段值时将会同时查看LocalizsdEntityField实体。如果其中有匹配的记录,那么将返回本地化的记录而不是原始记录。由于展现的原因默认为false,只有当字段属性设置为true时才会进行翻译。

实体扩展-XML

实体可以无需修改原来额实体定义XML文件来进行扩展。尤其当你想在不同的组件中扩展例如地幔通用数据模型或甚至Moqui框架中的实体的一部分,并且保持你的扩展部分相对独立,这种方式就特别的有用。

可以在实体定义XML文件中使用extend-entity元素并可以混合使用entity元素去达到效果。这个元素拥有和entity元素很多的相同的属性去定义扩展原来的实体,简单的保证entity-name以及package-name属性和原来的entity实体元素的属性一致,

实体扩展-DB

可以使用UserField实体通过数据库记录来扩展实体,这种方式和通过extend-entity XML元素扩展实体有些不同,因为这种方式是一种虚拟的扩展,并且数据存入了独立的UserFieldValue实体数据结构中。

这种差异的主要原因就是通常添加的用户字段是为了一组用户还是单个用户,以及除了本组用户,关联的外部用户无法访问。你可以使用ALL-USERS用户组来使一个用户字段作用于所有的用户。

尽管在后台运行,但是EntityValue对象用实体对待其他任何字段一样的方式去处理这些字段,

Eample中的例子:

<moqui.entity.UserField entityName="moqui.example.Example" fieldName="testUserField" userGroupId="ALL_USERS"

                            fieldType="text-long" enableAuditLog="Y" enableLocalization="N" encrypt="N"/>

  

时间: 2024-10-14 02:16:28

Moqui学习之数据与资源的相关文章

0基础学习大数据你需要了解的学习路线和方向

现在大数据这么火,各行各业想转行大数据,那么问题来了,该往哪方面发展,哪方面最适合自己? 首先从字面来了解一下大数据 大数据 (巨量数据集合(IT行业术语)) 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产. 大数据的5V特点(IBM提出):Volume(大量).Velocity(高速).Variety(多样).Value(低价值密度).Veracit

学习大数据要什么基础?0基础的学习路线和方向

现在大数据这么火,各行各业想转行大数据,那么问题来了,该往哪方面发展,哪方面最适合自己?首先从字面来了解一下大数据 大数据 (巨量数据集合(IT行业术语)) 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信息资产.数据的5V特点(IBM提出):Volume(大量).Velocity(高速).Variety(多样).Value(低价值密度).Veracity(真

一起来学大数据——走进Linux之门,学习大数据的重中之重

昨天我们看了有关大数据Hadoop的一些知识点,但是要在学习大数据之前,我们还是要为大数据的环境做一些的部署. 那么,今天我们就来讲讲开启我们大数据之路的Linux,跟上我们的脚步yo~ Linux介绍 Linux是我们当前各大系统中一种自由和开源的OS,虽然市面上有各种各样的版本,但是他们拥有同一个内核.我们在这个内核上面,自己添加一些程序后,就是我们之后称之的开发版本. 其中包括了两大阵营,它们分别是:Redhat系列和Debian系列.我们看到的红帽,centos就是第一个阵营的,而ubu

大数据为什么这么火?小白该如何去学习大数据

学习大数据之前,我们首先要知道的就是: 1.什么是大数据? 2.大数据是做什么的? 3.大数据就业领域,就业形势是怎么样的? 4.等明确以上三点之后,就可以开始着手学习大数据 要确定学习线路,零基础编程基础的小白怎么去学习? 仔细阅读完本文,你需要花大概20分钟 很多初学者,对大数据的概念都是模糊不清的,大数据是什么,能做什么,学的时候,该按照什么线路去学习,学完往哪方面发展,想深入了解. 第一:什么是大数据,大数据的作用 现代科技高速发展,一方面给人们生活带来了便利:另一方面也给人们工作.生活

学习大数据技术,从优秀的书籍开始

AI时代全面来临,大数据.人工智能引领科技创新潮流,获得国家政策大力支持,前景广阔.乘风破浪.逐梦前行,成功就在脚下.学习大数据技术,除了必要的大数据学习路线图的指引之外,想要进一步提升至自己的技术,就要从优秀的书籍开始读起,书读百遍其义自见! 对于大数据技术的学习,小编为你甄选了以下学习大数据的优秀书籍,为了自己的高薪未来,收起游戏,开始阅读吧! 互联网科技发展蓬勃兴起,人工智能时代来临,抓住下一个风口.为帮助那些往想互联网方向转行想学习,却因为时间不够,资源不足而放弃的人.我自己整理的一份最

学习大数据,你的职业是如何规划的?

作为IT类职业中的"大熊猫",大数据人才(数据工程师,数据分析师,数据挖掘师,算法工程师等).在国内人才市场可谓是一颗闪耀的新星.由于刚刚出于萌芽阶段,这个领域出现很大的人才缺口. 1 大数据人才做什么? 2 需要具备的能力 2.1 精通SQL 2.2 数据模型技能 2.3 ETL设计 2.4 架构项目 3 知识体系 机器学习基础 机器学习工具 3.1 大数据通用处理平台 3.2 分布式存储 3.3 资源调度 3.4 机器学习工具 3.5 数据分析/数据仓库(SQL类) 3.6 消息队

学习大数据需要掌握的知识,需要学习的数据技术

大数据的发展历程总体上可以划分为三个重要阶段,萌芽期.成熟期和大规模应用期,20世纪90年至21世纪初,为萌芽期,随着,一批商业智能工具和知识管理技术的开始和应用,度过了数据萌芽,21世纪前十年则为成熟期,主要标志为,大数据解决方案逐渐走向成熟,形成了并行计算与分布式系统两大核心技,谷歌的GFS和MapReduce等大数据技术受到追捧,Hadoop平台开始大行期道,2010年以后,为大规模应用期,标志为,数据应用***各行各业,数据驱动决策,信息社会智能化程度快速提高. 数据时代的到来,也推动了

重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库与分表等.这篇文章主要讲述数据库分库与分表 (1)业务拆分 在?大型网站应用之海量数据和高并发解决方案总结一二?一篇文章中也具体讲述了为什么要对业务进行拆分. 业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构.随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越

自学成才的数据科学家告诉你5个学习大数据的正确姿势!

对于数据科学来说,现在是发展的黄金时期.这是个新领域,但增长迅速,同时数据科学家的缺口也很大,据说他们的平均年薪可以达到10万美元.哪里有高薪,哪里就吸引人们,但是数据科学技能的差距意味着许多人需要努力学习.      第一步当然是询问“我怎么学习数据科学”,这个问题的答案往往是一长串的课程和书籍阅读,从线性代数到统计数据,这几年我也是这样学习过来的.我没有编程背景,但我知道我喜欢处理数据. 我比较不能理解在完全没有理解别人的背景时就给他一份长长的书单或者技能表.这就类似于一个老师给你一堆教科书