JSF outputScript和JavaScripts没有被EL解析?

时间:2012-10-03 09:10:40

标签: java jsf-2 java-ee-6 el

  

**可能重复:在这种情况下,此帖子的解决方案不可行,请重新打开此帖子! **
  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文件来访问资源包吗?

1 个答案:

答案 0 :(得分:1)

的Servlet

一个选项可能是创建一个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}

将视图的语言环境传递给servlet
<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);

JSP

servlet选项的一个变体是使用JSP创建包含JSON的Javascript。您可以将内容类型设置为application/javascript

<%@ page contentType="application/javascript; charset=UTF-8" %>

你需要EL 2.2来迭代资源包的keySet(因为没有getter来访问它)。