Код JSF отображается в браузере - PullRequest
3 голосов
/ 24 июля 2011

Я изучаю JSF и получил помощь от Exadel.com .Я следовал описанным там шагам.

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>FBApp</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>

    <context-param>
        <param-name>javax.faces.CONFIG_FILES</param-name>
        <param-value>/WEB-INF/faces-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>

    <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>/faces/*</url-pattern>
    </servlet-mapping>
</web-app>

face-config.xml:

<?xml version="1.0" encoding="UTF-8"?>

<faces-config 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-facesconfig_1_2.xsd"
    version="1.2">

    <navigation-rule>
        <from-view-id>/pages/inputname.jsf</from-view-id>
        <navigation-case>
            <from-outcome>greeting</from-outcome>
            <to-view-id>/pages/greeting.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>
    <managed-bean>
        <managed-bean-name>personBean</managed-bean-name>
        <managed-bean-class>com.fbapp.bean.PersonBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>

</faces-config>

index.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>index</title>
</head>
<body>
    <jsp:forward page="faces/pages/inputname.jsf" />
</body>
</html>

inputname.jsp:

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
 <head>
  <title>enter your name page</title>
 </head>
 <body>
   <f:view>
     <h1>
      <h:outputText value="JSF KickStart"/>
     </h1>
     <h:form id="helloForm">
      <h:outputText value="Tell us your name"/>
      <h:inputText value="#{personBean.personName}" />
      <h:commandButton action="greeting" value="Say Hello" />
     </h:form>
   </f:view>
 </body>
</html>  

Теперь есть разница:

  • В index.jsp я использовал <jsp:forward page="faces/pages/inputname.jsf" />, а Exadel использовал <jsp:forward page="/pages/inputname.jsf" />
  • Я использовал <url-pattern>/faces/*</url-pattern>, и они использовали: <url-pattern>*.jsf</url-pattern>

Библиотеки jar:

  • commons-beanutils-1.7.0.jar
  • commons-codec-1.3.jar
  • commons-collection-3.1.jar
  • commons-digester-1.7.jar
  • commons-el-1.0.jar
  • commons-fileupload-1.0.jar
  • commons-lang-2.1.jar
  • commons-logging-1.0.4.jar
  • commons-validator-1.1.4.jar
  • jsf-api-1.2.jar
  • jsf-impl-1.2-NIGHTLY_20060227.jar
  • jstl-1.1.2.jar
  • oro-2.0.8.jar
  • xml-apis-1.0.b2.jar

В JBoss 4.2.2GA (настроено для JSF) я развернул войнуработает, но когда я пытаюсь пойти к тебеrl http://localhost:8080/FBApp/ страница отображается как:

ERROR

, которая фактически является кодом inputname.jsf.Что я делаю не так?Любая информация будет полезна.

Спасибо и всего наилучшего.


Редактировать: Код изменен в соответствии с инструкциями BalusC .Теперь я получаю исключение и трассировку стека:

19:34:04,244 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
    at com.sun.faces.taglib.jsf_core.ViewTag.doStartTag(ViewTag.java:162)
    at org.apache.jsp.pages.inputname_jsp._jspx_meth_f_005fview_005f0(inputname_jsp.java:104)
    at org.apache.jsp.pages.inputname_jsp._jspService(inputname_jsp.java:77)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:694)
    at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:665)
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:63)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:636)
19:34:04,245 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
    at com.sun.faces.taglib.jsf_core.ViewTag.doStartTag(ViewTag.java:162)
    at org.apache.jsp.pages.inputname_jsp._jspx_meth_f_005fview_005f0(inputname_jsp.java:104)
    at org.apache.jsp.pages.inputname_jsp._jspService(inputname_jsp.java:77)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:694)
    at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:665)
    at org.apache.jsp.index_jsp._jspService(index_jsp.java:63)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:636)

Ответы [ 2 ]

8 голосов
/ 24 июля 2011

Это может произойти, если вы указали для фактических файлов JSP расширение .jsf.Другими словами, у вас нет файла inputname.jsp в папке с веб-контентом, но на самом деле a inputname.jsf файл.Это не верно.Эти файлы JSP должны иметь расширение .jsp, чтобы их можно было обрабатывать JspServlet.В противном случае эти файлы вообще не будут анализироваться как JSP и в конечном итоге будут отображаться в виде обычного текста в веб-браузере.

Вы изменили шаблон URL FacesServlet вместо /faces/* вместо (чем большерекомендуется) *.jsf.Таким образом, вы должны изменить все URL-адреса в руководстве с /foo.jsf на /faces/foo.jsp, также в случаях перехода вперед / включения и навигации.Вы должны не изменить на /faces/foo.jsf и использовать неверное расширение в реальных файлах.


Не связано с конкретной проблемой: есть ли какая-то конкретная причиначто вы читаете 6-летнее учебное пособие по JSF 1.1 вместо более свежего учебного пособия по JSF 2.0?JSF 1.1 имеет так много недостатков , а также унаследованная JSP была заменена Facelets 1,5 года назад.


Обновление согласно комментарию к вопросу:

@ cularis Это мой первый проект на самом деле.Я получил java.lang.ClassCastException: com.sun.faces.application.ApplicationAssociate cannot be cast to com.sun.faces.application.ApplicationAssociate, и я нашел решение этой проблемы здесь и сделал это как сказано, и проблема была решена.Я использую JBoss 4.2.2 с JSF 1.2

Это исключение может произойти, если путь к классам во время выполнения загрязнен различными версионными библиотеками JSF.JBoss поставляется с уже встроенным JSF, поэтому вам не следует предоставлять библиотеки JSF в папке веб-приложения /WEB-INF/lib.Если это другая версия, она может столкнуться с исключениями, как указано выше.


Обновление 2 согласно обновлению вопроса:

java.lang.NullPointerException
    at com.sun.faces.taglib.jsf_core.ViewTag.doStartTag(ViewTag.java:162)

Ну, это противно, и я не видел его раньше.Держу пари, что это будет вызвано только загрязнением пути к классу.JBoss 4.2.x поставляется с уже встроенными JSF 1.2 и JSTL 1.1.Удалите библиотеки jsf * .jar и jstl * .jar из /WEB-INF/lib.Пожалуйста, также удалите все связанные с JSF <context-param> и <listener> entires из web.xml.Все те, которые вы пока используете, уже являются JSF 1.2 по умолчанию.Это может или не может решить вашу конкретную проблему, но это должно, по крайней мере, минимизировать шум.Дайте мне знать.


Обновление 3 согласно комментариям:

Я удалил банки и записи из web.xml, а также раскомментировалзакомментированная строка в jboss-4.2.2.GA/server/default/deploy/jboss-web.deployer/conf/web.xml и теперь я получаю java.lang.RuntimeException: Cannot find FacesContext.Но предыдущая проблема решена

Гораздо лучше.Ошибка Cannot find FacesContext имеет простую причину: FacesServlet не был вызван.Таким образом, URL-адрес запроса или пересылки не соответствует шаблону URL FacesServlet.Предполагая, что вы по-прежнему сопоставили свой FacesServlet с шаблоном URL-адреса /faces/* и что у вас есть физический файл /pages/inputname.jsp в вашем веб-контенте, тогда все, что должен содержать index.jsp, - это следующая строка (да, получитьизбавиться от всего, что не имеет значения HTML)

<jsp:forward page="faces/pages/inputname.jsp" />

Таким образом, просто вызов

http://localhost:8080/FBApp/

должен работать.Если это по какой-то причине (дайте мне знать), то, по крайней мере, вызов

http://localhost:8080/FBApp/faces/pages/inputname.jsp

должен работать.


Обновление 4 согласно комментариям:

Исключение FacesContext решено, но теперь оно выдает javax.faces.FacesException: java.net.MalformedURLException: Path faces-config.xml does not start with a "/" character.

Хм, это тоже ново для меня.Как теперь выглядит web.xml?Это говорит о том, что у вас есть javax.faces.CONFIG_FILES контекстный параметр с неправильным значением faces-config.xml.Попробуйте вставить контекстный параметр javax.faces.CONFIG_FILES со значением /WEB-INF/faces-config.xml обратно в web.xml.Возможно, JSF 1.2, используемый в JBoss, имеет какую-то ошибку, связанную с этим.

1 голос
/ 24 июля 2011

Если вы начинающий, вам действительно следует начать читать JSF 2.0, а не устаревшую версию 1.1. Есть много книг, связанных с JSF. Bests

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...