JSF 2.0没有呈现任何页面 [英] JSF 2.0 not rendering any page

查看:98
本文介绍了JSF 2.0没有呈现任何页面的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是一名刚开始使用Java EE程序员的人,他在设置我的第一个JSF 2.0应用程序时遇到了麻烦。我正在使用以下技术:

I’m a beginning Java EE programmer having troubles setting up my first "JSF 2.0" enabled application. I’m using the following technologies:


  • jdk1.6.0_24

  • MyEclipse 10.0

  • Glassfish 3.0.1

  • 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呈现。我尝试了不同的方法来修复我的代码,包括:

Problem: I couldn’t find a way to make my server parse and render JSF 2.0 pages. I followed various guides, (notably from stackoverflow.com) without success. My test pages are not rendered by Glassfish 3.0.1. I tried different approaches to fix my code including:

1 - > web.xml

1.1 - > 编辑的标题指定JFS 2.0 HTML taglib属性(..)

1.1 -> edited header specifying JFS 2.0 HTML taglib attributes ( ..)

<?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和其他东西

1.2 – Defined JSF servlet and other stuff

   <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 - > 多次验证,检查请求的网址是否匹配FacesServlet的url模式。

2 -> Verified many times to check if the request URL used matches the url-pattern of the 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属性(..)

3.1.1 -> included header specifying JFS 2.0 HTML taglib attributes ( ..)

<!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 - 图书馆&依赖项

4 – libraries & dependencies

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

Started my project with Maven 2.0 support . This is my pom.xml file:

<?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 – Glassfish results

5.1 - HTML JSF 2.0代码:

5.1 - HTML JSF 2.0 Code:

<!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:

5.2 - HTML of page displayed by browser:

<!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,但不会呈现标签。

I could not upload a PRINTSCREEN of what is showed by browser, but tags are not rendered.

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

Question: what was my mistake? What should be done to make Glassfish application server render JSF 2.0 enabled pages correctly? I just need a simple JSF 2.0 template to setup my development environment and use as start point of JSF applications.

谢谢!

推荐答案

与您所说的相反,JSF页面 正确呈现。根据获得的HTTP响应,生成的HTML输出看起来很好。正确解析和呈现所有JSF标记。如果JSF没有呈现任何内容,那么您可以在查看源中看到原始的JSF源代码。

In contrary to what you're telling, the JSF page is correctly rendered. As per the obtained HTTP response, the generated HTML output looks all fine. All JSF tags are correctly parsed and rendered. If JSF did not render anything, then you would have seen exactly the original JSF source code in View Source.

您的具体问题是浏览器未正确显示生成的HTML。当 Content-Type 标头错误时,可能会发生这种情况。 Content-Type 标题告诉浏览器如何解释内容。该行为也取决于浏览器。例如,如果您提供< DOCTYPE html ...> ,其 Content-Type application / xhtml + xml 到MSIE浏览器,然后它会破坏甚至弹出令人困惑的另存为对话框。

Your concrete problem is that the browser is not displaying the generated HTML properly. This can happen when the Content-Type header is wrong. The Content-Type header tells the browser how to interpret the content. The behaviour is also browser dependent. If you for example serve a <DOCTYPE html ...> with a Content-Type of application/xhtml+xml to the MSIE browser, then it will go havoc and even pop a confusing Save As dialogue.

在你的情况下,即使你没有清楚地说明问题,也没有详细描述真实的反应,也没有显示截图(即使在不同的主机上) ),我认为您的具体问题是所有HTML都显示为 Content-Type text / plain 。即您确实将整个HTML源代码视为浏览器响应,并将其误解为JSF无法呈现响应,而实际上您的浏览器并未将检索到的JSF生成的HTML源呈现为可视化表示。

In your case, even though you didn't state the problem clearly, nor described the real response in detail, nor has shown a screenshot (even though on a different host), I think that your concrete problem is that all that HTML is displayed with a Content-Type of text/plain. I.e. you're literally seeing the entire HTML source code as browser response and you misinterpreted it as "JSF not rendering the response" while it's actually your browser who didn't render the retrieved JSF-generated HTML source into a visual representation.

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

The right Content-Type is by default set by the JSF implementation itself, but it can be overridden by the server or even a proxy (like Apache HTTPD) in the front, or by explicitly specifying it in the JSF source code. I'm not sure about the exact cause in your particular case, but the following should force JSF to send the response explicitly as text/html.

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

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

You can examine the response headers in any modern web browser debugging tool. For example, in Firebug:

无关具体问题,您的 FacesServlet 映射应该比单独的页面更通用,否则在服务Ajax javascripts等资源时可能会遇到麻烦。我建议 *。xhtml 。我还建议基于更合适的教程重做配置。您可以在我们的 JSF wiki页面的底部找到很好的教程。

Unrelated to the concrete problem, your FacesServlet mapping should be more generic than alone this page, or you may run into trouble when serving resources like Ajax javascripts. I recommend *.xhtml. I also recommend to redo the configuration based on a more decent tutorial. You can find good tutorials in the bottom of our JSF wiki page.

这篇关于JSF 2.0没有呈现任何页面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