2

我有这个支持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天。

4

1 回答 1

3

显然,您正在执行重定向而不是转发,而 bean 是请求范围的。重定向创建一个请求,从而垃圾所有初始请求范围的属性,包括请求范围的 bean。因此,它将导致重新创建具有所有默认属性的请求范围 bean。要解决此问题,请<redirect/>从 中的<navigation-case>条目中删除该条目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<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的不是Integerwhich is imho 错误的数值类型,但在这里它也可以正常工作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阶段设置选定的页面。

于 2009-12-07T18:03:31.657 回答