【问题标题】:JSF 1.1 parameters in hidden field隐藏字段中的 JSF 1.1 参数
【发布时间】:2014-03-07 14:45:16
【问题描述】:

我的目标是将带有参数的字符串 (Hello {0}) 从支持 bean 传递给 JavaScript。我目前的做法是将字符串放在h:inputHidden 中,让JS 读取onLoad 的值。 可悲的是,h:inputHidden 内部的f:param 不像h:outputFormat 那样工作。

什么方法通常是可取的?

  • 我可以将字符串与支持 bean 中的参数结合起来,但 imo 这不应该是 bean 关心的问题。
  • 我可以将它们组合到 JS 中,但这似乎又像是在重新发明轮子(使用 replace 函数...)
  • 我没有看到使用 h:outputFormat 的(好)方法,但让它对用户不可见。
  • 我认为没有办法让h:inputHidden 接受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 中我不得不使用 &lt;f:verbatim&gt; 这使得代码真的很丑(即使是 Eclipse 语法检查器也不理解它 - 尽管它可以工作):

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

另外一个缺点是我不能把它放在&lt;head&gt; 中,因为它必须在&lt;f:view&gt; 中。

【问题讨论】:

  • @BalusC, @LaurentG:谢谢你们两位的cmets。我会接受 LautentGs 的回答,因为这也是我的首选方法。正如我在问题编辑中提到的,&lt;f:verbatim&gt; 方法真的很难看。我会将赏金奖励给 BalusC,因为他花在他的答案和 cmets 上的所有时间都对我有很大帮助:)
  • 谢谢。我很想收到我的第一个赏金,但我必须同意,balusC 的答案总是最好的!

标签: jsf jsf-1.2 jsf-1.1


【解决方案1】:

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

因此,您需要做的就是编写 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 获取这个值。

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


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

<f:verbatim><script>
    var text = '</f:verbatim><h:outputFormat value="Hello {0}"><f:param value="World" /></h:outputFormat><f:verbatim>';
</script></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? 了解一些背景信息。

根据您的投诉,

另外一个缺点是我不能把它放在&lt;head&gt; 中,因为它必须在&lt;f:view&gt; 中。

这绝对不是真的。当然你可以把它放在&lt;head&gt;。只需将&lt;f:view&gt;&lt;body&gt; 内部移动到&lt;body&gt; 外部,同时包裹&lt;head&gt;&lt;body&gt; 甚至&lt;html&gt;

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

【讨论】:

  • 感谢您的回答。这实际上是我尝试的第一种方法,但在这里我的问题中忘了提及它。我的问题是,它对我不起作用。无论我把你的代码 sn-p 放在哪里,HTML 源代码都会显示:var text = '';(我尝试在 和 内的 中)。我是 JSF 新手,正在研究一个现有的复杂项目,所以我还不能说是否需要进一步配置。
  • 为我工作。您的问题是由迄今为止提供的信息中不可见的其他地方引起的。只要您不从开发人员的角度而不是最终用户的角度详细说明“行不通”,就很难回答。
  • 对不起,我的评论还没有完成。我总是喜欢 (SHIFT) ENTER 在评论框中:(
  • 您使用的是哪个 JSF impl/version?您是否完全按照我的回答使用了测试代码,或者您是否将 value 替换为 bean 属性或捆绑变量?
  • found out 使用了 Apache MyFaces 1.1.4。我担心这意味着实际上使用了 JSF 1.1?我可能不得不更新这个问题。我按原样复制了您的代码,并且没有更改 EL,因此没有使用对任何 bean 的引用。
【解决方案2】:

由于您使用的是 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;
}

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2021-02-24
    • 2012-09-01
    • 1970-01-01
    • 2015-04-17
    • 2021-01-04
    • 2013-04-06
    相关资源
    最近更新 更多