2010-03-02 6 views
5

Я строю проект GWT, с GWT-2.0.3 и плагином затмения. хорошо, первый я попытался, JSTL1.2 и сервлет 2,5,Как использовать JSTL в проекте GWT?

  • я действительно добавляют JSTL-1.2.jar к войне/WEB-INF/Lib
  • в web.xml, я использую:

    <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"> 
    
  • на странице JSP, я использую:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
    
    <c:forEach var="app" items="${requestScope.apps}"> 
        <tr><td width=20%><c:out value="${app.mapping}"></c:out></td> 
        <td width=40%><c:out value="${app.description}"></c:out></td> 
        ... 
    

Если я бэр ove тег foreach, он отлично работает. но если я использую основные теги, я получаю следующее исключение:

HTTP ERROR: 500 

javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext; 
RequestURI=/system/view/register.html 

Caused by: 

java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext; 
    at javax.servlet.jsp.jstl.core.LoopTagSupport.unExposeVariables(LoopTagSupport.java:587) 
    at javax.servlet.jsp.jstl.core.LoopTagSupport.doFinally(LoopTagSupport.java:323) 
    at org.apache.jsp.system.view_jsp._jspx_meth_c_forEach_0(view_jsp.java:267) 
    at org.apache.jsp.system.view_jsp._jspx_meth_a_body_0(view_jsp.java:186) 
    at org.apache.jsp.system.view_jsp._jspService(view_jsp.java:98) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:285) 
    at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126) 
    at org.app4j.test.DispatchServlet.doGet(DispatchServlet.java:133) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 
Powered by Jetty:// 

Если я развернуть проект на сервере Tomcat 6, работает отлично. Я ищу в Интернете, и я нашел статью, "JSP Expression Language in GWT’s embedded Jetty", поэтому я попробовал jstl-1.1 и servlet2.4, но я все еще получаю это исключение.
Я считаю, что версия сервера причала GWT должна быть 6.1, но я не уверен в этом, если это правда, она должна поддерживать EE5, поэтому у любого есть встроенные GWT и JSTL? пожалуйста помоги! Благодарю.

+1

Это решение работает для меня: http://stackoverflow.com/questions/7062024/gwt-jstl-in-development-mode-is-it -possible – Taylor

ответ

2

Я бы порекомендовал просто переключиться на внешний Java-сервер (например, Tomcat, который вы, похоже, установили и который работает с вашей конфигурацией) - гораздо меньше проблем, проще, чем пытаться работать с поврежденным Jetty, который поставляется с GWT ,

Инструкции можно найти в docs. Если вы будете придерживаться GWT's Jetty, в будущем вы столкнетесь с большим количеством проблем.


Update, см комментарий Паскаль Thivent ниже:

@Pascal: жаль, что я не хотел, чтобы просто сказать: «Переключение на внешний сервер, не дискуссионный», это просто Я видел много людей на SO и GWT's Google Group, у которых возникли проблемы с настройкой Jetty, который поставляется с GWT - в некоторых случаях это связано с тем, что конфигурация несколько отличается от стандартной, потому что команда GWT включала более старую/измененную (я не могу получить любую достоверную информацию об этой) версии Jetty, например см. this post и комментарии там, некоторые цитаты:

Примечания: Я считаю, что версия причала поставляется с GWT ниже 6.1.12 и поэтому вы должны уйти от первого параметра в примере, документах, как это было добавлено в причале 6.1.12rc3. См. Примечание в верхней части документов Jetty .


Предположительно Причал поддерживает сервлетный 2.5 спецификации и ресурсы инъекции через вход web.xml или @Resource аннотации. Тем не менее, у меня есть , но выясните, поддерживается ли это по версии Jetty, поставляемой с GWT. Если кто-либо выяснил, является ли это или , это не работает, и если да, то как это делается сделано, пожалуйста, дайте мне знать.

Другие проблемы возникают, когда кто-то хочет использовать EJB.

Все это (возможно, более сжатым/загадочным способом) написано в документации GWT, для которой я предоставил ссылку выше в точный абзац, посвященный этой проблеме.
Надеюсь, что это прояснило некоторые вещи - переход на внешний сервер просто кажется самым простым, простым и лучшим решением - нет специальной конфигурации GWT, то есть вы можете использовать ту же конфигурацию/сервер, которые вы будете использовать на производстве , нет необходимости переносить конфигурацию, например, Tomcat, никаких неожиданных ошибок после миграции и т.д.

+0

Большое спасибо, я думал, что не могу использовать размещенный режим, если я переключусь на tomcat. – Brodie

+1

Нет ссылок на конкретные вопросы, не упоминается какая-либо конкретная проблема, нет ссылки, ничего. Единственное, что я вижу в этом ответе, - FUD, –

+0

Вы правы, я отредактировал свой ответ, чтобы прояснить это, надеюсь, что это меньше FUD и больше до обычного (высокого) стандарта на SO :) –

0
java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext; 

выполнения путь к классам WebAPP, скорее всего, завален другой версии JAR-файла EL (или более старая версия или другой сервер приложений), в которой отсутствует исключенный упомянутый метод. Я подозреваю /WEB-INF/lib. Избавьтесь от этого, он обычно уже поставляется указанным сервером приложений, вам не нужно включать его в свой webapp. Это применимо ко всем библиотекам приложений, например, servlet-api.jar и, кстати, к супругам. Вы не должны копировать его в файл. Это требует неприятностей с переносимостью.

2

Я наткнулся на это, пока искал исправление JSTL для моего проекта движка приложения. Я нашел ответ на странице «Будет ли он играть» Google. Судя по всему, вы должны добавить

<%@page isElIgnored="false" %>

на страницы JSP, чтобы включить EL разбор.

1

Я тоже получаю эту ошибку.

Я нашел, что могу исправить это, переместив GWT SDK в конец пути к классам в окне Eclipse Java Build Path -> Order and Export.

Однако, что ломает GWT сериализация с этим сообщением:

Mar 3, 2011 3:31:23 PM sun.reflect.NativeMethodAccessorImpl invoke0 
WARNING: Exception while dispatching incoming RPC call 
com.google.gwt.user.client.rpc.SerializationException: java.lang.reflect.InvocationTargetException 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeWithCustomSerializer(ServerSerializationStreamWriter.java:764) 
    at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:727) 

Вы можете исправить, что при перемещении библиотеки GWT обратно в путь к классам, что делает его выглядеть, как вы можете иметь JSTL или GWT сериализация работает в Причал, но не оба.

(GWT 2.1, JSTL1.2 и сервлет 2,5.)