pak*_*ore 10 java jsf jsp richfaces el
我在使用EL和javascript函数时遇到了麻烦(JSF 1.2,Facelets,Richfaces 3.3.0GA).我有一个包含另一个组成的页面:
<ui:include src="/pages/panels/examinationPanel.xhtml">
<ui:param name="prefix" value="new" />
Run Code Online (Sandbox Code Playgroud)
而在我看来,ui:composition我想把它附加prefix到每个身份证上.例如:
<rich:modalPanel id="#{prefix}_examinationPanel">
Run Code Online (Sandbox Code Playgroud)
这没问题.
但问题来自于我想要访问函数中的组件,因为oncomplete我无法正确地连接字符串.例如
oncomplete="#{rich:component('#{prefix}_examinationPanel')}.show();"
Run Code Online (Sandbox Code Playgroud)
我也试过fn:join但它没有执行该函数,因为它在发现"#"字符时会抱怨错误.例如:
oncomplete="#{rich:component(fn:join(#{prefix},'examinationPanel'))}.show()"
Run Code Online (Sandbox Code Playgroud)
投
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( #"
Run Code Online (Sandbox Code Playgroud)
如果我用括号或#和括号括起来,会出现不同的错误.
我究竟做错了什么?
另一个问题,在条件命令中
oncomplete="#{a}?#{b}:#{c}"
Run Code Online (Sandbox Code Playgroud)
如果真或假,我如何"分组"才能执行更多操作?例如这样的事情:
oncomplete="#{a}?(#{b}#{f}):(#{c}#{d}#{e})"
Run Code Online (Sandbox Code Playgroud)
我试过括号,但没有正确解析它.
提前致谢.
Boz*_*zho 19
假设您正在使用Facelets,这是一个相对较好的解决方案:
functions.taglib.xml在您的WEB-INF中创建添加指示位置的上下文参数:
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>
/WEB-INF/functions.taglib.xml
</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)在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>
Run Code Online (Sandbox Code Playgroud)在页面中使用以下内容:
xmlns:fnc="http://yournamespace.com/fnc"
....
oncomplete="#{rich:component(fnc:concat(prefix, '_examinationPanel'))}.show();"
Run Code Online (Sandbox Code Playgroud)最后,在Function类中定义简单方法:
public static String concat(String string1, String string2) {
return string1.concat(string2);
}
Run Code Online (Sandbox Code Playgroud)小智 15
一个更简单的解决方案是像对象一样管理EL中的String,并使用String类中的方法concat,如下所示:
#{rich:component('constantString'.concat(variable))}.show();
Run Code Online (Sandbox Code Playgroud)