一尘不染

在JSF / JSP EL和Javascript中连接字符串

jsp

我在使用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})"

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

提前致谢。


阅读 437

收藏
2020-06-08

共1个答案

一尘不染

假设您正在使用Facelets,这是一个相对不错的解决方案:

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

    <context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>
        /WEB-INF/functions.taglib.xml
    </param-value>
    

  • 在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”>
    xmlns="http://java.sun.com/JSF/Facelet">
    <namespace>http://yournamespace.com/fnc

    concat
    com.yourpackage.utils.Functions

    java.lang.String concat(java.lang.String, java.lang.String)


  • 在页面中使用以下命令:

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

2020-06-08