2010-03-02 13 views
5

sto costruendo un progetto GWT, con GWT-2.0.3 e il plugin eclipse. bene, prima ho provato, JSTL1.2 e servlet 2.5,Come utilizzare JSTL in un progetto GWT?

  • che faccio aggiungere JSTL-1.2.jar alla guerra/WEB-INF/lib
  • in web.xml, io uso:

    <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"> 
    
  • nella pagina JSP, io uso:

    <%@ 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> 
        ... 
    

Se rem ove il tag Foreach, funziona bene. ma se uso i tag di base, ottengo la seguente eccezione:

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

Se schiero il progetto di Tomcat 6, funziona benissimo. cerco sul web e trovo un articolo, "JSP Expression Language in GWT’s embedded Jetty", quindi ho provato jstl-1.1 e servlet2.4, ma ottengo comunque quell'eccezione.
trovo che la versione del server del molo del GWT dovrebbe essere 6.1, ma non ne sono sicuro, se è vero, dovrebbe supportare EE5, quindi qualcuno ha integrato GWT e JSTL? per favore aiuto! Grazie.

+1

Questa soluzione ha funzionato per me: http://stackoverflow.com/questions/7062024/gwt-jstl-in-development-mode-is-it -possibile – Taylor

risposta

2

Si consiglia di passare a un server Java esterno (come Tomcat, che sembra aver installato e che funziona con la configurazione) - molto meno problemi, più facile che provare a lavorare con il Jetty storpio che viene fornito con GWT .

Le istruzioni sono disponibili nello docs. Se ti attacchi con il molo di GWT, ti imbatterai in altri problemi in futuro.


Update, vedere commento di Pascal Thivent di seguito:

@Pascal: dispiace per questo, non volevo dire solo "Passa a server esterni, non parlare", è solo che Ho visto un sacco di persone su SO e su GWT's Google Group che hanno problemi nella configurazione di Jetty che viene fornito con GWT - in alcuni casi è perché la configurazione è leggermente diversa da quella standard, perché il team GWT includeva un vecchio/modificato (non posso ottenere qualsiasi informazione solida su questa) versione di Jetty, ad esempio vedere this post e commenti lì, alcune citazioni:

NOTA: Credo che la versione del pontile fornito con GWT è inferiore a 6.1.12 e quindi si deve lasciare fuori il primo parametro nei documenti di esempio in quanto è stato aggiunto nel molo 6.1.12rc3. Vedere la nota nella parte superiore della pagina dei documenti Jetty .


Presumibilmente Jetty supporta il servlet 2,5 specifiche e risorse iniezione mediante la voce del web.xml o @Resource annotazione. Tuttavia, ho ancora per capire se questo è supportato dalla versione Jetty fornita con GWT. Se qualcuno ha capito se o non funziona e se è così come è fatto per favore fatemelo sapere.

Altri problemi si verificano quando qualcuno desidera utilizzare EJB.

Tutto ciò (forse in un modo più condensato/criptico) è scritto nella documentazione di GWT - per la quale ho fornito un collegamento sopra al paragrafo esatto che risolve questo problema.
Si spera che questo chiarisca alcune cose: passare a un server esterno sembra la soluzione più semplice, semplice e migliore - nessuna configurazione "GWT speciale", il che significa che è possibile utilizzare la stessa configurazione/server che si utilizzerà in produzione , non c'è bisogno di migrare la configurazione, ad esempio, Tomcat, nessun bug inaspettati dopo la migrazione, ecc

+0

grazie mille, ho pensato che non potevo usare la modalità hosted se passassi a tomcat. – Brodie

+1

Nessun link a problemi specifici, nessun problema particolare menzionato, nessun riferimento, niente. L'unica cosa che vedo in questa risposta è FUD, –

+0

Hai ragione, ho modificato la mia risposta per chiarire questo, speriamo sia meno FUD e più fino al solito (alto) standard su SO :) –

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

classpath runtime del webapp è probabile ingombra di una versione diversa del file JAR EL (sia una versione precedente o quella di un appserver diverso) che non ha il metodo indicato nell'eccezione. Sospetto che lo /WEB-INF/lib. Sbarazzati, di solito è già fornito dal server delle app in questione, non è necessario includerlo nella tua webapp. Questo vale per tutte le librerie di appserver come servlet-api.jar e le consorzi. Non dovresti mai copiarlo nello /WEB-INF/lib del webapp. Questo sta chiedendo problemi di portabilità.

2

Mi sono imbattuto in questo mentre stavo cercando la correzione JSTL per il mio progetto di motore di app. Ho trovato la risposta sulla pagina "Will It Play" di google. A quanto pare si deve aggiungere

<%@page isElIgnored="false" %>

alle tue pagine JSP per consentire EL analisi.

1

Anche questo errore.

Ho trovato che posso risolvere il problema spostando l'SDK GWT nella parte inferiore del classpath nel percorso di compilazione Java di Eclipse -> finestra di dialogo Ordine ed esportazione.

tuttavia, che rompe GWT serializzazione con questo messaggio:

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) 

si può risolvere che spostando la biblioteca GWT il backup del percorso di classe, che lo rende apparire come è possibile avere JSTL o GWT serializzazione lavorare in Jetty, ma non entrambi.

(GWT 2.1, JSTL1.2 e servlet 2.5.)

Problemi correlati