在 JSF/JSP EL 和 Javascript 中连接字符串 [重复]

Posted

技术标签:

【中文标题】在 JSF/JSP EL 和 Javascript 中连接字符串 [重复]【英文标题】:Concatenate strings in JSF/JSP EL and Javascript [duplicate] 【发布时间】: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。我编辑了帖子以添加该信息,这确实是相关的 【参考方案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”不一样吗(不起作用) 嗯,没有。我从我的配置中复制了它,所以它似乎也没有任何伤害。 我试过了,效果很好。此外,我还学到了有关创建自己的命名空间和函数的课程:)。感谢您快速而完整的回答。

以上是关于在 JSF/JSP EL 和 Javascript 中连接字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在由 @ResourceDependency 加载的 Javascript 文件中获取 EL

JavaScript Codificar el email con Javascript contra el spam。

js/jstl/el的区别

在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量

在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量

在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量