【问题标题】:Cannot get Jsf tag outputText appear无法获取 Jsf 标签 outputText 出现
【发布时间】:2013-03-04 11:13:48
【问题描述】:

我是 JSF 和 EJB 应用程序的新手,因此即使在简单的 JavaEE 应用程序中我也会遇到问题。我正在使用 JBoss 在 eclipse 中创建一个简单的 JavaEE 应用程序,目标只是尝试 JSF 的一些标签并将它们绑定到 Java Bean。我无法找出为什么以下 JSf 代码没有在输出页面上显示任何内容:

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

    <f:loadBundle basename="resources" var="msg" />
    <head>
    <title><ui:insert name="pageTitle">Page Title</ui:insert></title>
    <style type="text/css">

    </style>
    </head>

<body bgcolor="#ffffff">
<h:body>
<h:outputText value="#{hello.world}" />
<h:outputText value="TTT" />
</h:body>   
</body>

</html>  

不仅 hello.world 的值来自 Bean,而且简单的文本“TTT”也不会出现。 Bean的代码是:

@ManagedBean
public class Hello  {

final String world = "World";

/**
 * Default constructor. 
 */
public Hello() {
}

public String getWorld(){
    return "Hello" + world;
}

} 

facelets-config.xml 文件是:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xi="http://www.w3.org/2001/XInclude"
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-facesconfig_2_1.xsd">
 <managed-bean>
  <managed-bean-name>hello</managed-bean-name>
  <managed-bean-class>com.al.jsftest.Hello</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>

</faces-config>

当我尝试使用纯文本标记时,它会出现在屏幕上,但它不能再次与 #{hello.world} 一起使用,即绑定到 Bean 失败。一旦我有提示如何让 JSF 标记成功输出,我会很感激关于我应该注意什么的提示,以便让 Bean 绑定到 JSF?

更新: similar question 似乎是同样的问题,但我的应用程序是在带有 JBoss 的 Eclipse 中,而不是在带有 GlassFish 的 Netbeans 中。因此,我添加了我的 web.xml 文件,可能需要对其进行修改,但我仍然无法弄清楚。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee /web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 <display-name>JsfTest</display-name>
  <welcome-file-list>
   <welcome-file>index.xhtml</welcome-file>
  </welcome-file-list>
  <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>

【问题讨论】:

    标签: jsf jakarta-ee jboss javabeans


    【解决方案1】:

    您必须告诉服务器您的页面应该由您的 web.xml-file 中定义的 JSF-Servlet 加载。
    如果我理解您的示例正确,您有一个名为 index.xhtml 的欢迎文件,应该通过调用您的网站将其呈现给 JSF 用户。

    有问题:
    您的所有页面都不会由 JSF 呈现,除非您“让它们通过”您定义的 JSF-Servlet。

    您的 servlet 定义应如下所示:

    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern> /* !important */
    </servlet-mapping>
    

    因此,您有两种(当然还有更多:))方法来告诉服务器使用 JSF-Servlet 加载您的页面:

    1. 告诉你的欢迎文件被 JSF-Servlet 加载

      <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file> /* note the /faces/ prefix */
      </welcome-file-list>
      
    2. servlet-mapping 中扩展您的&lt;url-pattern&gt;

      <servlet-mapping>  
          <servlet-name>Faces Servlet</servlet-name>
          <url-pattern>/faces/*</url-pattern>
          <url-pattern>*.xhtml</url-pattern>  /*tell JSF to render all pages with xhtml-extension*/
      </servlet-mapping>
      

    Netbeans+Glassfish 和 JBoss+eclipse 之间应该没有任何区别,但是您应该检查 JSF 库是否由服务器加载。

    最后一点:
    您正在通过faces-config.xml 配置您的 Bean,这样就可以完成这项工作,但是从 JSF 2.x 开始,您可以通过 annotations 在类中执行相同的操作,例如

    @ManagedBean
    @SessionScoped  
    public class TestBean {
      // your stuff here
    }
    

    对我来说,这更容易且更具可读性。

    希望这有帮助,玩得开心!

    编辑:
    在您的 cmets 之后,我测试了您的设置:没有错!
    起初我遇到了一个错误,因为&lt;f:loadBundle basename="resources" var="msg" /&gt; 没有在我的设置中定义,但在删除此行后一切正常。

    不过,我在第一个列表项中出现了一个小错字,因此请再次检查。
    您的 xhtml-skeleton 对我来说看起来不错,并且在我的测试中有效,所以也不应该有任何问题。

    请检查以下内容:

    1. JSF 库是由服务器还是您的应用程序加载的
    2. 在您的web.xml-file 中是否已定义了 Servlet
    3. 详细的错误信息是什么

    干杯!

    【讨论】:

    • 我在 web.xml 文件中包含了 servlet 映射。它只是在输出中不明显(页面没有将其视为代码)。我将欢迎文件更改为 /faces/index.xhtml 但不幸的是它没有任何效果。 Outputtext -label 等未呈现。当我添加到 servlet 映射 *.xhtml 时出现错误。
    • 这个错误不是来自 *.xhtml,而是 Jsf 标签没有呈现。难道是因为我在创建文件时选择了“Common Facelet Page”作为模板?
    • 更新了我的答案。如果错误仍然存​​在,请发布详细信息。
    【解决方案2】:

    我创建了一个新的动态 Web 项目,这次我添加了 index.xhtml 文件,使用“空白 Facelet 页面”作为模板而不是“通用 Facelet 页面”。我将 web.xml 文件中的 url 模式更改为 *.xhtml,它最终可以通过浏览器上的完整路径名 (\index.xhtml) 工作,也可以不工作。按照与“Common Facelet Page”相同的过程,我没能成功。奇怪。

    我还注意到,在选择“Common Facelet Page”并单击下一步后,会出现一个库列表,用户可以选择检查其中的一些。我没有检查任何东西,也许我应该检查。

    【讨论】:

    • 当您确定这些库已经包含在服务器端时,您无需在项目创建对话框中检查这些库!很高兴听到它终于为你解决了!干杯。
    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 2012-04-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 2012-12-01
    • 2012-03-07
    相关资源
    最近更新 更多