相关疑难解决方法(0)

为什么JSF多次调用getter

假设我像这样指定一个outputText组件:

<h:outputText value="#{ManagedBean.someProperty}"/>
Run Code Online (Sandbox Code Playgroud)

如果我在someProperty调用getter for时打印一条日志消息并加载页面,那么注意每个请求多次调用getter是很容易的(在我的情况下发生了两次或三次):

DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
DEBUG 2010-01-18 23:31:40,104 (ManagedBean.java:13) - Getting some property
Run Code Online (Sandbox Code Playgroud)

如果someProperty计算的值很昂贵,这可能是一个问题.

我用Google搜索了一下,认为这是一个已知问题.一个解决方法是包括一个检查,看看它是否已经计算过:

private String someProperty;

public String getSomeProperty() {
    if (this.someProperty == null) {
        this.someProperty = this.calculatePropertyValue();
    }
    return this.someProperty;
}
Run Code Online (Sandbox Code Playgroud)

这个问题的主要问题是你得到大量的样板代码,更不用说你可能不需要的私有变量了.

这种方法有哪些替代方案?没有那么多不必要的代码,有没有办法实现这一目标?有没有办法阻止JSF以这种方式行事?

感谢您的输入!

getter performance jsf el

253
推荐指数
4
解决办法
9万
查看次数

JSF - 在ajax调用上传递参数 - 这段代码有什么问题?

当我进行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; }
}
Run Code Online (Sandbox Code Playgroud)

并且,当我执行ajax调用时,我需要(由于我想呈现不同的上下文的事实)页面参数.所以我做到了这一点:

// 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>
Run Code Online (Sandbox Code Playgroud)

但是,在应用请求阶段,页面仍然是"主页".它应该从请求中获取page-parameter,将其应用于Component树并呈现"articles"上下文.为什么不会发生?

干杯

ajax jsf facelets jsf-2

6
推荐指数
1
解决办法
1万
查看次数

如何在ajax请求中传递h:selectOneMenu中的更改值的其他参数?

我需要将一些参数(在我的示例中为id)传递给f:ajax listener方法,但我不知道如何.有人帮忙吗?

<h:form>
    <!-- need to pass id value -->
    <input type="hidden" name="id" id="id" value="#{id}"/>

    <h:selectOneMenu value="#{visibility}">
      <f:selectItems value="#{visibilities}" var="e" itemValue="#{e}" itemLabel="#{e.name}" />
      <f:ajax event="valueChange" render="@form" execute="@form" listener="#{bean.updateVisibility}" />         
    </h:selectOneMenu>
</h:form>
Run Code Online (Sandbox Code Playgroud)

豆:

class Bean {
    Integer id;

    public void setId() {
       this.id = id;
    }

    public void updateVisibility(AjaxBehaviorEvent event) { 
       // passed id
       log.debug(id);
    }
}
Run Code Online (Sandbox Code Playgroud)

java jsf jsf-2

5
推荐指数
2
解决办法
3万
查看次数

标签 统计

jsf ×3

jsf-2 ×2

ajax ×1

el ×1

facelets ×1

getter ×1

java ×1

performance ×1