【问题标题】:JSF tag is not working on *.xhtml but working *.jsp fileJSF 标记在 *.xhtml 上无效,但在 *.jsp 文件上有效
【发布时间】:2013-08-23 06:31:48
【问题描述】:

我正在尝试使用 JSF 2.2、Netbeans 7.3 和 GlassFish v2 运行简单的应用程序。

index.xhtml:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
       <b>Hello from Facelets</b>
       <h:form id="this">
           <h:outputText value="This is"/>
       </h:form>
    </h:body>
</html>

web.xml:

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>  
</web-app>

输出:



&lt;b&gt;Hello from Facelets&lt;/b&gt; 正常工作,但 &lt;h:outputText value="this is "/&gt; 不工作。这是如何引起的,我该如何解决?

我在这里搜索,发现以下问题:

但是,答案并没有解决我的问题。


更新:@Xtreme Biker,当我像你说的那样改变时,我得到了以下异常:

注意:如果我使用 *.jsp 而不是 *.xhtml 它可以工作。但是当我将我的index 文件扩展名为xhtml 时,它不起作用。

【问题讨论】:

    标签: jsf facelets jsf-2.2 glassfish-2.x


    【解决方案1】:

    更改您的 servlet 映射以使用 .xhtml 文件。似乎还没有转换标签。

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    

    【讨论】:

    • 但我遇到了异常,请查看我编辑的问题,我正在显示异常。
    • 显然您的欢迎文件没有被捕获。从 faces/index.xhtml 更改为 index.xhtml
    • 是的,当我替换您提供的代码时。之后我已经将faces/index.xhtml 更改为index.xhtml
    • 您的服务器中是否正确部署了 JSF 所需的 jar?这意味着 JSF-api 以及 JSF 实现(Mojarra、MyFaces)。你在使用 Maven 吗?
    • 我没有使用 maven。我使用了 Netbeans IDE 提供的 jar
    【解决方案2】:

    您正在使用 GlassFish v2,它是一个古老的 Java EE 5 容器,已经捆绑了 JSF 1.2。默认情况下,webapp 提供的 JSF忽略,本质上,您一直在运行 JSF 1.2。这就解释了为什么 JSP 可以正常工作。仅自 JSF 2.0 起才支持 Facelets。

    您有以下选择,具体取决于您的要求是能够使用 JSF 2.2,还是仅限于 GlassFish v2:

    1. 如果您受限于 GlassFish v2,那么您根本无法使用 JSF 2.2。 JSF 2.2 至少需要 Java EE 6 (GlassFish 3)。但是,您可以使用 JSF 2.0 或 2.1。您可以从here(当前为 2.1.25)下载最新的 JSF 2.1。删除/WEB-INF/lib 中的javax.faces.jar 并编辑/WEB-INF/sun-web.xml 以将以下条目添加到&lt;sun-web-app&gt;

      <class-loader delegate="false"/> 
      <property name="useBundledJsf" value="true" />
      

      这基本上会指示 GlassFish 更喜欢 webapp 捆绑的 JSF,而不是自己捆绑的 JSF。


    2. 如果您不限于 GlassFish v2 并且可以升级它,那么请尽快升级。 GlassFish v2 是 2006 年 5 月的古老容器,并于 2009 年 12 月由 GlassFish 3 (Java EE 6) 接替,而 GlassFish 4 (Java EE 7) 在 2013 年 5 月又由 GlassFish 4 (Java EE 7) 接替。

      GlassFish 3.0 捆绑 JSF 2.0 和 GlassFish 3.1 捆绑 JSF 2.1。但是两者都可以像 GlassFish v2 一样升级到 JSF 2.2,不同之处在于 sun-web.xml 已重命名为 glassfish-web.xml。另一种方法是简单地将 GlassFish 的 /modules 目录中的 jsf-api.jar+jsf-impl.jarjavax.faces.jar 替换为所需的版本。

      GlassFish 4.0 捆绑了 JSF 2.2,您无需手动提供任何 JAR。但是,我目前不建议使用 GlassFish 4.0。它太有问题了(就像 GlassFish 的每个第一个主要版本一样)。最好等待 4.0.1(如果它出来的话)或 4.1。


    3. 如果您受限于 GlassFish v2 并且无法以某种方式升级到 JSF 2.x,但您确实非常想使用 Facelets,那么您始终可以单独安装 Facelets 1.x。该过程在this docbook 中进行了描述。然而,虽然您拥有使用 Facelets 而不是 JSP 的优势,但坚持使用 JSF 1.x 是disavantageous。我真的不建议这样做。

    【讨论】:

      【解决方案3】:

      尝试替换这个,

      xmlns:h="http://java.sun.com/jsf/html"
      

      而不是

       xmlns:h="http://xmlns.jcp.org/jsf/html"
      

      【讨论】:

      • 我做了但什么也没发生
      • 你能发布完整的 index.xhtml 文件吗
      • @Kalathoki 您是否重新发布/重建/重新启动您的服务器?你得到哪个错误?
      • @noone 是的,先生。我重新启动了 glassfish 服务器和 netbeans,还关闭了浏览器。
      • @noone 先生,我没有收到错误,但&lt;h:outputText value="this is "/&gt; 代码不起作用。就这样。请看我的输出。当我运行我的应用程序时显示的。
      猜你喜欢
      • 1970-01-01
      • 2013-11-21
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多