**可能重复:在这种情况下,此帖子的解决方案不可行,请重新打开此帖子! **
JSF bean property not evaluated in external JavaScript file
EL解析器不会翻译包含<outputScript>
标记(JavaScript文件)的文件。尝试访问资源包时。
<h:outputScript library="js" name="myScripts.js" target="head"/>
;
myScripts.js文件:
警报( “#{msg.browser_not_html5_compatible}”);
结果是,当警报窗口呈现时,我得到相同的字符串。
如果我在我的XHTML文件中的<script>
标记中有这一行JavaScript,那么EL解析器将使用该包中的正确资源字符串替换它;
<script>
alert("#{msg.browser_not_html5_compatible}");
</script>
我可以让EL解析器翻译我的包含的(<h:outputScript>
)JavaScript文件来访问资源包吗?
答案 0 :(得分:1)
一个选项可能是创建一个servlet来加载您的消息包并创建一个Javascript文件,其中包含一个包含消息键和值的JSON对象。它可能看起来像:
var messages = {
"browser_not_html5_compatible": "You browser..."
, "other_key": "Other value"
};
如果您有一个大型资源包而且您不想将所有消息公开给Javascript,则可以使用js_
之类的内容为特定的Javascript消息添加前缀。这样您就可以轻松地遍历资源包的keySet
并仅使用Javascript密钥:
for (String key : resourceBundle.keySet()){
if (key.startsWith("js_")){
// Do something with resourceBundle.getString(key);
}
}
在您的JSF页面上,您必须添加生成的Javascript。如果需要,可以使用#{view.locale}
:
<h:outputScript library="js" name="/path-to-servlet/#{view.locale}" target="head"/>
<h:outputScript library="js" name="myScripts.js" target="head"/>
在myScripts.js
中你可以使用:
alert(messages.browser_not_html5_compatible);
servlet选项的一个变体是使用JSP创建包含JSON的Javascript。您可以将内容类型设置为application/javascript
:
<%@ page contentType="application/javascript; charset=UTF-8" %>
你需要EL 2.2来迭代资源包的keySet
(因为没有getter来访问它)。