java - 条件检查 c :if always fails

标签 java jsp jsf seam jstl

c:if 测试对我来说总是失败,而且它永远不会进入循环。我正在使用以下命名空间

xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:c="http://java.sun.com/jstl/core"

要拆分的字符串('array')是“Tom and Jerry are GAP1 friends”

<s:decorate template="/layout/display-text.xhtml">
    <c:set var="array" value="#{_mybean.value}"/>
    <c:set var="space" value="#{fn:split(array, ' ')}"/>
    <c:set var="len" value="#{fn:length(space)}"/>
    <h:outputText value="total length = #{len}"/><br/>
    <c:forEach begin="0" end="5" var="index">
        <h:outputText value="index = #{index}, value = #{space[index]}"/><br/>
        <c:set var="val" value="#{space[index]}"/>
        <c:if test="#{fn:startsWith(val, 'GAP')}">
            <h:outputText value="Found keyword parameter GAP" /><br/>
        </c:if>
    </c:forEach>
</s:decorate>

最佳答案

JSTL 核心 URI 无效。根据 JSTL TLD它应该是(注意额外的 /jsp):

xmlns:c="http://java.sun.com/jsp/jstl/core"

也就是说,将 JSF 与 JSTL 混合从来都不是一个好主意。它不会总是像您期望的那样给出结果,因为它们不会像您期望的编码那样同步运行。更多的是JSP/JSTL先自上而下运行,然后将产生的结果交给JSF再从上到下进一步处理。这会导致某些特定的构造失败。最好改用纯 JSF 组件/属性。

而不是 c:forEach,而是使用 Seam 的 a4j:repeat 或 Facelets 的 ui:repeat 而不是 c: if 使用必须切换为显示/隐藏的 JSF 组件的 rendered 属性。代替所有 JSTL c:set,在托管 bean 构造函数或操作方法或 getter 中编写适当的代码逻辑。

然而,JSTL 函数 (fn) 标签库在 JSF 中仍然非常有值(value)。您可以继续使用它。

关于java - 条件检查 c :if always fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2093389/

相关文章:

java - Android 无法删除文件

java - JSON Jackson 根据我的预期映射到其他构造函数

java - 问题!实体数据未使用数据访问对象 (dao) 和 JPA 获取?

javascript - HTML 缩放重叠

java - 使用 f 转换时间时出现日期错误 :convertDateTime

jsf - <p :selectOneMenu caseSensitive ="true"> doesn't seem to have any effect

java - 为大量外部 API 请求扩展软件/硬件?

java - 错误: Could not find or load main class

html - 欢迎文件在 spring 中不使用 html 文件

jquery - 使用 PrimeFaces 手动添加/加载 jQuery 会导致未捕获的类型错误