【问题标题】:jsf rendered condition not working with selectOneMenujsf 渲染条件不适用于 selectOneMenu
【发布时间】:2013-05-01 02:50:08
【问题描述】:

您好,我已经阅读了大量类似的问题,但答案对我不起作用。

我有这个

<p:selectOneMenu id="tipoTaxon" value="#{taxonDM.taxon.tipoTaxon}"
                        name="tipoTaxon">
                        <f:converter converterId="tipoTaxonConverter" />
                        <f:selectItem itemLabel="Seleccione uno" itemValue="0" />
                        <f:selectItems value="#{tipoTaxonDM.tiposTaxones}" var="txn"
                            itemValue="#{txn.idTipoTaxon}" itemLabel="#{txn.nombreTipo}" />
                        <p:ajax  render="test" />
                    </p:selectOneMenu>
                    <p:inputText id="test" rendered="#{taxonDM.taxon.tipoTaxon != null}" />

如您所见,我想在选择选项时呈现测试。 TipoTaxon 基本上是我数据库上的一个表并且是类,所以我必须制作一个转换器。它现在似乎可以正常工作,我没有收到以前的错误。现在我没有收到任何错误,但没有呈现“测试”。

我尝试了以下

#{taxonDM.taxon.tipoTaxon != null}

还有

#{taxonDM.taxon.tipoTaxon.idTipoTaxon != null}"

我尝试在另一个面板上设置测试

<h:panelGrid columns="2" id="formTaxon">
                    <h:outputLabel value="Nombre Científico Taxón" for="taxonInput" />
                    <p:inputText value="#{taxonDM.taxon.nombreCientificoTaxon}"
                        id="taxonInput" />
                    <h:outputLabel value="Nombre Común" for="nombreComunInput" />
                    <p:inputText value="#{taxonDM.taxon.nombreComunTaxon}"
                        id="nombreComunInput" />
                    <h:outputLabel value="Tipo" for="tipoTaxon" />
                    <p:selectOneMenu id="tipoTaxon" value="#{taxonDM.taxon.tipoTaxon}"
                        name="tipoTaxon">
                        <f:converter converterId="tipoTaxonConverter" />
                        <f:selectItem itemLabel="Seleccione uno" itemValue="0" />
                        <f:selectItems value="#{tipoTaxonDM.tiposTaxones}" var="txn"
                            itemValue="#{txn.idTipoTaxon}" itemLabel="#{txn.nombreTipo}" />
                        <p:ajax  render="formTaxon2" />

                    </p:selectOneMenu>
                </h:panelGrid>
                <h:panelGrid columns="2" id="formTaxon2">
                    <p:inputText id="test" rendered="#{taxonDM.taxon.tipoTaxon != null}" />
                </h:panelGrid>

使用 render="test" 或 render="formTaxon2"

我向 p:ajax 添加了一个侦听器方法,它工作正常,所以我知道它正在被调用。

    public void tipoTaxonesXX(AjaxBehaviorEvent e){
            System.out.println("Working");
    }

它确实在我的控制台上打印了“正在工作”。 我的表单也没有保存,所以我猜它在从tipottaxon 或数字转换时遇到了麻烦,但它会变为空,我稍后会修复它。

如果有人需要,这里是转换器

import ec.edu.puce.biologia.model.TipoTaxon;

@FacesConverter("tipoTaxonConverter")
public class TipoTaxonConverter implements Converter {

    private TipoTaxonDao tipoTaxonDao;

    @Override
    public Object getAsObject(final FacesContext arg0, final UIComponent arg1,
            final String value) {
        if (value == null || !value.matches("\\d+")) {
            return null;
        }
        try {
            TipoTaxon tipoTaxon = tipoTaxonDao.recuperar(Long.valueOf(value));
            System.out.println("Getting the operation value = "
                    + tipoTaxon.getNombreTipo());
            return tipoTaxon;
        } catch (NumberFormatException e) {
            return null;
            // throw new ConverterException(new
            // FacesMessage("Unknown operation ID: " + value));
        } /*
         * catch (EntidadNoEncontradaException e) { throw new
         * ConverterException(new FacesMessage("Unknown operation ID: " +
         * value)); }
         */
    }

    @Override
    public String getAsString(final FacesContext arg0, final UIComponent arg1,
            final Object value) {
        if (!(value instanceof TipoTaxon)
                || ((TipoTaxon) value).getIdTipoTaxon() == null) {
            return null;
        }

        return String.valueOf(((TipoTaxon) value).getIdTipoTaxon());
    }
}

我需要提出一些例外情况

更新答案 我这里的代码有很多错误,我改了很多,但主要问题是转换器上的 EJB 没有工作。我最终使用了 ManagedBean。更多信息在这里http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ProcessingGETRequestParameters

【问题讨论】:

    标签: java jsf-2 primefaces


    【解决方案1】:

    正如我在previous answer to your question 中所说,&lt;p:selectOneMany&gt; 值都必须指向您的用户类,TipoTaxon每个&lt;f:selectItem&gt;/&lt;f:selectItems&gt; itemValue 也必须指向相同用户类,TipoTaxon

    如您所见,itemValue="0"itemValue="txn.nombreTipo" 都不满足上述陈述。更正它并查看它的工作原理。


    我对未来发布的建议是发布完整、相关且必要格式化的代码,在您的情况下包括转换器代码、您的模型类和托管 bean 部分.另外,不要将相同的问题发布两次/三次等,而是尝试自己解决,否则它将作为重复而关闭。 p>

    【讨论】:

    • 感谢您抽出宝贵的时间来回答,但我是 JSF 的新手而不是 stackoverflow,所以我尽我所能以最清晰的方式发布我的代码格式。如果由于某种原因我的代码没有格式化,可以对我所做的一些编辑进行,它会溜走。我觉得这是一个不同的问题。我并不是以刻薄的方式说这些。如果你看到每个问题之间的时间差大约是 24 小时,24 小时我都被困在同一件事上,所以我什么都尝试了。我阅读了有关转换器的所有信息。
    • 我也删除了 f:selectItem 并且没有任何变化。
    • @JuanDiego 我不是想“教”你,而是给你一个友好的建议!我们都在这里互相帮助和学习。因此,该评论绝不是要伤害您的学习能力。此外,如果您明确指出到目前为止您不理解的内容,我会很高兴地回答/解释。所以,继续,问:)
    • 为什么不在转换器内部处理 DAO 的依赖注入?
    • 感谢您所做的一切。你对依赖注入是什么意思,你建议我在那里做什么。此外,如果我将 f:ajax 与渲染一起使用,我会得到 java.lang.IllegalStateException。我读到 p:ajax 必须与更新一起使用,但我没有收到任何错误,只是没有任何反应。如果问你将如何处理这个问题并不多,我有点要求重写我的代码,对不起,如果它太多了。但我觉得我的做法全错了。
    猜你喜欢
    • 2012-11-28
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2017-02-22
    相关资源
    最近更新 更多