更新Bean for JSF中的操作

时间:2013-12-03 17:55:12

标签: jsf

虽然这是一个简单的问题。需要一个答案。 我写了一个jsp页面:

<body>
<f:view>
    <f:loadBundle basename="message" var="msg"/>
<h:form id="edit">

    <h:panelGroup>      
        <h:selectOneRadio id="CompletePublication" layout="pageDirection">
                <f:selectItem itemLabel="SUCCESS" itemValue="true"/>
                <f:selectItem itemLabel="FAILED" itemValue="false"/>
        </h:selectOneRadio>                         
     </h:panelGroup>
        <h:commandButton id="setAction" immediate="true" action="#{user.completePublication}" value="#{msg.Button_OK}"/>
        <h:commandButton id="cancel" immediate="true" action="#{user.cancelCompletePublish}" value="#{msg.Button_CANCEL}"/>
</h:form>
</f:view>               
</body>

需要在theBean:

下处理
public class User implements Serializable {

    private String name;
    private boolean action;

    public boolean getAction()
    {
        System.out.println("Get");
        return action;
    }
    public void setAction(boolean action)
    {
        this.action=action;
        System.out.println("Set");
    }
    public String completePublication(){
        if (action==true){
            System.out.println("Value of True Action - " + action);
            return "updated";
        }
        if (action==false){
            System.out.println("Value of False Action - " + action);
            return "notupdated";
        }
        return null;
    }
    public String cancelCompletePublish()
    {
        System.out.println("Hi");
        return null;
    }

}

任何人都可以帮助解决这个问题。在输出时,我看到“虚假行为的价值 - 虚假”

1 个答案:

答案 0 :(得分:1)

<h:selectOneRadio>中,在提交表单时,您没有将所选选项的值传递回bean。因此,action变量永远不会更新。假设您在页面中将托管bean称为user,则需要通过添加value属性来修改该组件。因此,改变

<h:selectOneRadio id="CompletePublication" layout="pageDirection">

<h:selectOneRadio id="CompletePublication" value="#{user.action}" layout="pageDirection">

有关<h:selectOneRadio>的更多信息,请参阅this link。另外,正如@Xtreme Biker所提到的,您需要了解immediate="true"在应用于特定组件时的作用。对于 您的 情况,当用户点击<h:commandButton>中的任何一个时,将跳过更新模型阶段(以及其他阶段)。换句话说,当用户选择action然后点击true(第一个)按钮时,SUCCESS将永远不会设置为OK。这就是你总是在输出中看到Value of False Action - False的原因。要解决此问题,只需删除第一个immediate中的<h:commandButton>属性,如此

<h:commandButton id="setAction" action="#{user.completePublication}" value="#{msg.Button_OK}"/>

删除该属性后,请在completePublication方法

中进行以下更改
public String completePublication(){
    if (action){
        System.out.println("Value of True Action - " + action);
        return "updated";
    }
    else {
        System.out.println("Value of False Action - " + action);
        return "notupdated";
    }
}

无需返回null,因为action将为truefalse

注意我故意没有详细介绍immediate属性的行为。如果您想了解它,您将需要花一些时间来尝试理解JSF生命周期阶段。事实上,当您深入了解JSF时,您需要对这些概念感到满意。 @johny和@Xtreme Biker都给了你一些很好的链接。我正在复制它们以防万一他们的评论被删除。

Debug JSF Lifecycle

Doubt on immediate attribute for command button