我进行ajax调用时需要将参数传递给bean。

我的豆子是这样的:

@ManagedBean
@RequestScoped
public class Selector {
    @ManagedProperty(value="#{param.page}")
    private String page;

    @PostConstruct
    public void init() {
        if(page==null || page.trim().isEmpty()) {
            this.page="homepage";
        }

        System.out.println(this.page);
    }

    public String getPage() { return page; }
    public void setPage(String page) { this.page=page; }
}


而且,当我执行ajax调用时,我需要(由于我想呈现不同的上下文)page参数。所以我做到了:

// in this moment selector.page = articles
<h:inputHidden value="#{selector.page}" id="page" />

<h:commandLink>
    <f:setPropertyActionListener target="#{articlesSelector.order}" value="1" />
    <f:ajax event="click" render=":articlesContent"/>
    <h:graphicImage value="img/arrow_up.png" alt="Arrow Up"/>
</h:commandLink>


但是,在“申请”请求阶段,页面仍为“主页”。它应该从请求中获取页面参数,将其应用于“组件”树并呈现“文章”上下文。为什么不发生?

干杯

最佳答案

因为<h:inputHidden>的值仅在更新模型值阶段设置。这确实是在JSF中存在很长时间的一种不直观的行为。我曾经报告过有关此问题,但是由于“设计使然”而被关闭。

有多种方法可以解决此问题,其中包括视图范围。在特定情况下,可以使用<f:param>代替<h:inputHidden>

<h:commandLink>
    <f:param name="page" value="#{selector.page}" />
    <f:setPropertyActionListener target="#{articlesSelector.order}" value="1" />
    <f:ajax event="click" render=":articlesContent"/>
    <h:graphicImage value="img/arrow_up.png" alt="Arrow Up"/>
</h:commandLink>


然后它将作为请求参数#{param.page}可用,因此在您的请求范围内的Bean中将其设置为@ManagedProperty

07-24 09:44
查看更多