2012-01-14 2 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 TagLib атрибуты (..)

<?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 и другие данные

<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-адрес запроса URL-адресу FacesServlet.

**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 TagLib атрибуты (..)

<!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 в View Source.

Ваша конкретная проблема заключается в том, что браузер не отображает сгенерированный HTML правильно. Это может произойти, когда заголовок Content-Type ошибочен. Заголовок Content-Type сообщает браузеру, как интерпретировать контент. Поведение также зависит от браузера. Если вы, например, подаете <DOCTYPE html ...> с Content-Type из application/xhtml+xml в браузер MSIE, тогда он пойдет на хаос и даже столкнется с запутанным диалогом Save As.

В вашем случае, хотя вы не указали проблему четко и не описали реальный отклик подробно и не показали скриншот (хотя и на другом хосте), я думаю, что ваша конкретная проблема в том, что все что HTML отображается с Content-Typetext/plain. То есть вы буквально видите весь исходный код HTML в качестве ответа браузера, и вы неверно истолковали его как «JSF, не отображающий ответ», в то время как на самом деле это ваш браузер, который не отобразил полученный HTML-источник, полученный JSF, в визуальное представление.

Право Content-Type по умолчанию установлено реализацией JSF, но оно может быть переопределено сервером или даже прокси (например, Apache HTTPD) спереди или явно указывать его в исходном коде JSF. Я не уверен в конкретной причине в вашем конкретном случае, но следующее должно заставить JSF отправить ответ явно как text/html.

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

Вы можете просмотреть заголовки ответов в любом современном отладочном инструменте веб-браузера. Так, например, в Firebug:

enter image description here


Unrelated к конкретной проблеме, ваш FacesServlet отображение должно быть более общим, чем только этой страницы, или вы можете столкнуться с проблемами при обслуживании ресурсов, таких как Ajax JavaScripts , Я рекомендую *.xhtml. Я также рекомендую повторить настройку на основе более достойного учебника. Вы можете найти хорошие учебники в нижней части нашего JSF wiki page.