f:setPropertyActionListener 和 h:dataTable 的问题

发布于 2024-12-15 12:52:50 字数 2052 浏览 5 评论 0原文

我试图使用 setPropertyActionListener< 将两个参数(nomComposantARejouertypeFileARejouer)传递给操作方法(gestionnaireMessagesController.rejouerMessage) /code> (我们使用 jsf 1.2)。

这是相关的jsp代码:

<h:column>
<h:columnHeaderFacet>
<h:columnHeader value="#{msgs['pilotage.coordinateur.libelle.rejouer']}" />
</h:columnHeaderFacet>
<h:commandLink id="rejouer"
value="#{msgs['pilotage.coordinateur.libelle.rejouer']}"
action="#{gestionnaireMessagesController.rejouerMessage}">
<f:setPropertyActionListener
target="#{gestionnaireMessagesController.nomComposantARejouer}"
value="#{gestionnaireMessagesController.nomComposant}" />
<f:setPropertyActionListener
target="#{gestionnaireMessagesController.typeFileARejouer}"
value="#{gestionnaireMessagesController.typeFile}" />
</h:commandLink>
</h:column>

但是,我总是得到一个NPE,因为在操作方法中使用时两个参数都为空:

public String rejouerMessage() {
    log.debug("-->"+nomComposantARejouer);//null
    ParamResultatMessagesDTO message= (ParamResultatMessagesDTO) messagesTableau.getRowData();
    log.debug("MessageId: " + message.getMessageId());
    try {
        Pager p = Pager.getInstance();
        ParamRejouerMessageDTO prm = new ParamRejouerMessageDTO();
        prm.setMessageId(message.getMessageId());
        prm.setFileGet(nomsFilesMap.get(nomComposantARejouer).get(typeFileARejouer));
        prm.setFilePut(nomsFilesMap.get(nomComposantARejouer).get("TASKQ"));
        RejouerMessageService serv = (RejouerMessageService) this.getService(ServiceCst.REJOUER_MESSAGE_SERVICE);
        serv.rejouerMessage(prm);
    } catch (BusinessException e) {
        this.addMessage(e);
    } catch (ServiceException e) {
        this.addMessage(e);
    }


    return chargerPage(); // TODO Navigation case.
}

我不确定我出了什么问题。有人可以帮忙吗?

仅供参考,变量 nomComposanttypeFile 可以毫无问题地显示,并且不为 null。

还要忽略 h:columnHeaderFacet 标签。它们是我重命名的内部标签。

I am trying to pass two parameters i.e. (nomComposantARejouer, typeFileARejouer) to an action method (gestionnaireMessagesController.rejouerMessage) using the setPropertyActionListener (we use jsf 1.2).

Here is the relevant jsp code:

<h:column>
<h:columnHeaderFacet>
<h:columnHeader value="#{msgs['pilotage.coordinateur.libelle.rejouer']}" />
</h:columnHeaderFacet>
<h:commandLink id="rejouer"
value="#{msgs['pilotage.coordinateur.libelle.rejouer']}"
action="#{gestionnaireMessagesController.rejouerMessage}">
<f:setPropertyActionListener
target="#{gestionnaireMessagesController.nomComposantARejouer}"
value="#{gestionnaireMessagesController.nomComposant}" />
<f:setPropertyActionListener
target="#{gestionnaireMessagesController.typeFileARejouer}"
value="#{gestionnaireMessagesController.typeFile}" />
</h:commandLink>
</h:column>

However, I always get a NPE because both parameters are null when used in the action method:

public String rejouerMessage() {
    log.debug("-->"+nomComposantARejouer);//null
    ParamResultatMessagesDTO message= (ParamResultatMessagesDTO) messagesTableau.getRowData();
    log.debug("MessageId: " + message.getMessageId());
    try {
        Pager p = Pager.getInstance();
        ParamRejouerMessageDTO prm = new ParamRejouerMessageDTO();
        prm.setMessageId(message.getMessageId());
        prm.setFileGet(nomsFilesMap.get(nomComposantARejouer).get(typeFileARejouer));
        prm.setFilePut(nomsFilesMap.get(nomComposantARejouer).get("TASKQ"));
        RejouerMessageService serv = (RejouerMessageService) this.getService(ServiceCst.REJOUER_MESSAGE_SERVICE);
        serv.rejouerMessage(prm);
    } catch (BusinessException e) {
        this.addMessage(e);
    } catch (ServiceException e) {
        this.addMessage(e);
    }


    return chargerPage(); // TODO Navigation case.
}

