虽然这是一个简单的问题。需要一个答案。 我写了一个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;
}
}
任何人都可以帮助解决这个问题。在输出时,我看到“虚假行为的价值 - 虚假”
答案 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
将为true
或false
。
注意我故意没有详细介绍immediate
属性的行为。如果您想了解它,您将需要花一些时间来尝试理解JSF生命周期阶段。事实上,当您深入了解JSF时,您需要对这些概念感到满意。 @johny和@Xtreme Biker都给了你一些很好的链接。我正在复制它们以防万一他们的评论被删除。