jsf-2 - f :viewParam doesn't pass required parameter when new xmlns. jcp.org 命名空间已使用

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

我尝试将 Glassfish 4.0 与 Java EE 7 XML 命名空间结合使用来测试下面的示例。

<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 。换句话说,<f:viewParam>不设置该请求参数。

我唯一的解决方法是将 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 命名空间?

最佳答案

新的 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 容器;他们目前还没有生产就绪的版本。

另请参阅:

关于jsf-2 - f :viewParam doesn't pass required parameter when new xmlns. jcp.org 命名空间已使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18517384/

相关文章:

ajax - 我如何使用 <p :fileUpload> with mode simple and ajax ="true"?

jsf-2 - 立即 ="true"导致更新 ="component"失败

python - 在 Python 中通过 ElementTree 解析 xml 时如何保留命名空间

android - 前 Lollipop 设备上的矢量可绘制对象无法正常工作

jsf - 如何使用自定义异常处理程序处理 javax.el.PropertyNotFoundException

java - 设置属性值而不在 JSF 页面上进行输入

php - 使用 SimpleXML 解析命名空间,而不管结构或命名空间

jsf - JSF 2.2 中的自定义 FaceletFactory/虚拟主机 facelets 的替代品

jsf - 如何在 Glassfish 4 (Netbeans/Maven) 中使用 Mojarra 的替代版本