【问题标题】:Default value for <tr:selectOneRadio> if the value is from database object如果值来自数据库对象,则为 <tr:selectOneRadio> 的默认值
【发布时间】:2018-09-25 10:56:45
【问题描述】:

我为此苦苦挣扎了很长时间。我正在更改代码,我需要将默认值设置为来自特立尼达的 selectOneRadio 元素。我有来自数据库的对象(例如称为 result)。该对象具有 decision 属性。在select元素中value参数是这样使用value="#{result.decision}"的。

现在我需要如果 result.decision 为空,则将值设置为 True。如果值为 False,则让/设置值为 False。如果值为 True,则让/设置值为 True。我在模板中尝试过这样的事情:

 <tr:selectOneRadio id="decision" value="#{viewBean.changeValueToOne(result)}" autoSubmit="true" immediate="true">
        <f:selectItem itemValue="true" itemLabel="Yes"/>
        <f:selectItem itemValue="false" itemLabel="No"/>
 </tr:selectOneRadio>

以及viewBean中的这个函数:

public Boolean changeValueToOne(ResultDTO result) {
    if (result.getDecision() == null) {
        result.setDecision(Boolean.TRUE);
    }
    return result.getDecision();
}

但是当我这样做时,我只得到一个字符串值而不是 selectOneRadio 元素。只有“是”或“否”值。

如何将 selectOneRadio 元素的默认值设置为对象中的值并获得正常的 selectOneRadio,而不仅仅是一个值。

编辑

这是来自模板的代码。决策是数据库中我需要更改值的对象:

<tr:selectOneRadio id="decisionYes" value="#{viewBean.defaultDecision}" valueChangeListener="#{viewBean.valueChangedOneRadioListener(decision)}"
                                           autoSubmit="true" immediate="true">
     <f:selectItems value="#viewBean.decisionStates}"/>
</tr:selectOneRadio>

这是一个来自 viewBean 的监听器方法:

public void valueChangedOneRadioListener(DecisionDTO decision, ValueChangeEvent event)
{
    if(event.getNewValue() != null) {
        if((Boolean)event.getNewValue().equals(Boolean.TRUE))
        {
            decision.setDecision(Boolean.TRUE);
        } else {   
            decision.setDecision(Boolean.FALSE);
        }
        // this is variable used in selectRadio
        this.setDefaultVyjadreni((Boolean)event.getNewValue());
    }
}

当我运行此代码时,由于找不到方法而出现错误。

javax.faces.event.AbortProcessingException: Method valueChangedOneRadioListener not found

【问题讨论】:

    标签: java jsf trinidad selectoneradio


    【解决方案1】:

    我为特立尼达 selectOneRadio 使用整数值。 您可以通过设置 yourValue 来设置默认值。 您使用 valueChangeListener 对更改事件做出反应。

    <tr:selectOneRadio
        id="maschineId"
        value="#{yourBean.yourIntValue}"
        valueChangeListener="#{yourValueChangeListener}"
        autoSubmit="true">
            <f:selectItem itemValue="1"/>
            <f:selectItem itemValue="0"/>
    </tr:selectOneRadio
    

    你的 backingBean 看起来像这样:

    public void yourValueChangeListener(ValueChangeEvent event)
    {
        if(event.getNewValue() == null)
            return;
    
        if((Integer)event.getNewValue() ==  1)
        {
            //react on a change to 1
        }
        if((Integer)event.getNewValue() ==  0)
        {
            //react on a change to 0
        }
    }
    public int getYourIntValue() {
        return yourIntValue;
    }
    
    public void setYourIntValue(int yourIntValue) {
        this.yourIntValue = yourIntValue;
    }
    

    【讨论】:

    • 感谢您的回答。我明白了,但如果值来自数据库对象,我不知道如何从 DTO 传递值。在此示例中,#{yourBean.yourIntValue} 是来自 bean 的值,而不是来自 DTO 类的数据库对象的值。
    • 我是否应该根据从对象返回的值创建将 myIntValue 返回到值的方法?
    • 是的,就是这样。关于你的第二条评论。您从数据库中检索所需的值并设置该值。可能在您的 bean 的构造函数中,该值将由 pageload 设置。如果您在页面加载后设置值并且您在使用浏览器重新加载后识别出值更改,您可能不得不摆弄 trinidads partialTriggers。这取决于您用于 backingBean(请求或会话)的范围。不知道这是否有很大帮助,但我知道的特立尼达的唯一资源:myfaces.apache.org/trinidad
    • 非常感谢,如果可行,我明天会尝试并写,因为我担心这不起作用并且只有字符串,而不是单选按钮。
    猜你喜欢
    • 2016-01-02
    • 2022-01-24
    • 2016-05-15
    • 2018-03-06
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多