JSF 1.2:valueChangeListener事件未返回新选择的值

时间:2009-12-07 17:04:35

标签: java jsf valuechangelistener

我有这个支持bean:

public class PageBean 
{
    private List<SelectItem> selectPages;
    private List<SelectItem> selectRowsPerPage;
    private String selectedPage;
    private String selectedRowsPerPage;
    private int pages = 0;

// getter methods
public boolean getRender()
{
    boolean rendered = pages > 0? true: false;
    return rendered;
}   

public List<SelectItem> getSelectPages() 
{
    int value = 0;

    selectPages = new ArrayList<SelectItem>();
    for (int i = 1; i < (pages + 1); i++) 
    {
        if (i > 1) { value = i * 10; }
        selectPages.add(new SelectItem(Integer.toString(value), Integer.toString(i)));
    }   

    return selectPages;
}

public String getSelectedPage()
{
    if (selectedPage == null) {
        selectedPage = "1";
    }

    return selectedPage;
}

// setter methods
public void setSelectPages(List<SelectItem> selectPages) {
    this.selectPages = selectPages;
}  

public void setSelectedPage(String selectedPage) {
    this.selectedPage = selectedPage;
}    

// action methods
public void changePage(ValueChangeEvent event)
{
    PhaseId phase = event.getPhaseId();

    if (phase.equals(PhaseId.INVOKE_APPLICATION)) {
        System.out.println((String) event.getNewValue());
        setSelectedPage((String) event.getNewValue());
        FacesContext.getCurrentInstance().renderResponse();
    } else {
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
    } 
}    
}

h:selectOneMenu是:

<h:selectOneMenu id="page" value="#{pageBean.selectedPage}"
   valueChangeListener="#{pageBean.changePage}" onchange="submit()">
   <f:selectItems value="#{pageBean.selectPages}" />
</h:selectOneMenu>

changePage()方法的上述代码不会从h:selectOneMenu返回新选择的页面值。相反,它会在提交之前返回页面值。我不明白为什么。

有人可以帮忙吗?已经坚持了2天了。

1 个答案:

答案 0 :(得分:3)

显然你正在进行重定向而不是转发,而bean是请求作用域。重定向会创建请求,因此会包含所有初始请求范围的属性,包括请求范围的bean。因此,它将导致使用所有默认属性重新创建请求范围的bean。要解决此问题,请从<redirect/>中的<navigation-case>条目中删除faces-config.xml条目,如果有的话。

如果这是纯粹的页面到页面导航,我建议采用另一种方法。摆脱valueChangeListener,将页面网址设为SelectItem值,并将submit()替换为:

onchange="window.location=this.options[this.selectedIndex].value"

您不希望使用POST进行简单的页面到页面导航。

希望这有帮助。

编辑:根据评论,你真的想要数据表分页,这个下拉列表必须立即转到同一个JSF页面的数据表的第X页?在这种情况下,忘记上面的答案,从你的问题中不清楚,我没有意识到你想要数据表分页。

到目前为止发布的信息和代码看起来很好。您是否调试过代码以查看属性值会发生什么?事后不是没有消失吗?渲染期间返回的值是否正确?下拉列表是否在渲染期间返回预期的项目?那种琐碎的事情。也许你没有发布的其他内容正在与这一切相冲突。

编辑2:我实际创建了一个SSCCE,看看它是否真的有效,而且正如我预期的那样,它才有效。你的问题出在其他地方。也许是一辆越野车Converter?也许实际上是重定向?

MyBean(请求作用域):

public class MyBean {

    private Integer page;
    private List<SelectItem> pages = new ArrayList<SelectItem>();

    public MyBean() {
        for (int i = 1; i <= 10; i++) {
            pages.add(new SelectItem((i == 1) ? i : (i * 10)));
        }
    }

    public void changePage(ValueChangeEvent event) {
        if (event.getPhaseId() == PhaseId.INVOKE_APPLICATION) {
            setPage((Integer) event.getNewValue());
        } else {
            event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            event.queue();
        }
    }

    public Integer getPage() {
        return page;
    }

    public List<SelectItem> getPages() {
        return pages;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

}

(顺便说一下,您使用的是String而不是Integer,这对于数值来说是错误的类型,但这里它也适用于String

JSF页面:

<h:form>
    <h:selectOneMenu value="#{myBean.page}" onchange="submit()"
        valueChangeListener="#{myBean.changePage}">
        <f:selectItems value="#{myBean.pages}" />
    </h:selectOneMenu>
</h:form>

我在Tomcat 6.0.20上使用了Mojarra 1.2_13。

顺便说一句,valueChangeListener完全是多余的。没有它,它可以正常工作。 JSF只在Update Model Values阶段设置所选页面。