【问题标题】:f:viewParam doesn't pass required parameter when new xmlns.jcp.org namespace is used使用新的 xmlns.jcp.org 命名空间时,f:viewParam 未传递必需的参数
【发布时间】:2013-09-02 06:24:26
【问题描述】:

我正在尝试使用带有 Java EE 7 XML 命名空间的 Glassfish 4.0 来测试下面的示例。

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <title>Title</title>
    </h:head>
    <h:body>
        <h:form>
             <ul>
                 <ui:repeat value="#{appLoad.movieList}" var="movie">
                    <li>
                        <h:link value="#{movie.title}" outcome="movie" includeViewParams="true">
                            <f:param name="id" value="#{movie.id}"/>
                        </h:link>
                    </li>
                </ui:repeat>
            </ul>
        </h:form>
    </h:body>
</html>

它链接到以下页面movie.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:f="http://xmlns.jcp.org/jsf/core">
    <h:head>
        <f:metadata>
            <f:viewParam name="id" value="#{appLoad.movieId}"/>
            <f:event listener="#{appLoad.movieDetail()}" type="preRenderView"/>
        </f:metadata>
    </h:head>
    <h:body>
        <h:form>
            <h:panelGrid columns="2">
                <h:panelGrid columns="1" width="400">
                    <h:panelGrid columns="1">
                        Title : <h:outputLabel value="#{appLoad.movie.title}"/>
                    </h:panelGrid>  
                </h:panelGrid> 
            </h:panelGrid>  
        </h:form>
    </h:body>
</html>

#{appLoad} 支持 bean 是

@ManagedBean
@RequestScoped
public class AppLoad {

    @EJB
    private MovieFacade movieFacade;
    private Movie movie = new Movie();
    private List<Movie> movieList;
    private int movieId;

    @PostConstruct
    public void movieDetail(){
        movieList = movieFacade.findAll();
        movie = movieFacade.find(movieId);
        System.out.println(movieId);
    }

    // Getters+setters.        
}

当索引页面运行时,链接被点击后,url 直接变成了

result.xhtml?id=8

但没有显示任何数据。它是空白的。我发现#{appLoad.movieId}null。也就是说&lt;f:viewParam&gt;没有设置这个请求参数。

我唯一的解决方法是将 XML 命名空间改回旧版本。

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core">

我猜我这里出了点问题。这个问题是如何引起的,我应该如何使用新的 XML 命名空间?

【问题讨论】:

    标签: jsf-2 xml-namespaces mojarra jsf-2.2 viewparams


    【解决方案1】:

    处理新的xmlns.jcp.org XML 命名空间的方式在 Mojarra 的第一个版本 2.2.0 和 2.2.1 中被破坏了。它已在Mojarra 2.2.2 中修复(注意:链接中的票证描述了不同的问题症状,但在幕后,它本质上是相同的原因)。建议升级到 Mojarra 2.2.2。 GlassFish 4.0 捆绑了 Mojarra 2.2.0。您可以从javaserverfaces.java.net 获取 JAR。您需要做的就是将 GlassFish 的 /modules 文件夹中的 javax.faces.jar 文件替换为较新的版本。

    顺便说一句,这种麻烦在 GlassFish 的第一个主要版本中并不罕见(大家都急于按时准备好)。我建议等到 GlassFish 4.0.1 或 4.1 发布后再使用 Java EE 7,以避免将来出现意外。请注意,Apache Tomcat 和 JBoss AS 等其他供应商会花时间发布稳定的 Java EE 7 容器。他们目前还没有生产就绪版本。

    另见:

    【讨论】:

    • @Bulusc。感谢您的澄清。
    • 按照答案中的说明升级到 Mojarra 2.2.2 解决了您的问题吗?
    • 抱歉耽搁了,时区时间晚了。升级到 Mojarra 2.2.2 工作。感谢您的时间和您所做的更正。由于我的声誉未达到 15,因此我无法对您的回答投赞成票。再次感谢您。
    • 不客气。当答案有助于理解和解决具体问题时,不要忘记将答案标记为已接受。另见How does accepting an answer work?
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2014-02-08
    • 2014-10-26
    相关资源
    最近更新 更多