使用f:param值设置f:setPropertyActionListener值

时间:2015-06-10 16:10:15

标签: jsf jsf-2 param setpropertyactionlistener

我试图使用setPropertyActionListener标记在我的支持bean中设置一个值。但是,它并没有像我预期的那样发挥作用。

上下文:userService是我的支持bean的一个实例,它包含一个int成员reqID。反过来,这是属于名为User的类的对象映射的关键。我正在尝试创建一个列出所有User实例的页面,并提供一个按钮来访问显示特定用户信息的单独视图。为此,我尝试将userService.reqID设置为所选用户的ID,以便它可以为下一个视图生成对该用户的引用(在调用userService.toUserInfo中完成)

如果我使用下面的xhtml代码段:

<ui:define name="content">
        <h:form>
            <h:panelGrid>
                    <ui:repeat value="#{userService.UserList.getUserList()}" var="user">
                        <li>
                            <h:outputText value="#{user.name}" />
                            <h:commandButton value="View details of #{user.name}" action="#{userService.toUserInfo}">
                            <f:param name="id" value="#{user.id}" />
                            <f:setPropertyActionListener target="#{userService.reqID}" value="#{id}"/>
                            </h:commandButton>

                        </li>
                    </ui:repeat> 
            </h:panelGrid>
        </h:form>
    </ui:define>

标记似乎没有正确评估id,我得到一个空指针异常。

之前,我尝试更改我的setPropertyActionListenerTag,因此它读出:

<f:setPropertyActionListener target="#{userService.reqID}" value="id"/>

给了我一个错误,因为标签发送了字符串"id"而不是参数的int值。

有没有办法强制f:setPropertyActionListener来评估value下的表达式?或者是否有其他标签可以让我这样做?

另外,ui:param在这里使用得恰当吗?

1 个答案:

答案 0 :(得分:2)

df['OEDatum'] = df[['OEDatum','OEUhrzeit']].apply(lambda x: dt.datetime.combine(x['OEDatum'].date(),x['OEUhrzeit']), axis=1) df['ODatum'] = df[['ODatum','OUhrzeit']].apply(lambda x: dt.datetime.combine(x['ODatum'].date(),x['OUhrzeit']), axis=1) (和<f:param>)并没有这样做。 <ui:param>旨在向<f:param><h:xxxLink>组件的结果添加HTTP请求参数,并在<h:xxxButton>中参数化邮件格式。 <h:outputFormat>旨在将Facelet上下文参数传递给<ui:param><ui:include><ui:decorate>。 Mojarra有一个错误,它的行为就像没有范围的<ui:define>一样。这不是用意。

如果对于#34;别名&#34;绝对必要,请使用<c:set>而不使用范围一个(长)EL表达。

<c:set>

将它放在<c:set var="id" value="#{user.id}" /> 之外。同样在这个结构中,它有点奇怪。它并没有使代码更好。我只是遗漏它。

<h:commandLink>

另见:

无关具体问题,如果您正在使用EL 2.2(因为您使用的是JSF 2.2,毫无疑问,因为它需要最少的Servlet 3.0,与EL 2.2)携手,然后将其作为bean动作方法参数传递而不会导致<f:setPropertyActionListener ... value="#{user.id}" /> 混乱。另见a.o. Invoke direct methods or methods with arguments / variables / parameters in ELHow can I pass selected row to commandLink inside dataTable?

<f:setPropertyActionListener>

又一个不相关的注释,例如&#34;查看用户&#34;或&#34;编辑用户&#34;请求通常是幂等的。为此,您最好使用<h:commandButton ... action="#{userService.toUserInfo(user.id)}"> (是的,使用<h:link>)。另见a.o. Creating master-detail pages for entities, how to link them and which bean scope to chooseHow to navigate in JSF? How to make URL reflect current page (and not previous one)

哦,<f:param>周围的<h:panelGrid>在HTML视角中没有意义。摆脱它并使用<ui:repeat><li>代替。另请参阅HTMLDog HTML Beginner tutorial