我是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。世界来自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再次不起作用。,即绑定到Bean失败。一旦我有了如何让JSF标记成功输出的提示,我希望得到关于我应该注意什么,以便让Bean绑定到JSF的提示。
更新:这似乎是同样的问题,类似的问题,但我的应用程序是在Eclipse与JBoss,而不是在Netbeans与GlassFish。因此,我添加了我的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>
您必须告诉服务器您的页面应该由web.xml
-文件中定义的JSF-Servlet加载。
如果我对您的示例理解正确,您应该有一个名为index.xhtml
的欢迎文件,它应该通过调用您的网站用JSF呈现给用户。
问题来了:
所有的页面都不会被JSF呈现,除非您将它们通过您定义的JSF- servlet。
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern> /* !important */
</servlet-mapping>
因此,您有两种(当然还有更多:))方法来告诉服务器用JSF-Servlet加载您的页面:
告诉您的欢迎文件加载JSF-Servlet
<welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> /* note the /faces/ prefix */ </welcome-file-list>
将
<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>
Netbeans+Glassfish和JBoss+eclipse之间应该没有任何区别,但您应该检查JSF库是否由服务器加载。
最后一点:
您正在通过faces-config.xml
配置bean,这将完成这项工作,但自JSF 2以来。X你可以通过注释在你的类中做同样的事情,例如
@ManagedBean
@SessionScoped
public class TestBean {
// your stuff here
}
对我来说这更容易读懂。
希望这对你有帮助,玩得开心!
编辑:
在你的评论之后,我测试了你的设置:没有问题!
起初,我得到了一个错误,因为<f:loadBundle basename="resources" var="msg" />
在我的设置中没有定义,但在删除这行之后,一切都很好。
然而,我在我的第一个列表项目中犯了一个小错别字,所以请再次检查。
您的html-skeleton看起来很好,在我的测试中也可以正常工作,所以也不应该有任何错误。
请检查以下内容:
- jsf库是由服务器还是应用程序加载的吗
- 在您的
web.xml
-file中是否有更多的servlet定义? - 详细的错误信息是什么
干杯!
我创建了一个新的动态Web项目,这次我添加了index.xhtml文件,使用"Blank Facelet Page"作为模板而不是"Common Facelet Page"。我将web.xml文件中的url模式更改为*.xhtml,它最终通过浏览器上的完整路径名(index.xhtml)或不工作。在"Common Facelet Page"上遵循相同的过程,我没有设法做到这一点。奇怪。
我还注意到,在选择"Common Facelet Page"并单击下一步之后,出现了一个库列表,用户可以选择检查其中的一些。我什么都没检查,也许我应该检查一下。