I am not sure what I am getting wrong. Can anyone please help?

FYI, the variables nomComposant and typeFile can be displayed without problem and are not null.

Also ignore the h:columnHeaderFacet tags. They are inhouse tags that I've renamed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

允世 2024-12-22 12:52:50

您基本上正在做:

gestionnaireMessagesController.setNomComposantARejouer(gestionnaireMessagesController.getNomComposant());
gestionnaireMessagesController.setTypeFileARejouer(gestionnaireMessagesController.getTypeFile());

在表单提交的调用操作阶段。这两个属性都位于同一个 bean 实例中,并在调用操作方法之前不久进行复制。这毫无意义。您似乎期望在显示表单的请求期间评估 value 。您似乎认为 设置请求参数。这不是真的。 是唯一执行此操作的函数。

因此,这应该

<f:param
    name="nomComposantARejouer"
    value="#{gestionnaireMessagesController.nomComposant}" />
<f:param
    name="typeFileARejouer"
    value="#{gestionnaireMessagesController.typeFile}" />

faces-conig.xmlgestionnaireMessagesController 上的以下内容结合使用:

<managed-property>
    <property-name>nomComposantARejouer</property-name>
    <value>#{param.nomComposantARejouer}</value>
</managed-property>
<managed-property>
    <property-name>typeFileARejouer</property-name>
    <value>#{param.typeFileARejouer}</value>
</managed-property>

(如有必要,您可以删除 ARejouer 以便它重用相同的属性)

You're basically doing:

gestionnaireMessagesController.setNomComposantARejouer(gestionnaireMessagesController.getNomComposant());
gestionnaireMessagesController.setTypeFileARejouer(gestionnaireMessagesController.getTypeFile());

during the invoke action phase of the form submit. Both properties are in the same bean instance and copied shortly before action method is invoked. This makes no sense. You seem to be expecting that the value is evaluated during the request of displaying the form. You seem to be thinking that <f:setPropertyActionListener> sets a request parameter. This is not true. The <f:param> is the only which does that.

So, this should do,

<f:param
    name="nomComposantARejouer"
    value="#{gestionnaireMessagesController.nomComposant}" />
<f:param
    name="typeFileARejouer"
    value="#{gestionnaireMessagesController.typeFile}" />

in combination with the following on <managed-bean> of gestionnaireMessagesController in faces-conig.xml:

<managed-property>
    <property-name>nomComposantARejouer</property-name>
    <value>#{param.nomComposantARejouer}</value>
</managed-property>
<managed-property>
    <property-name>typeFileARejouer</property-name>
    <value>#{param.typeFileARejouer}</value>
</managed-property>

(you can if necessary remove ARejouer so that it reuses the same property)

海拔太高太耀眼 2024-12-22 12:52:50

我经常遇到这个问题,当有两个f:setPropertyActionListener时就会出现这种情况。

您可以这样尝试:

 <h:commandLink id="rejouer"
    value="#{msgs['pilotage.coordinateur.libelle.rejouer']}"
     action="#{gestionnaireMessagesController.rejouerMessage}"> <f:param
    name="nomComposant"
    value="#{gestionnaireMessagesController.nomComposant}"   />   
   <f:param name="typeFile"
    value="#{gestionnaireMessagesController.typeFile}" />   
  </h:commandLink>

阅读此链接: http://www .coderanch.com/t/211274/JSF/java/Passing-param-commandLink

I have often encountered this problem , it occours when there are two f:setPropertyActionListener.

You try in this way:

 <h:commandLink id="rejouer"
    value="#{msgs['pilotage.coordinateur.libelle.rejouer']}"
     action="#{gestionnaireMessagesController.rejouerMessage}"> <f:param
    name="nomComposant"
    value="#{gestionnaireMessagesController.nomComposant}"   />   
   <f:param name="typeFile"
    value="#{gestionnaireMessagesController.typeFile}" />   
  </h:commandLink>

Read this link: http://www.coderanch.com/t/211274/JSF/java/Passing-param-commandLink

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文