在 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。
在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量