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

我有这个支持bean:

public class PageBean { private List selectPages; private List 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 getSelectPages() { int value = 0; selectPages = new ArrayList(); for (int i = 1; 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 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是:

    

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

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

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

如果这是纯粹的页面到页面导航,我建议另一种方法。 摆脱valueChangeListener ,将页面URL作为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 pages = new ArrayList(); 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 getPages() { return pages; } public void setPage(Integer page) { this.page = page; } } 

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

JSF页面:

      

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

顺便说一下, valueChangeListener完全是多余的。 没有它,它工作得很好。 JSF只是在Update Model Values阶段设置所选页面。