从一个bean到另一个bean的托管属性

时间:2014-01-28 17:13:38

标签: jsf http-request-parameters managed-property

有人可以解释一下,为什么第一个代码有效而另一个没有?

工作:

<h:commandButton value="#{settingsBean.tmp}" action="editverteilerliste">
    <f:setPropertyActionListener target="#{settingsEditVerteilerlisteBean.aktuelleVerteilerliste}" value="#{settingsBean.tmp}" />
</h:commandButton>

不工作:

<p:commandLink action="editverteilerliste">
    <f:param name="aktuelleVerteilerliste" value="#{settingsBean.tmp}" />
    <h:outputText value="asdf"/>
</p:commandLink>

settingsBean.tmp是Verteilerliste的一个实例

Action editverteilerliste指向另一个使用settingsEditVerteilerlisteBean的页面:

@ManagedBean
@RequestScoped
public class settingsEditVerteilerlisteBean implements Serializable {

  private Logger logger = Logger.getLogger(settingsEditVerteilerlisteBean.class);

  public settingsEditVerteilerlisteBean() {
  }

  @PostConstruct
  public void init() {
    logger.info("Postconstructor invoked!");
  }

  @ManagedProperty(value = "#{aktuelleVerteilerliste}")
  private Verteilerliste aktuelleVerteilerliste;

  [Getter and Setter...]
}

第二页:

<h:body>
    <ui:composition template="../template/mainlayout.xhtml">
        <ui:define name="content">
            <h3>Verteilerliste <h:outputText value="#{settingsEditVerteilerlisteBean.aktuelleVerteilerliste.name}"/></h3>
        </ui:define>
    </ui:composition>
</h:body>

我知道我可以使用工作但我想知道为什么第二个不起作用!

1 个答案:

答案 0 :(得分:1)

第二个不起作用,因为您的托管属性绑定被解析为null,因为在任何JSF范围的映射中,aktuelleVerteilerliste键很可能没有元素。

要使第二个工作正常,您需要告诉JSF查看给定请求的参数,即更改为@ManagedProperty(value = "#{param['aktuelleVerteilerliste']}")

为了使区别更加清晰,<f:setPropertyActionListener>只是在调用JSF生命周期的应用程序阶段时将target对象等同于value,而后一种方法只是将特定参数添加到JSF组件,在您的情况下是命令组件,并且可以通过EL对象param访问命令组件参数,EL对象是当前请求参数的映射。


也就是说,您对命令链接的使用被认为是一种不好的做法。它们用于在提交表单以执行某些业务作业时调用某些服务器端逻辑。在您的情况下,您正在使用它们来执行简单导航。为此,您最好使用<h:link>组件来创建简单的a元素。这样,如果您附加参数,最终会得到editverteilerliste?aktuelleVerteilerliste=something之类的查询参数,您可以通过<f:viewParam>进入视图。这样,您最终会在应用程序中使用可收藏的URL和清晰的导航。