我想在全局级别的应用程序中定义日期模式。因此我想使用属性文件。因为我已经使用了一个,例如要设置重复控件的默认行数,我添加了一个新的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时,模式可以工作但是主题设计元素的用途是什么呢?
答案 0 :(得分:2)
我通过主题定义做某些事情,但不是全部。有一些限制适用 - 读取主题属性评估的时间。
我认为您的需求是避免在您使用的每个页面中声明资源包。我是对的吗?
在这种情况下,我的建议是更多地利用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'=一般应用消息,'错误'进行分割=错误消息等),并在一个单根下安排好:msg
。
换句话说,我可以在页面${msg.app.hello}
中为app资源包声明任何位置,或者为错误资源包声明${msg.error.sorry}
。
我不必在页面上声明任何资源,这是bean的神奇之处。您不使用它们,它们不会被创建。您想要使用它们,框架会创建它们并自动将它们提供给您。
答案 1 :(得分:0)
我注意到当我将软件包直接添加到XPage时,模式可以工作但是主题设计元素的用途是什么呢?
我认为主题背后的意图是定义应用程序的外观和感觉。 (source)我认为这反映在以下事实中:主题文件上定义的资源包仅在beforeRenderResponse阶段可用于XPage。因此,正如您所发现的那样,您想要使用在主题上声明的包访问的任何属性只能通过运行时绑定访问,而不能通过页面加载访问 - 并且转换器不能使用运行时绑定......
一些快速简单的SSJS解决方法可以避免将捆绑包直接添加到您构建的每个XPage中:
xsp.properties
中,然后使用context.getProperty('foo')
访问该属性,或者,如果您不愿意将自己的键值对添加到xsp.properties context.bundle("application.properties").getString("foo")
代替。