【问题标题】:<h:selectOneRadio> dynamic Value to Backing Bean<h:selectOneRadio> 支持 Bean 的动态值
【发布时间】:2013-05-29 06:38:53
【问题描述】:

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

           <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>

豆是:

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;
}

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

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

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

【问题讨论】:

  • 您是否将&lt;h:panelGrid /&gt; 放入&lt;h:form /&gt; 标记中?
  • 什么是bean作用域定义?你在哪里commandButton?您是否添加了h:form
  • Bean 作用域为@SessionScoped,动作命令按钮为&lt;p:commandButton actionListener="#{userLeaveBean.addAppliedLeave}" styleClass="apply_button" value="Create Leave" onclick="window.reload()"&gt; &lt;f:attribute name="userId" value="#{employee.name}"/&gt; &lt;f:attribute name="firstHalf" value="#{calendarBean.radioFirst}"/&gt; &lt;f:attribute name="secondHalf" value="#{calendarBean.radioSecond}"/&gt; &lt;/p:commandButton&gt;。代码在&lt;h:form&gt;tag
  • 您正在通过event.getComponent().getAttributes().get("firstHalf") 取回价值...?
  • 是的,它会返回值,但不会返回更改的值,只有默认值。

标签: jsf-2


【解决方案1】:

三件事

  1. 不要在此使用场景中使用会话范围。当您的用户在多个选项卡中打开同一页面时,这将完全出错。使用请求范围或视图范围。

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

  3. 离开窗口。重新加载。如果您需要在操作后刷新整个页面,请在 p:commandButton 上将 ajax 设置为 false 或使用 h:commandButton。

【讨论】:

    【解决方案2】:

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

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

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

    并根据这个修改你的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 的长度相同。

    阅读更多:

    【讨论】:

    • Injecting Managed Bean这个东西很有用,但是修改不起作用。 :(
    • @NGHCalendarBean的范围是什么?
    • @SessionScoped 中的CalendarBean
    • @NGH 我在 bean 中添加了一个缺失的函数,现在应该可以工作了(对不起,我第一次使用注入 :))
    • 它是java.lang.NullPointerException
    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2015-11-03
    相关资源
    最近更新 更多