[英]JSF 1.1 parameters in hidden field
我的目標是將參數( Hello {0}
)的字符串從備用Bean傳遞到JavaScript。 我當前的方法是將字符串放在h:inputHidden
然后讓JS讀取值onLoad。 遺憾的是, h:inputHidden
內部的f:param
無法像h:outputFormat
那樣工作。
通常哪種方法是可見的?
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請求並調用FacesServlet
, FacesServlet
會執行所有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.