JSF 2.0 не отображает ни одной страницы - PullRequest
2 голосов
/ 15 января 2012

Я начинающий программист на Java EE, у которого проблемы с настройкой моего первого приложения с поддержкой 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 -> отредактированный заголовок, задающий атрибуты HTML taglib JFS 2.0 (..)

<?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 -> включает заголовок, задающий атрибуты HTML-тега JFS 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">

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.

Спасибо!

1 Ответ

4 голосов
/ 15 января 2012

В отличие от того, что вы говорите, страница JSF отображается правильно. Согласно полученному HTTP-ответу, сгенерированный HTML-вывод выглядит нормально. Все теги JSF правильно анализируются и отображаются. Если JSF ничего не рендерил, то вы бы увидели в точности исходный код JSF в Просмотр источника .

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

В вашем случае, даже если вы не указали проблему четко, не описали реальный ответ в деталях и не показали скриншот (хотя и на другом хосте), я думаю, что ваша конкретная проблема заключается в том, что все это HTML отображается с Content-Type из text/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


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

...