我想在全局范围内在我的应用程序中定义日期模式。因此我想使用属性文件。因为我已经使用了一个,例如为重复控件设置默认行数我添加了一个新的wkey-value对:
date_format_date_only=yyyy-MM-dd
在我的应用程序中,我通过转换器设置日期格式,例如:
<xp:this.converter>
<xp:convertDateTime pattern="yyyy-MM-dd" type="date" />
</xp:this.converter>
但是当我把它设置为
<xp:this.converter>
<xp:convertDateTime pattern="${application.date_format_date_only}" />
</xp:this.converter>
它不起作用。日期显示为2018年2月26日。应用程序是我通过主题设计元素设置的变量:
<resources>
<bundle src="/application.properties" var="application" />
</resources>
我忽略了什么吗?
我注意到,当我将包直接添加到XPage时,模式可以工作但是主题设计元素的用途是什么呢?
我通过主题定义做某些事情,但不是全部。有一些限制适用 - 读取主题属性评估的时间。
我认为您需要避免在您使用的每个页面中声明资源包。我对吗?
在那种情况下,我的建议是更多地利用JSF技术。我个人设置了一个请求范围的bean,我称之为MessageBean
:
public class MessageBean implements Serializable {
private static final long serialVersionUID = 1L;
private ApplicationEx application;
private Locale locale;
private ResourceBundle app;
private ResourceBundle error;
private ResourceBundle log;
public void setApplication(Application application) {
this.application = (ApplicationEx) application;
}
public void setLanguage(String language) {
locale = new Locale(language);
}
public ResourceBundle getApp() {
if (app == null) {
app = getResourceBundle("app");
}
return app;
}
public ResourceBundle getError() {
if (error == null) {
error = getResourceBundle("error");
}
return error;
}
public ResourceBundle getLog() {
if (log == null) {
log = getResourceBundle("log");
}
return log;
}
private ResourceBundle getResourceBundle(String name) {
try {
return application.getResourceBundle("/WEB-INF/i18n/" + name + ".properties", locale);
} catch (IOException e) {
throw new FacesException(e);
}
}
}
在faces-config.xml
:
<managed-bean>
<managed-bean-name>msg</managed-bean-name>
<managed-bean-class>mypackage.MessageBean
</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>application</property-name>
<value>#{facesContext.application}</value>
</managed-property>
<managed-property>
<property-name>language</property-name>
<value>#{facesContext.viewRoot.locale.language}</value>
</managed-property>
</managed-bean>
这个bean为我做的是连接不同的属性文件 - 这些文件位于/ WEB-INF / i18n / - (根据他们的权限域'app'=一般app消息,'error'=错误消息分开等),并在一个单根下很好地安排它们:msg
。
换句话说,我可以在页面${msg.app.hello}
中为app资源包或${msg.error.sorry}
声明错误资源包。
我不必在页面上声明任何资源,这是bean的神奇之处。您不使用它们,它们不会被创建。您想要使用它们,框架会创建它们并自动将它们提供给您。
我注意到,当我将包直接添加到XPage时,模式可以工作但是主题设计元素的用途是什么呢?
我认为主题背后的意图是“定义应用程序的外观和感觉”(source),我认为这反映在主题文件上定义的资源包仅在beforeRenderResponse阶段可用于XPage的事实中。因此,正如您所发现的那样,您想要使用在主题上声明的包访问的任何属性只能通过运行时绑定访问而不能在页面加载上访问 - 并且转换器不能使用运行时绑定...
一些快速简单的SSJS解决方法可以避免将捆绑包直接添加到您构建的每个XPage中:
xsp.properties
中并使用context.getProperty('foo')
访问它,或者,如果你站在辩论的一边,不喜欢不将自己的键值对添加到xsp.propertiescontext.bundle("application.properties").getString("foo")
。@shillem关于用Java编写它并使用bean的答案可能更优雅和更好的实践 - 特别是如果你在你的应用程序中使用控制器框架 - 但上述方法将起作用。