<h:selectoneradio>动态值为Backing Bean </h:selectoneradio>

时间:2013-05-29 06:38:54

标签: jsf-2

我编写了一段代码,将两对单选按钮放在JSF2.0,Jboss As 7.1.1 final和JDK 6.0,PrimeFaces 3.4.2中构建的JSF项目的* .xhtml页面中。

           <h:panelGrid columns="2">
                <h:selectOneRadio value="#{calendarBean.radioFirst}">
                    <f:selectItem id="morning" itemValue="morning" itemLabel="Morning"/>
                    <f:selectItem id="afternoon" itemValue="afternoon" itemLabel="Afternoon"/>
                </h:selectOneRadio>
                <h:selectOneRadio style="padding-left: 170px" value="#{calendarBean.radioSecond}">
                    <f:selectItem id="noon" itemValue="noon" itemLabel="Noon"/>
                    <f:selectItem id="endofday" itemValue="endofday" itemLabel="End Of Day"/>
                </h:selectOneRadio>
            </h:panelGrid>

The Bean是:

private String radioFirst="morning";
private String radioSecond="endofday";

public String getRadioFirst() {
    return radioFirst;
}

public void setRadioFirst(String radioFirst) {
    this.radioFirst = radioFirst;
}

public String getRadioSecond() {
    return radioSecond;
}

public void setRadioSecond(String radioSecond) {
    this.radioSecond = radioSecond;
}

我已经编写了一个方法来调用Action事件,我想要选中单选按钮的值。当方法调用时,我得到单选按钮的值为“morning”和“endofday”,因为这两个是bean变量的初始值。

private String radioFirst="morning";
private String radioSecond="endofday";

但是,如果我更改单选按钮选项,我不会获得更新的值,它是相同的旧初始值。如何获得更改的值?请帮忙!

2 个答案:

答案 0 :(得分:0)

三件事

  1. 请勿将会话范围用于此使用方案。当您的用户在多个标签页中打开同一页面时,这将完全出错。使用请求范围或查看范围。

  2. 使用常规操作而不是动作侦听器,并且不要将单选按钮值作为属性提供。这毫无意义。 selectOneRadio组件将在您的辅助bean上设置更新的值。调用操作方法时,您可以通过bean的实例字段访问这些值。

  3. 忽略window.reload。如果在操作后需要刷新整页,请在p:commandButton上将ajax设置为false或使用h:commandButton。

答案 1 :(得分:0)

您应该像这样修改您的操作按钮:

<p:commandButton actionListener="#{userLeaveBean.addAppliedLeave}" styleClass="apply_button" value="Create Leave">
    <f:attribute name="userId" value="#{employee.name}"/>
</p:commandButton>

正如@MikeBraun建议的那样,删除window.reload()。如果您想要刷新某些内容,可以使用update中的p:commandButton属性来完成。

根据这个修改你的bean:

@ManagedBean
@SessionScoped // Could probably be moved to @RequestScoped or @ViewScoped
public class UserLeaveBean
{
    @ManagedProperty(value="#{calendarBean}")
    CalendarBean calendarBean;

    public void setCalendarBean(CalendarBean calendarBean)
    {
        this.calendarBean = calendarBean;
    }

    public void addAppliedLeave(ActionEvent event)
    {
        System.out.println("Radio 1 : " + calendarBean.getRadioFirst());
        System.out.println("Radio 2 : " + calendarBean.getRadioSecond());
    }
}

ManagedProperty将通过将其注入当前bean中来获取其他bean。使用正确的范围,可能您使用的是SessionScoped,因为您使用的是window.reload()

重要提示: ManagedProperty bean的长度必须至少与其他bean的长度相同。

了解详情: