我的目标是将带有参数(Hello {0}
)的字符串从支持bean传递给JavaScript。我目前的方法是将字符串放在h:inputHidden
中,让JS读取值onLoad。
遗憾的是,f:param
内h:inputHidden
h:outputFormat
无法像replace
那样工作。
通常建议采用哪种方法?
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}}内。
答案 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;
}
参考