簡體   English   中英

隱藏字段中的JSF 1.1參數

[英]JSF 1.1 parameters in hidden field

我的目標是將參數( Hello {0} )的字符串從備用Bean傳遞到JavaScript。 我當前的方法是將字符串放在h:inputHidden然后讓JS讀取值onLoad。 遺憾的是, h:inputHidden內部的f:param無法像h:outputFormat那樣工作。

通常哪種方法是可見的?

  • 我可以將字符串與后備bean中的參數組合在一起,但是imo不應成為bean所關心的問題。
  • 我可以將它們結合在JS中,但再次看起來像是在重新發明輪子(使用replace函數...)
  • 我沒有看到一種使用h:outputFormat的(好方法),但是使它對用戶不可見。
  • 我沒有辦法讓h:inputHidden接受f:param

編輯:實際使用的實現是Apache MyFaces 1.1.4,所以我將標題更新為JSF 1.1。

由於BalusC的回答,我想起了我的第一個(和廢棄的)方法:

  • 直接包含在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>內部。

在這個問題的上下文中,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頁面時(換句話說,當向服務器發送HTTP請求並調用FacesServletFacesServlet會執行所有JSF生成HTML / JS的工作),並進行右鍵單擊和“ 查看源代碼”看到這樣的事情:

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

此后執行的JS代碼應該可以通過變量名text來獲取此值。

但是,請注意使用特殊字符(例如換行符)。 您可能需要創建一個委托給Apache Commons Lang StringEscapeUtils#escapeJavaScript()的自定義EL函數,另請參見如何在JSP中轉義JavaScript?


更新 :根據您似乎正在使用JSF 1.1的注釋。 如果不能選擇升級(但是我強烈建議您這樣做;實際上,任何JSF 1.1項目都沒有與JSF 1.2兼容的向前代碼更改),那么您需要將非JSF標記放入<f:verbatim>方式”。

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

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

參考文獻

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM