Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使资源包与现有Freemarker模板一起工作?_Java_Templates_Freemarker - Fatal编程技术网

Java 如何使资源包与现有Freemarker模板一起工作?

Java 如何使资源包与现有Freemarker模板一起工作?,java,templates,freemarker,Java,Templates,Freemarker,我正在为IBM Connections开发一个Java应用程序,我的应用程序需要生成和发送基于模板的电子邮件。 连接包括几个使用资源包的Freemarker模板。我希望我的代码使用这些代码的副本,但我以前从未使用过Freemarker 在我的Java代码中,如何将资源包与Freemarker模板相关联,从而使现有模板正常工作 模板和资源束位于以下目录结构中: notifications (directory) -> activities (directory) -> resources (d

我正在为IBM Connections开发一个Java应用程序,我的应用程序需要生成和发送基于模板的电子邮件。
连接包括几个使用资源包的Freemarker模板。我希望我的代码使用这些代码的副本,但我以前从未使用过Freemarker

在我的Java代码中,如何将资源包与Freemarker模板相关联,从而使现有模板正常工作

模板和资源束位于以下目录结构中: notifications (directory) -> activities (directory) -> resources (directory) -> nls (directory) -> properties files -> Template FTL files -> resources (directory) -> nls (directory) -> properties files -> Imported FTL files 通知(目录) ->活动(目录) ->资源(目录) ->nls(目录) ->属性文件 ->模板FTL文件 ->资源(目录) ->nls(目录) ->属性文件 ->导入的FTL文件

其中一个主要模板文件是“notifyMail.ftl”。该文件中特别感兴趣的行包括:
<#import "*/resources/commonStructure.ftl" as s>
<#import "*/resources/commonUtil.ftl" as u>
<#import "*/resources/commonUrlUtil.ftl" as urlUtil>
<#lt><@s.header>${u.resource("email.notify.body."+"${key}","${activity.event.sender.display.name}",urlUtil.linkifyItem("${activity.node.permalink}", "${activity.node.name}"))}</@s.header>

${u.resource(“email.notify.body.+“${key}”,“${activity.event.sender.display.name}”,urlUtil.linkifyItem(${activity.node.permalink}”,“${activity.node.name}”))

“commonUtil.ftl”文件声明了两个使用资源包的函数,如下所示。
第一个函数使用名为“\u参数”的成员。
我假设这需要在Java代码中传递给Freemarker,因为我在模板的任何地方都没有看到它的定义

<#function resource messageKey params...>
    <#if __parameters.__resourceBundle?keys?seq_contains(messageKey)>
        <#local bundleString = bundleResource(__parameters.__resourceBundle,messageKey,params) />
    <#elseif __parameters.__sharedBundle?keys?seq_contains(messageKey)>
        <#local bundleString = bundleResource(__parameters.__sharedBundle,messageKey,params) />
    <#else>
        <#return messageKey /> <#-- message key not found, return the key back -->
    </#if>

    <#if bundleString??>
        <#return bundleString />
    <#else>
        <#return messageKey />
    </#if>
</#function>

<#function bundleResource bundle messageKey params>
<#if bundle??>
<#switch params?size>
<#case 0>
    <#return bundle(messageKey)>
    <#break>
<#case 1>
    <#return bundle(messageKey, params[0])>
    <#break>
<#case 2>
    <#return bundle(messageKey, params[0], params[1])>
    <#break>
<#case 3>
    <#return bundle(messageKey, params[0], params[1], params[2])>
    <#break>
<#case 4>
    <#return bundle(messageKey, params[0], params[1], params[2], params[3])>
    <#break>
<#case 5>
    <#return bundle(messageKey, params[0], params[1], params[2], params[3], params[4])>
    <#break>
<#default>
    <#stop "resource function doesn't support more than 5 parameters for a message due to language reason. And it's seldom to have more than 5 parameters in a message. However, you can extend the limit by changing the function if you really want to."/>
</#switch>
</#if>
</#function>

解决方案很简单,但由于属性文件的问题,我在正确设置消息格式方面遇到了很多困难

我发送到
freemarker.template.template.process()
Map
只需要FTL文件使用的相同层次结构中的
ResourceBundle
实例

例如,如果FTL文件具有以下内容:

__parameters.__resourceBundle
我有一个带有Java源代码的
notification.properties
文件,并将其添加到发送到Freemarker的映射中,如下所示:

HashMap tmplParams=new HashMap();

tmplParams.put("__resourceBundle",ResourceBundle.getBundle(
    "<parent directory path>.activities.resources.nls.notification"));

root.put("__parameters",tmplParams);
HashMap tmplParams=newhashmap();
tmplParams.put(“\uuuResourceBundle”,resourceBundle.getBundle(
“.activities.resources.nls.notification”);

root.put(“_参数”,tmplParams)
\u参数
无疑来自FreeMarker数据模型(模板.process(…)的一个参数)。因此,它也在FreeMarker之外填充。尝试
${uuuu参数}
-可能它会打印该变量的实际类(可能是错误消息的一部分,使用FreeMarker 2.3.20)。顺便说一句,不要写
…+“${key}”+…
等等,它只是
…+key+…
。关于
${key}
,我没有创建这些模板,也不想更改任何我不需要更改的内容。另外,
key
实际上是在模板中的
#assign
语句中定义的-我在问题中没有显示一些行。