无法获取Jsf标记outputText出现

时间:2013-03-04 11:13:49

标签: jsf java-ee jboss javabeans

我是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>  

不仅值来自形式Bean的hello.world,而且简单的文本“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似乎是同一个问题,但我的应用程序在Eclipse中使用JBoss,而不是在使用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>

2 个答案:

答案 0 :(得分:1)

您必须告诉服务器您的页面应该由web.xml - 文件中定义的JSF-Servlet加载。
如果我理解你的样本,你有一个名为index.xhtml的欢迎文件,应该通过调用你的网站向用户提供JSF。

有问题:
除非您'通过'定义的JSF-Servlet,否则JSF将不会呈现您的所有页面。

您的servlet定义应如下所示:

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

因此,您有两个(确实有更多:) :)告诉服务器使用JSF-Servlet加载页面的方法:

  1. 告诉您的welcome文件加载JSF-Servlet

    <welcome-file-list>
      <welcome-file>faces/index.xhtml</welcome-file> /* note the /faces/ prefix */
    </welcome-file-list>
    
  2. <url-pattern>

    中扩展您的servlet-mapping
    <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>
    
  3. 在Netbeans + Glassfish和JBoss + eclipse之间不应该有任何区别,但你应该检查服务器是否加载了JSF库。

    最后一点:
    你正在通过faces-config.xml来配置你的Beans,这将完成这项工作,但是从JSF 2.x开始,你可以通过 annotations 在你的课程中做同样的事情,例如:

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

    对我而言,这更容易,更易读。

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

    修改
    在您发表评论后,我已经测试了您的设置:没有错! 起初我有一个错误,因为<f:loadBundle basename="resources" var="msg" />没有在我的设置中定义但删除此行后一切正常。

    尽管如此,我在第一个列表项中输了一个小错误,所以请再次检查。
    你的xhtml骨架对我来说很好,并且在我的测试中工作,所以也不应该有任何错误。

    请检查以下内容:

    1. JSF库是由服务器还是应用程序加载的
    2. 您的web.xml - 文件
    3. 中是否已定义Servlet
    4. 详细错误消息是什么
    5. 干杯!

答案 1 :(得分:0)

我创建了一个新的动态Web项目,我使用“Blank Facelet Page”作为模板而不是“Common Facelet Page”添加了这个时间index.xhtml文件。我将web.xml文件中的url-pattern更改为* .xhtml,它最终通过浏览器上的完整路径名(\ index.xhtml)工作。使用“Common Facelet Page”进行相同的处理后,我无法完成这项工作。奇怪。

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