0

你们谁能解释一下,为什么第一个代码有效而另一个无效?

在职的:

<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 的一个实例

操作 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>

我知道我只能使用工作的,但我想了解为什么第二个不起作用!

4

1 回答 1

1

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

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

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


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

于 2014-01-28T17:47:45.603 回答