隐藏字段中的JSF 1.1参数

时间:2014-02-10 10:15:54

标签: jsf jsf-1.2 jsf-1.1

我的目标是将带有参数(Hello {0})的字符串从支持bean传递给JavaScript。我目前的方法是将字符串放在h:inputHidden中,让JS读取值onLoad。 遗憾的是,f:paramh:inputHidden h:outputFormat无法像replace那样工作。

通常建议采用哪种方法?

  • 我可以将字符串与辅助bean中的参数组合在一起,但imo不应该是那个bean关注的问题。
  • 我可以将它们组合在JS中,但这又似乎重新发明了轮子(使用h:outputFormat函数......)
  • 我没有看到使用h:inputHidden的好方法,但却让用户看不到它。
  • 我认为无法让f:param接受<script> var text = '<h:outputFormat value="Hello {0}"><f:param value="World" /></h:outputFormat>'; </script> s。

编辑:使用的实际实现是Apache MyFaces 1.1.4,因此我将标题更新为JSF 1.1。

由于BalusCs的回答,我记得我的第一个(并且被抛弃)的方法:

  • 直接包含在JS源代码中。

    <f:verbatim>

可悲的是,在JSF 1.1中,我必须使用<f:verbatim> <script> var text = '</f:verbatim> <h:outputFormat value="Hello {0}"><f:param value="World" /></h:outputFormat> <f:verbatim>'; </script> </f:verbatim> ,这使得代码非常难看(即使是日食语法检查程序也不理解它 - 尽管它的工作原理):

<head>

另一个缺点是我无法将其放在<f:view>中,因为它必须位于{{1}}内。

2 个答案:

答案 0 :(得分:3)

JSF在这个问题的上下文中只是一个HTML / JS代码生成器。实际上你并没有传递从JSF到HTML / JS的任何东西。实际上,您只需让Web服务器中的JSF 打印所需的HTML / JS代码,以便webbrowser可以依次正确执行它。

所以,你需要做的只是编写JSF代码,以便打印出所需的JS代码。

<script>
    var text = '<h:outputFormat value="Hello {0}"><f:param value="World" /></h:outputFormat>';
</script>

在浏览器中打开JSF页面时(换句话说,当向调用FacesServlet的服务器发送HTTP请求时,它反过来执行生成HTML / JS的所有JSF工作),并执行右键单击查看源,您应该看到如下内容:

<script>
    var text = 'Hello World';
</script>

以后执行的JS代码应该能够通过变量名text获取此值。

请注意特殊字符,例如换行符。您可能需要创建一个自定义EL函数,该函数委托给Apache Commons Lang StringEscapeUtils#escapeJavaScript(),另请参阅How to escape JavaScript in JSP?


更新:根据你似乎使用JSF 1.1的评论。如果升级不是一个选项(但是强烈建议这样做;实际上任何JSF 1.1项目都没有与JSF 1.2兼容的代码更改),那么你需要将非JSF标记放在{ {1}}“通常的方式”。

<f:verbatim>

另请参阅Why Facelets is preferred over JSP as the view definition language from JSF2.0 onwards?JSF/Facelets: why is it not a good idea to mix JSF/Facelets with HTML tags?以获取一些背景信息。

根据您的投诉,

  

另一个缺点是我无法将其放在<f:verbatim><script> var text = '</f:verbatim><h:outputFormat value="Hello {0}"><f:param value="World" /></h:outputFormat><f:verbatim>'; </script></f:verbatim> 中,因为它必须位于<head>内。

这绝对不是真的。你肯定可以把它放在<f:view>中。只需将<head><f:view>内移到<body>之外,包括<body><head>,甚至<body>

<html>

答案 1 :(得分:1)

由于您使用的是JSF 1.2,我将使用您的第三个解决方案:

XHTML:

<body onLoad="doOnLoad();">
    <h:outputFormat id="myString" value="Hello {0}" styleClass="hidden">
        <f:param value="World" />
    </h:outputFormat>

JavaScript的:

function doOnLoad() {
    // do something with the String
    alert(document.getElementById('myString').innerHTML);
}

CSS:

.hidden {
    display:none;
}

参考