2012-01-14 276 views
2

我是一个开始的Java EE程序员,他遇到了麻烦,我创建了第一个启用了“JSF 2.0”的应用程序。我使用了以下技术:JSF 2.0没有渲染任何页面

  • jdk1.6.0_24
  • MyEclipse的10.0
  • Glassfish的3.0.1
  • JSF 2.0

问题:我找不到一种让我的服务器解析并呈现JSF 2.0页面的方法。我遵循各种指南,(特别是从stackoverflow.com)没有成功。我的测试页面不是由Glassfish 3.0.1呈现的。我尝试不同的方法来解决我的代码包括:

1 - >的web.xml

1.1 - >编辑报头指定JFS 2.0 HTML标签库属性(..)

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" 
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_3_0.xsd"> 

1.2 - 定义的JSF servlet和其他东西

<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 

    <context-param> 
    <param-name>com.sun.faces.expressionFactory</param-name> 
    <param-value>com.sun.el.ExpressionFactoryImpl</param-value> 
    </context-param> 

    <context-param> 
    <param-name>javax.faces.PROJECT_STAGE</param-name> 
    <param-value>Development</param-value> 
    </context-param> 

    <context-param> 
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
    <param-value>.xhtml</param-value> 
</context-param> 

<context-param> 
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name> 
    <param-value>true</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>/register.xhtml</url-pattern> 
    </servlet-mapping> 

2 - >已验证多次,以检查使用的请求URL是否与FacesServlet的url-pattern匹配。

**Target page** (url was not typed in browser . . .): register.xhtml 

    **URL Pattern:** 

    <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>/register.xhtml</url-pattern> 
    </servlet-mapping> 

3 - >主页

3.1.1 - >包含的头指定JFS 2.0 HTML标签库属性(..)

<!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://java.sun.com/jsf/html" 

xmlns:f="http://java.sun.com/jsf/core"> 

4 -库&依赖关系

使用Maven 2.0支持启动我的项目。这是我的pom.xml文件:

<?xml version="1.0"?> 
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd" 
xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>JSF2.0_Template_1</groupId> 
    <artifactId>JSF2.0_Template_1</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <name></name> 
    <description></description> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 


<dependency> 
    <groupId>com.sun.el</groupId> 
    <artifactId>el-ri</artifactId> 
    <version>1.0</version> 
</dependency> 

<dependency>  
    <groupId>org.glassfish</groupId> 
    <artifactId>bean-validator</artifactId> 
    <version>3.0-JBoss-4.0.2</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.annotation</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.ejb</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.enterprise.deploy</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.jms</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.management.j2ee</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.eclipse.persistence</groupId> 
    <artifactId>javax.persistence</artifactId> 
    <version>2.0.0</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.resource</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.security.auth.message</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.security.jacc</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.servlet</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.servlet.jsp</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.servlet.jsp.jstl</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.transaction</artifactId> 
    <version>3.0.1</version> 
</dependency> 

<dependency> 
    <groupId>javax.xml.bind</groupId> 
    <artifactId>jaxb-api-osgi</artifactId> 
    <version>2.2.1</version> 
</dependency> 

<dependency> 
    <groupId>javax.ws.rs</groupId> 
    <artifactId>jsr311-api</artifactId> 
    <version>1.1.1</version> 
</dependency> 

<dependency> 
    <groupId>org.glassfish.web</groupId> 
    <artifactId>jstl-impl</artifactId> 
    <version>1.2</version> 
</dependency> 

<dependency> 
    <groupId>javax.mail</groupId> 
    <artifactId>mail</artifactId> 
    <version>1.4.3</version> 
</dependency> 

<dependency> 
    <groupId>javax.xml</groupId> 
    <artifactId>webservices-api-osgi</artifactId> 
    <version>2.0.1</version> 
</dependency> 

<dependency> 
    <groupId>org.jboss.weld</groupId> 
    <artifactId>weld-osgi-bundle</artifactId> 
    <version>1.0.1-SP3</version> 
</dependency> 

<dependency> 
    <groupId>com.sun.faces</groupId> 
    <artifactId>jsf-api</artifactId> 
    <version>2.0.3</version> 
</dependency> 

<dependency> 
    <groupId>com.sun.faces</groupId> 
    <artifactId>jsf-impl</artifactId> 
    <version>2.0.3</version> 
</dependency> 

    </dependencies> 


    <build> 
    <plugins> 

    <plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    </plugin> 

    <plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
    </configuration> 
    </plugin> 

</plugins> 

    </build> 
</project> 

5 - Glassfish的结果

5.1 - HTML JSF 2.0代码:

<!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://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core"> 

<h:head> 
    <title>A Simple JavaServer Faces Registration Application</title> 
