f:viewAction不调用action方法

时间:2014-02-12 13:52:12

标签: eclipse jsf jsf-2 jsf-2.2

我无法使用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 =小说

这是豆子:

@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以来修复的。

1 个答案:

答案 0 :(得分:2)

这段代码没有任何意义。您似乎将<f:viewParam><f:param>混为一谈。您需要<f:param>将HTTP请求参数添加到链接。 <f:viewParam>用于将传入的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,将其置于顶部,就在<h:head>之前:

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

searchByGenreType()方法中,您可以直接访问该nameEn媒体资源。

另见: