资源:内容、模板和脚本
- 资源位置协议
- 获取资源的文本、二进制内容与引用(getLocationText, getLocationStream, getLocationReference)
- 用模板渲染内容(renderTemplateInCurrentContext)
- 定制渲染器的方法(TemplateRenderer接口, resource-facade.template-renderer)
- ResourceFacade运行脚本(runScriptInCurrentContext)
- 添加脚本运行器
- ScriptEngine, ScriptEngineManager
- ScriptRunner, resource-facade.script-runner
- 添加脚本运行器
- 表达式求值(evaluateCondition, evaluateContextField, evaluateStringExpand)
资源位置(Location)
Resouce Facade location字符串的结构像URL,有协议、主机、可选的端口和文件名。支持标准Java URL 协议(http、https、ftp、jar和file)。也额外支持一些有用的协议:
- classpath:// : Java类路径上的资源
- content:// : 内容仓库(JCR,通过Jackrabbit客户端)中的资源;协议前缀后的第一个路径元素是内容仓库的名字,在Moqui配置XML文件中用repository.name属性来指定。
- component:// : 相对于组件基础位置的路径,不管组件位置在哪(文件系统、内容仓库等等)
- dbresource:// : Entity Facade用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)方法来为二进制或大文本资源获取一个InputStream。
为了在读取资源数据外的更广、更灵活的操作,使用 ec.resource.getLocationReference(String location)方法来获取一个 org.moqui.context.ResourceReference接口的实例。此接口有像ResourceFacade方法一样的从资源获取文本或二进制流数据的方法。对于目录资源,还有方法获取子目录的资源,按名称递归查找文件或目录,写文本或二进制流数据,和移动资源到另一个位置。
渲染模板与运行脚本
有一个方法是用模板渲染某个位置的资源:ec.resourc.renderTemplateInCurrentContext(String location, Writer writer)。此方法没有返回,并且简单地把模板输出到writer。默认支持FTL(Freemarker模板语言)和GString(Groovy字符串)。
额外的模板渲染器可通过实现 org.moqui.context.TemplateRenderer 接口并添加一个 resource-facade.template-renderer 元素到Moqui配置XML文件来实现。
要通过ResourceFacade运行一个脚本,使用 Object ec.resource.runScriptInCurrentContext(String location, String method)方法。指定位置和(有需要时)位于该位置的脚本内的方法,此方法将运行脚本并返回脚本返回或得到的对象。为了方便,此方法在Resource Facade中还有一个变种,接受一个Map additionalContext 参数(它只是将Map推入到上下文栈,运行脚本,然后从上下文栈中出栈)。Moqui默认支持Groovy、XML Actions、JavaScript和通过javax.script.ScriptEngineManager能获取的的任意脚本引擎。
要添加脚本运行器有两个办法:
- javax.script 方法: 可以使用实现了 javax.script.ScriptEngine 接口并能通过 javax.script.ScriptEngineManager 发现的任意脚本语言。Moqui使用脚本文件名后缀来发现脚本并执行它。如果脚本引擎实现了 javax.scriptCompilable 接口,那么Moqui将编译此脚本并以编译后的形式缓存,这样重复执行给定位置的脚本时可以更快。
- 实现 org.moqui.context.ScriptRunner 接口并添加一个 resource-facade.script-runner 元素到Moqui配置XML文件。Moqui在此接口使用Groovy和XML Actions,因为它相对javax.script接口有更多的灵活性。
因为Groovy是Moqui中的默认的表达式语言,有一些ResourceFacade方法来为不同目的简化对表达式的求值:
- boolean evaluateConditions(String expression, String debugLocation) 被用来对Groovy条件表达式求值并返回boolean结果
- Object evaluateContextField(String expression, String debugLocation) 被用来对表达式求值,返回context内的一个字段,并更多用来对任意Groovy表达式求值并返回结果。
- String evaluateStringExpand(String inputString, String debugLocation) 被用来展开inputString,将其当作GString(Groovy字符串)并返回展开的值。
这些方法接受一个被用于错误信息的debugLocation参数。为了更快地求值,这些表达式都会被缓存,表达式本身作为key以最好地重用。