1

我的目标是将带有参数 ( Hello {0}) 的字符串从支持 bean 传递给 JavaScript。我目前的做法是将字符串放入a中h:inputHidden,让JS读取onLoad的值。可悲f:param的是,里面h:inputHidden没有像在h:outputFormat.

什么方法通常是可取的?

  • 我可以将字符串与支持 bean 中的参数结合起来,但 imo 这不应该是 bean 关心的问题。
  • 我可以将它们组合在 JS 中,但这似乎又像是在重新发明轮子(使用replace函数......)
  • 我没有看到使用 a 的(好)方法,h:outputFormat但使其对用户不可见。
  • 我看不出有什么办法让h:inputHiddenaccept f:params。

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

由于 BalusCs 的回答,我记得我的第一个(和丢弃的)方法:

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

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

可悲的是,在 JSF 1.1 中,我必须使用<f:verbatim>这使得代码非常难看(甚至 eclipses 语法检查器也不理解它——尽管它可以工作):

<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>

4

2 回答 2

3

JSF 在这个问题的上下文中仅仅是一个 HTML/JS 代码生成器。您实际上不会任何东西从 JSF 传递到 HTML/JS。实际上,您只需让网络服务器中的 JSF打印所需的 HTML/JS 代码,以便网络浏览器反过来可以正确执行它。

因此,您需要做的就是编写 JSF 代码,使其准确打印所需的 JS 代码。

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

当在浏览器中打开 JSF 页面时(换句话说,当向服务器发送 HTTP 请求时,服务器会调用该服务器来FacesServlet执行生成 HTML/JS 的所有 JSF 工作),然后右键单击并查看源代码,您应该会看到像这样的东西:

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

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

但是要小心特殊字符,例如换行符。您可能需要创建一个委托给 Apache Commons Lang 的自定义 EL 函数StringEscapeUtils#escapeJavaScript(),另请参阅如何在 JSP 中转义 JavaScript?


更新:根据您似乎正在使用 JSF 1.1 的评论。如果升级不是一个选项(但我强烈建议这样做;实际上任何 JSF 1.1 项目都没有代码更改向前兼容 JSF 1.2),那么您需要以<f:verbatim>“通常的方式”放置非 JSF 标记。

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

另请参阅为什么从 JSF2.0 开始,Facelets 优于 JSP 作为视图定义语言?JSF/Facelets:为什么将 JSF/Facelets 与 HTML 标签混合不是一个好主意?了解一些背景信息。

根据您的投诉,

还有一个缺点是我不能把它放在里面,<head>因为它必须在里面<f:view>

这绝对不是真的。绝对可以把这个放进去<head>。只需将其<f:view>从内<body>移到外,将两者都<body>包裹<head>起来。<body><html>

<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core" %>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html" %>
<!DOCTYPE html>
<html lang="en">
    <f:view>
        <head>...</head>
        <body>...</body>
    </f:view>
</html>
于 2014-02-12T10:48:28.107 回答
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;
}

参考

于 2014-02-12T10:41:38.797 回答