2012-01-14 135 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的底部找到很好的教程。