</h:head> 
<h:body> 
    <h:form> 
    <h2>JSF Registration App</h2> 
    <h4>Registration Form</h4> 
    <table> 
     <tr> 
     <td>First Name:</td> 
     <td> 
      <h:inputText label="First Name" 
        id="fname" value="#{userBean.firstName}" 
         required="true"/> 
      <h:message for="fname" /> 
     </td> 
     </tr> 
     <tr> 
     <td>Last Name:</td> 
     <td> 
     <h:inputText label="Last Name" 
        id="lname" value="#{userBean.lastName}" 
        required="true"/> 
      <h:message for="lname" /> 
     </td> 
     </tr> 
     <tr> 
     <td>Sex:</td> 
     <td> 
      <h:selectOneRadio label="Sex" 
          id="sex" value="#{userBean.sex}" required="true"> 
      <f:selectItem itemLabel="Male" itemValue="male" /> 
      <f:selectItem itemLabel="Female" itemValue="female" /> 
      </h:selectOneRadio> 
      <h:message for="sex" /> 
     </td> 
     </tr> 
     <tr> 
     <td>Date of Birth:</td> 
     <td> 
      <h:inputText label="Date of Birth" 
        id="dob" value="#{userBean.dob}" required="true"> 
      <f:convertDateTime pattern="MM-dd-yy" /> 
      </h:inputText> (mm-dd-yy) 
      <h:message for="dob" /> 
     </td> 
     </tr> 
     <tr> 
     <td>Email Address:</td> 
     <td> 
      <h:inputText label="Email Address" 
        id="email" value="#{userBean.email}" required="true" 
        validator="#{userBean.validateEmail}"/> 
      <h:message for="email" /> 
     </td> 
     </tr> 
     <tr> 
     <td>Service Level:</td> 
     <td> 
      <h:selectOneMenu label="Service Level" 
         value="#{userBean.serviceLevel}"> 
      <f:selectItem itemLabel="Medium" itemValue="medium" /> 
      <f:selectItem itemLabel="Basic" itemValue="basic" /> 
      <f:selectItem itemLabel="Premium" itemValue="premium" /> 
      </h:selectOneMenu> 
     </td> 
     </tr> 
    </table> 
    <p><h:commandButton value="Register" action="confirm" /></p> 
    </h:form> 
</h:body> 
</html> 

5.2 -页面的HTML被显示浏览器:

<!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"><head> 
    <title>A Simple JavaServer Faces Registration Application</title></head><body> 
<form id="j_idt6" name="j_idt6" method="post" action="/JSF2.0_Template/faces/register.xhtml;jsessionid=db8f214e61a90013726b072f83eb" enctype="application/x-www-form- urlencoded"> 
<input type="hidden" name="j_idt6" value="j_idt6" /> 

    <h2>JSF Registration App</h2> 
    <h4>Registration Form</h4> 
    <table> 
     <tr> 
     <td>First Name:</td> 
     <td><input id="j_idt6:fname" type="text" name="j_idt6:fname" /> 
     </td> 
     </tr> 
      <tr> 
     <td>Last Name:</td> 
     <td><input id="j_idt6:lname" type="text" name="j_idt6:lname" /> 
     </td> 
     </tr> 
     <tr> 
     <td>Sex:</td> 
     <td><table id="j_idt6:sex"> 
    <tr> 
<td> 
<input type="radio" name="j_idt6:sex" id="j_idt6:sex:0" value="male" /><label  for="j_idt6:sex:0"> Male</label></td> 
<td> 
<input type="radio" name="j_idt6:sex" id="j_idt6:sex:1" value="female" /><label  for="j_idt6:sex:1"> Female</label></td> 
    </tr> 
</table> 
     </td> 
     </tr> 
     <tr> 
     <td>Date of Birth:</td> 
     <td><input id="j_idt6:dob" type="text" name="j_idt6:dob" /> (mm-dd-yy) 

     </td> 
    </tr> 
      <tr> 
     <td>Email Address:</td> 
     <td><input id="j_idt6:email" type="text" name="j_idt6:email" /> 
     </td> 
     </tr> 
     <tr> 
     <td>Service Level:</td> 
     <td><select name="j_idt6:j_idt21" size="1"> <option value="medium"  selected="selected">Medium</option> 
    <option value="basic">Basic</option> 
    <option value="premium">Premium</option> 
</select> 
     </td> 
     </tr> 
    </table> 
    <p><input type="submit" name="j_idt6:j_idt26" value="Register" /></p><input   type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState"   value="-3247001945221977595:-4814431455900353505" autocomplete="off" /> 
</form></body> 
</html> 

我无法上传浏览器显示内容的PRINTSCREEN,但标记未呈现。

问题:我的错误是什么?应该做些什么来使Glassfish应用服务器正确地呈现支持JSF 2.0的页面?我只需要一个简单的JSF 2。0模板来设置我的开发环境并用作JSF应用程序的起点。

谢谢!

回答

4

与你所说的相反,JSF页面正确呈现。根据获得的HTTP响应,生成的HTML输出看起来一切正常。所有的JSF标签都被正确的分析和渲染。如果JSF没有渲染任何内容,那么您可以在查看源代码中看到原始JSF源代码。

您的具体问题是浏览器没有正确显示生成的HTML。当Content-Type标题错误时可能会发生这种情况。 Content-Type标题告诉浏览器如何解释内容。该行为也依赖于浏览器。例如,如果您向MSIE浏览器提供了<DOCTYPE html ...>Content-Typeapplication/xhtml+xml,那么它将遭到破坏,甚至会弹出一个令人困惑的另存为对话。

就你而言,即使你没有清楚地陈述问题,也没有详细描述真实的反应,也没有显示截图(即使在不同的主机上),我认为你的具体问题是所有该HTML显示为Content-Typetext/plain。即您实际上将整个HTML源代码视为浏览器响应,并将其误解为“JSF未呈现响应”,而实际上您的浏览器未将检索到的JSF生成的HTML源代码呈现为可视化表示形式。

权利Content-Type由JSF实现本身默认设置,但它可以被服务器甚至前端的代理(如Apache HTTPD)覆盖,或者通过在JSF源代码中明确指定它。我不确定你的具体情况的确切原因,但是下面的内容应该强制JSF发送明确的答复,如text/html

<f:view contentType="text/html"> 
    Put at least h:body here. 
</f:view> 

您可以在任何现代Web浏览器调试工具中检查响应标头。例如,在Firebug:

enter image description here


无关的具体问题,您FacesServlet映射应该比独此页面更通用,或像阿贾克斯的JavaScript服务资源时,你可能会遇到麻烦。我推荐*.xhtml。我也建议根据更体面的教程重做配置。您可以在JSF wiki page的底部找到很好的教程。