Проблема с конфигурацией имени файла Tomcat 6 JSF/JSP

У меня есть приложение JSF, развертываемое из Eclipse Ganymede через Tomcat 6. Последний предлагает JSP 2.0. Я использую реализацию Sun RI JSF и RichFaces 3.3.2SR1.

Мой файл index.jsp по запросу из браузера вызывает эту ошибку в консоли:

05-Mar-2010 12:04:41 org.apache.catalina.core.ApplicationDispatcher invoke SEVERE: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: /index.jsp(35,41) #{..} is not allowed in template text ...

ОК, я видел различные другие сообщения на эту тему, включая несовместимость версий различных jar-файлов/taglibs/syntaxes и т. д.

index.jsp вызывается с использованием http://localhost:8989/myapp/index.jsf (или .jsp - дает ту же ошибку) и содержит

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

что должно быть в порядке, так как Facelets есть в Mojarra 2.0.2FCS, которую я использую. Кажется, мне нужно использовать приведенный выше синтаксис, а не, например. <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> в качестве URI-адреса facelets заставляет Eclipse произносить Cannot find the tag library descriptor for "http://java.sun.com/jsf/facelets".

Моя проблема связана с тем, как я перечисляю эти теги?

Мой файл сборки Ant относится к этим jar-файлам Tomcat:

    <fileset dir="${cliTomcatlib}">
        <include name="servlet-api.jar" />
        <include name="jsp-api.jar" />
    </fileset>

поэтому я в тупике, как я могу обойти эту ошибку. Кажется, что это будет простое исправление, но поскольку я использую последние jar-файлы, которые должны быть совместимы с JSP 2.0, мне интересно, почему я получаю эту ошибку. JSF

EDIT В ответ на мудрость BalusC я исправил две ссылки на внешние файлы jsp и переименовал все .jsp в .xhtml. Я не забыл также обновить свой файл faces-config.xml.

Повторное развертывание ошибок с большой и повторяющейся ошибкой при запросе index.xhtml следующим образом:

05-Mar-2010 13:29:26 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.StackOverflowError
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:824)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:544)
...
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:216)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:544)
    at com.sun.faces.context.ExternalContextImpl.getSession(ExternalContextImpl.java:151)
    at javax.faces.application.ViewHandler.calculateCharacterEncoding(ViewHandler.java:242)
    at javax.faces.application.ViewHandler.initView(ViewHandler.java:458)
    at com.sun.faces.application.view.MultiViewHandler.initView(MultiViewHandler.java:106)
    at org.ajax4jsf.application.ViewHandlerWrapper.initView(ViewHandlerWrapper.java:128)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:109)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)

что, я признаю, не очень показательно, за исключением того, что первые несколько строк трассировки стека повторяются так много раз, что мне пришлось изменить буфер консоли в Eclipse. Я был бы переполнен благодарностью, если бы кто-нибудь видел это раньше.

отметка


person volvox    schedule 05.03.2010    source источник


Ответы (2)


org.apache.jasper.JasperException: /index.jsp(35,41) #{..} is not allowed in template text 

Унифицированный EL действительно не разрешен в тексте шаблона в JSP. Это разрешено только в Facelets.

index.jsp вызывается с использованием http://localhost:8989/myapp/index.jsf ( или .jsp - выдает ту же ошибку) и содержит

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://java.sun.com/jsf/facelets"

Вы путаете JSP с Facelets. Вы можете и не должны этого делать. Это две разные технологии просмотра. Используйте тот или иной. JSP предназначен для <%@taglib %> материала, а Facelets ориентирован на XHTML с <html xmlns> и <ui:xxx> материалом. Для JSF 2.0 вы должны использовать Facelets. Переименуйте все файлы с *.jsp на *.xhtml, замените и избавьтесь от всего, что связано с <% %> и <jsp:xxx>.

Чтобы узнать больше о Facelets, начните здесь, в учебной части по Java EE 6. II глава 5. Если вы хотите вернуться к древнему JSP вместо Facelets для JSF 2.0, вам потребуется перенастроить обработчик представления в JSF.

Помимо проблемы, Tomcat 6.0, кстати, является JSP 2.1, а не JSP 2.0.

Обновление: StackOverflowError на getSession() указывает на бесконечную рекурсию в сопоставлениях сервлета/фильтра. Как устроен ваш FacesServlet? Он должен быть назначен для прослушивания url-pattern из *.jsf, а не *.xhtml. В противном случае он будет вызывать себя рекурсивно. Обратитесь к книгам по JSF 2.0/руководства/документацию подробно о том, как правильно его настроить.

person BalusC    schedule 05.03.2010
comment
BalusC, см. обновление моего вопроса. Спасибо за вашу помощь в этом. - person volvox; 05.03.2010
comment
Ключевые слова в этом ответе: «проконсультироваться», «документация», «настроить» и «правильно». Спасибо BalusC за пощечину. - person volvox; 06.03.2010

Добавьте jar-файлы реализации JSF в библиотеку Tomcat или библиотеку вашего приложения и повторите попытку.
См. эту для получения дополнительной информации.

person Padmarag    schedule 05.03.2010
comment
Tomcat не поставляется с какой-либо имплементацией JSF (если только OP не поместил их туда без необходимости). - person BalusC; 05.03.2010
comment
Спасибо, что указали. В основном я работаю с GlassFish и JBoss. - person Padmarag; 05.03.2010