我有这个支持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天了。
答案 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
阶段设置所选页面。