2010-02-03 72 views
10

我遇到了EL和JavaScript函數(JSF 1.2,Facelets,Richfaces 3.3.0GA)的麻煩。我有一個頁面,其中包括另一組成:在JSF/JSP EL和Javascript中連接字符串

<ui:include src="/pages/panels/examinationPanel.xhtml"> 
<ui:param name="prefix" value="new" /> 

在我ui:composition我想給prefix追加到每一個ID。例如:

<rich:modalPanel id="#{prefix}_examinationPanel"> 

這很好。

但問題來了,當我想要訪問組件的功能,如oncomplete我不能讓它正確連接字符串。例如

oncomplete="#{rich:component('#{prefix}_examinationPanel')}.show();" 

我已經試過fn:join以及而是因爲它抱怨,當它發現「#」字符錯誤不執行該功能。例如:如果我用括號或#和托架振奮它

oncomplete="#{rich:component(fn:join(#{prefix},'examinationPanel'))}.show()" 

拋出

SEVERE: Servlet.service() for servlet Faces Servlet threw exception org.apache.el.parser.ParseException: Encountered "fn:join(#" at line 1, column 33. 

Encountered "fn:join(#" 

不同的錯誤。

我在做什麼錯?

而另一個問題,在有條件的命令一樣

oncomplete="#{a}?#{b}:#{c}" 

我怎樣才能「團」能夠真或假時要執行多個動作? Por例子是這樣的:

oncomplete="#{a}?(#{b}#{f}):(#{c}#{d}#{e})" 

我已經試過括號,但沒有正確解析它。

在此先感謝。

+0

Facelets或JSP? – Bozho 2010-02-03 14:59:21

+0

我正在使用facelets。我編輯帖子添加信息,這確實是相關的 – pakore 2010-02-03 15:01:58

回答

19

假設你正在使用的Facelets,這裏是一個比較好的解決方案:

  • 創建您functions.taglib.xml WEB-INF
  • 添加上下文PARAM指示位置:

    <context-param> 
        <param-name>facelets.LIBRARIES</param-name> 
        <param-value> 
         /WEB-INF/functions.taglib.xml 
        </param-value> 
    </context-param> 
    
  • 在該XML提出以下內容:

    <?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE facelet-taglib PUBLIC 
        "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" 
        "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd"> 
    <facelet-taglib xmlns="http://java.sun.com/JSF/Facelet"> 
        <namespace>http://yournamespace.com/fnc</namespace> 
        <function> 
         <function-name>concat</function-name> 
         <function-class>com.yourpackage.utils.Functions</function-class> 
         <function-signature> 
          java.lang.String concat(java.lang.String, java.lang.String) 
         </function-signature> 
        </function> 
    </facelet-taglib> 
    
  • 在頁面

    使用以下命令:

    xmlns:fnc="http://yournamespace.com/fnc" 
    .... 
    oncomplete="#{rich:component(fnc:concat(prefix, '_examinationPanel'))}.show();" 
    
  • 終於,在Function類中定義的簡單方法:

    public static String concat(String string1, String string2) { 
        return string1.concat(string2); 
    } 
    
+0

感謝您的答案,我現在就去試試。 一個問題,尾隨「;」對於參數值是故意的? 另一方面,這不是「fn:join」(不起作用) – pakore 2010-02-03 15:17:21

+0

hm,no。我從我的配置複製它,所以它似乎也沒有任何傷害。 – Bozho 2010-02-03 15:18:31

+0

我試過了,它的工作原理。另外,我已經學習了一些關於創建你自己的命名空間和函數的課程:)。感謝您的快速和完整的答案。 – pakore 2010-02-03 15:44:40

15

一個簡單的解決方案是管理中的字符串EL像一個對象,並使用類String中的方法concat,如下所示:

#{rich:component('constantString'.concat(variable))}.show(); 
+4

請注意,這僅適用於EL 2.2或JBoss EL(適用於EL 2.1)。 OP沒有表明他在使用Servlet 3.0或JBoss Seam。 – BalusC 2011-09-09 23:18:03

+0

在這種情況下,他應該考慮添加EL 2.2支持,特別是在函數調用中傳遞參數的能力。 – 2012-04-17 09:07:10