【问题标题】:Concatenate strings in JSF/JSP EL and Javascript [duplicate]在 JSF/JSP EL 和 Javascript 中连接字符串 [重复]
【发布时间】:2011-01-12 15:51:19
【问题描述】:

我在使用 EL 和 javascript 函数(JSF 1.2、Facelets、Richfaces 3.3.0GA)时遇到问题。我有一个包含另一个作品的页面:

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

当真或假时,我如何“分组”以便能够执行更多操作?例如这样的:

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

我尝试过使用括号,但没有正确解析它。

提前致谢。

【问题讨论】:

  • 我正在使用 facelets。我编辑了帖子以添加该信息,这确实是相关的

标签: java jsp jsf richfaces el


【解决方案1】:

一个更简单的解决方案是将 EL 中的 String 像 Object 一样管理,并使用 String 类中的 concat 方法,如下所示:

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

【讨论】:

  • 请注意,这只适用于 EL 2.2 或 JBoss EL(用于 EL 2.1)。 OP 没有表明他正在使用 Servlet 3.0 或 JBoss Seam。
  • 在这种情况下,他应该考虑添加 EL 2.2 支持,尤其是在函数调用中传递参数的能力。
【解决方案2】:

假设您使用的是 Facelets,这里有一个比较好的解决方案:

  • 在您的 WEB-INF 中创建 functions.taglib.xml
  • 添加指示位置的上下文参数:

    <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);
    }
    

【讨论】:

  • 谢谢你的回答,我马上去试试。一个问题,尾随的“;”因为参数值是故意的?另一个,这和“fn:join”不一样吗(不起作用)
  • 嗯,没有。我从我的配置中复制了它,所以它似乎也没有任何伤害。
  • 我试过了,效果很好。此外,我还学到了有关创建自己的命名空间和函数的课程:)。感谢您快速而完整的回答。
猜你喜欢
  • 2011-03-12
  • 2010-09-22
  • 1970-01-01
  • 2013-06-10
  • 2011-04-08
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
相关资源
最近更新 更多