JSF 1.2:valueChangeListener事件未返回新选择的值 [英] JSF 1.2: valueChangeListener event not returning newly selected value

查看:116
本文介绍了JSF 1.2:valueChangeListener事件未返回新选择的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个支持bean:

I have this backing 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是:

And the h:selectOneMenu is:

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

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

The above codes for the changePage() method do not return the new selected page value from the h:selectOneMenu. Instead, it returns the page value prior to submit. I don't understand why.

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

Can someone please help? Have been stuck on this for 2 days now.

推荐答案

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

Apparently you're doing a redirect instead of a forward, while the bean is request scoped. A redirect creates a new request, hereby garbaging all initial request scoped attributes, including request scoped beans. It will thus cause recreation of request scoped bean with all default properties. To solve this problem, remove the <redirect/> entry from the <navigation-case> entry in faces-config.xml, if any.

如果这是纯粹的页面到页面导航,我为此推荐另一种方法。摆脱 valueChangeListener ,将页面URL作为SelectItem值,并将 submit()替换为:

If this is for pure page-to-page navigation, I'd recommend another approach for this. Get rid of the valueChangeListener, have the page URL's as SelectItem values and replace submit() with:

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

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

You namely don't want to use POST for simple page-to-page navigation.

希望这会有所帮助。

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

as per the comments, you actually want datatable pagination and this dropdown must instantly go to page X of the datatable at the same JSF page? In this case, forget my answer above, it wasn't clear from your question and I didn't realize that you want datatable pagination.

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

The as far posted information and code looks fine. Have you debugged the code to see what happens with property values? Isn't it nulled out afterwards? Is the correct value returned during render? Does the dropdown list return the expected items during render? That kind of trivial things. Maybe something else which you didn't post about is colliding with this all.

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

Edit 2: I actually created an SSCCE to see if it really works and as I expected, it just works. Your problem lies somewhere else. Maybe a buggy Converter? Maybe it was actually a redirect?

MyBean(请求作用域):

MyBean (request scoped):

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

}

(顺便说一下,你用的是字符串而不是整数这对于数值来说是错误的类型,但在这里它可以正常使用字符串以及)

(by the way, you used String instead of Integer which is imho the wrong type for numerical values, but here it works fine with String as well)

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。

I used Mojarra 1.2_13 on Tomcat 6.0.20.

顺便说一句, valueChangeListener 完全是多余的。没有它,它工作得很好。 JSF只是在更新模型值阶段设置所选页面。

By the way, the valueChangeListener is entirely superfluous. It works as fine without it. JSF just sets the selected page during Update Model Values phase.

这篇关于JSF 1.2:valueChangeListener事件未返回新选择的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