【问题标题】:f:viewAction does not invoke action methodf:viewAction 不调用动作方法
【发布时间】:2014-03-10 21:26:51
【问题描述】:

我无法让带有 f:viewAction 标记的操作方法起作用。

这是 jsf 页面:

<ui:composition xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
    <ui:repeat var="genreType" value="#{navigation.genreTypeList}">
        <f:metadata>
            <f:viewParam name="nameEn" value="#{genreType.name_en}" required="true" />
            <f:viewAction action="#{search.searchByGenreType}" />
        </f:metadata>
        <h:link value="#{genreType.name_de}" outcome="index" includeViewParams="true" /><br />
    </ui:repeat>
</ui:composition>

它会产生这样的链接:

[...]/index.jsf;jsessionid=635562E66C7F2FA54504B53D5DAA114C?nameEn=fiction

这是豆子:

@ManagedBean
@RequestScoped
public class Search implements Serializable {

    private static final long serialVersionUID = -5193732222381183093L;

    private String nameEn;

    public String getNameEn() {
        return this.nameEn;
    }

    public void setNameEn(String nameEn) {
        this.nameEn = nameEn;
    }

    // action methods
    public String searchByGenreType() {
        System.out.println("searchByGenreType");
        return "index";
    }
}

我在 Tomcat 7.0.42 中使用 JSF 2.2.5,IDE 是 Eclipse Kepler (4.3.1)。 我尝试了不同的变体(bean 中的@PostConstruct,faces-config.xml 中的显式导航,新旧命名空间)。

命名空间应该没有问题,因为这个问题自 JSF 2.2.5 起已修复。

【问题讨论】:

  • 如果您在ui:repeat 之外使用f:metadata 会发生什么情况?
  • 代码首先没有任何意义。 &lt;ui:repeat&gt;&lt;f:metadata&gt; 嗯?具体的功能需求是什么?也许您将&lt;f:viewParam&gt;&lt;f:param&gt; 混淆了?
  • @BalusC:jsf 页面通过 ui:include 包含在模板中。现在我知道它不会那样工作。这个想法是遍历genreTypeList,所以我得到一个链接列表。每个链接都应该能够调用 action 方法。
  • 好的,我发布了答案。

标签: eclipse jsf jsf-2 jsf-2.2


【解决方案1】:

这段代码没有任何意义。您似乎将&lt;f:viewParam&gt;&lt;f:param&gt; 混淆了。您需要&lt;f:param&gt; 将HTTP 请求参数添加到链接。 &lt;f:viewParam&gt; 用于将传入的 HTTP 请求参数设置为 bean 属性。

鉴于具有参数链接列表的具体功能要求,这些参数又应在目标页面上将参数设置为 bean 属性并调用 bean 操作,以下是您应该如何实现它:

带有链接列表的源页面:

<ui:repeat var="genreType" value="#{navigation.genreTypeList}">
    <h:link value="#{genreType.name_de}" outcome="index">
        <f:param name="nameEn" value="#{genreType.name_en}" />
    </h:link>
    <br />
</ui:repeat>

在目标页面中,显然是index.xhtml,将其放在顶部某处,就在&lt;h:head&gt;之前:

<f:metadata>
    <f:viewParam name="nameEn" value="#{search.nameEn}" required="true" />
    <f:viewAction action="#{search.searchByGenreType}" />
</f:metadata>

searchByGenreType() 方法中,您可以直接访问nameEn 属性。

另见:

【讨论】:

  • 谢谢。现在它起作用了。问题确实是对上述标签和我使用的模板结构的混淆。
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 2016-06-17
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多