我对JSF和多种语言有问题。因此,我的字符串在WEB_INF/classes/texte_<lang>.properties
文件中。例如访问这样的 <h:outputLabel value="#{messages.err_text}"/>
效果很好。
问题是,我有<h:outputLabel...
元素,在其中我想根据错误显示错误消息。我想要这样有效的东西:
<h:outputLabel value="#{someBean.errMsg}/>
用这样的豆子
@ManagedBean()
@SessionScoped
public class SomeBean{
public String getErrMsg(){
if(something){
return "#{messages.err_text}"
}else if(somethingElse){
return "#{messages.err_text2}"
}else{
return "#{messages.err_text3}"
}
}
}
只是为了明确说明它不起作用。我正在寻找有效的类似解决方案(或任何解决方案)。
感谢您的阅读。
不要那样做。该模型不应该意识到视图。本地化也不严格属于模型。该模型应该准备一些视图必须注意的状态。
一种方法是:
public String getErrMsg(){
if (something) {
return "err_text";
} else if (somethingElse) {
return "err_text2";
} else {
return "err_text3";
}
}
<h:outputLabel value="#{messages[someBean.errMsg]}" />
其他方式将返回enum
,如以下相关问题所示:资源捆绑中的枚举值以及如何在f:selectItem(s)中使用枚举值。
您现在不起作用的原因,是因为outputText
的 value
属性被评估为普通字符串,而不是EL表达式。
通过您现在正在使用的工作,最好的方法是将资源捆绑直接注入您的bean:
@ManagedProperty("#{messages}")
ResourceBundle messages;
然后,
public String getErrMsg(){
if(something){
messages.getString("err_text");
}
}
,如果您不知道传统上,使用h:message
组件会呈现错误消息。
在您最初的问题的无关注释上,您还应该知道,通常不建议将处理逻辑埋在您的Getter中。一方面,在您的页面渲染过程中,getter被多次称为。同样为此,您应该能够确保值something
在单个JSF请求的整个生命周期中保持一致