我尝试将 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/