在JSF2中使用表达式的<ui:include src="page.xhtml">未发送参数

3

我在尝试使用UIInclude传递一些后端参数,但是当我使用表达式如value="#{value}"时,它没有传递参数。但是,我可以使用普通字符串如value="value"来发送参数。

<ui:include src="index_1.xhtml">
      <ui:param name="action1" value="#{o.columnId}" />
      <ui:param name="action2" value="#{o.columnType}" />
</ui:include> <br/>

但是我可以使用参数传递

<ui:include src="index_1.xhtml">
      <ui:param name="action1" value="Value1" />
      <ui:param name="action2" value="Value2" />
</ui:include> <br/>

Index.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!--
To change this license header, choose License Headers in Project Properties.
To change this template file, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>TODO supply a title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </h:head>
    <h:body>
        <h:form>
            <ui:repeat value="#{myBean.models}" var="o">
                <ui:include src="index_1.xhtml">
                    <ui:param name="action1" value="#{o.columnId}" />
                    <ui:param name="action2" value="#{o.columnType}" />
                </ui:include> <br/>
                <ui:include src="index_2.xhtml"> 
                    <ui:param name="action1" value="#{o.columnId}" />
                    <ui:param name="action2" value="#{o.columnType}" />
                </ui:include><br/>
                <ui:include src="index_3.xhtml">
                    <ui:param name="action1" value="#{o.columnId}" />
                    <ui:param name="action2" value="#{o.columnType}" />
                </ui:include><br/>
            </ui:repeat>
            <p:commandButton value="Submit" action="#{myBean.submitForm}" />
        </h:form>
    </h:body>
</html>

index_1.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>TODO supply a title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </h:head>
    <h:body>
        <f:event listener="#{myBean.ajaxEventForObjectNo(action1, action2)}" type="preRenderView" />
        <h:outputLabel>Single Line Text</h:outputLabel>
        <p:inputText value="#{myBean.models[myBean.objectNo].columnId}" />
    </h:body>    
</html>

谢谢。

2
ui:repeatui:include 之后被评估,这就是为什么您还没有迭代的参数。请使用 c:forEach 替换 ui:repeat - Aritz
没错。您必须同时注意 JSTL 和 JSF 标签。然而,没有其他方法可以迭代包括 xhtml 内容的集合。您应该考虑将纯 xhtml 更改为组合组件,它似乎更适合您的情况。 - Aritz
是的,复合组件会是最好的选择。 - MRX
1个回答

1
问题就像 @XtremeBiker 已经说过的那样,ui:includeui:repeat 之前被执行。更准确地说,ui:include视图构建时间被执行,而ui:repeat视图呈现时间被评估。

因此,您由ui:repeatvar属性定义的变量o尚未初始化。因此,它会评估为null

一个可能的替代方案是使用c:forEachc:forEach是JSTL标记处理程序,并在视图构建时间执行。但是@BalusC has to say关于这个问题的看法如下:

<c:forEach> 替换 <ui:repeat>应该可以解决这个问题。但是它可能会产生不良影响。由于您的具体功能要求并不完全清楚,因此很难事先预测。

不确定他提到了哪些副作用。但我还没有遇到问题,使用<c:forEach>替换<ui:repeat>

这里还有一个关于该主题的非常好的阅读材料:JSTL在JSF2 Facelets中...有意义吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接