2010-03-02 111 views
5

我正在用GWT-2.0.3和eclipse插件構建一個GWT項目。 好,首先我想,JSTL1.2和servlet 2.5,如何在GWT項目中使用JSTL?

  • 我做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> 
        ... 
    

如果我REM 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的jetty服務器版本應該是6.1,但我不確定,如果那是真的,它應該支持EE5,所以任何一個已經集成了GWT和JSTL?請幫忙!謝謝。

+1

該解決方案爲我工作:http://stackoverflow.com/questions/7062024/gwt-jstl-in-development-mode-is-it - 可能 – Taylor 2011-11-17 18:19:40

回答

2

我建議只切換到外部Java服務器(比如Tomcat,你似乎已經安裝了它並且可以與你的配置一起工作) - 問題要少得多,比試圖使用GWT附帶的殘缺Jetty更容易。

說明可在docs中找到。如果你堅持使用GWT的Jetty,你將來只會遇到更多的問題。


更新,見註釋帕斯卡爾Thivent如下:

@Pascal:對不起,我不是故意的,只是說「切換到外部服務器,不說話」,這只是我見過很多SO和GWT's Google Group的用戶,他們在配置GWT附帶的Jetty時遇到了問題 - 在某些情況下,這是因爲配置與標準有所不同,因爲GWT團隊包含了一個較舊的/修改過的(我不能得到任何堅實的信息在這個)的Jetty版本,例如見this post和那裏的評論,一些報價:

注:我相信隨GWT碼頭 的版本是6.1.12以下和 因爲它 在碼頭6.1.12rc3加入,因此你必須離開關中例如文檔的第一 參數。請參閱碼頭文檔 頁面頂部的 注意事項。


據稱碼頭支持通過web.xml條目或 @Resource註釋該servlet 2.5規範和資源注入。不過,我還有 尚未弄清楚GWT附帶的Jetty版本是否支持 。 如果有人已經知道是否或 不是這個工程,如果是的話如何是 完成請讓我知道。

當有人想要使用EJB時​​會發生其他問題。

所有這些(可能採用更加簡潔/神祕的方式)都是在GWT的文檔中編寫的,爲此我提供了一個鏈接到上面的鏈接。
希望能夠解決一些問題 - 切換到外部服務器似乎是最簡單,最簡單和最好的解決方案 - 沒有「特殊的GWT」配置,這意味着您可以使用與生產中使用的配置/服務器相同的配置,不需要遷移你的配置,例如Tomcat的,遷移後沒有意外的錯誤等

+0

非常感謝,我以爲我不能使用託管模式,如果我切換到tomcat。 – Brodie 2010-03-02 23:21:19

+1

沒有指向特定問題的鏈接,沒有提到特定問題,沒有提及,什麼都沒有。我在這個答案中看到的唯一一件事是FUD, – 2010-03-07 02:37:01

+0

你是對的,我已經編輯了我的答案,以澄清這一點,希望它是更少的FUD和更多達到通常(高)標準:) – 2010-03-07 03:45:33

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

web應用程序的運行時類路徑是不同版本的EL JAR文件的可能混亂(或舊版本或不同的應用程序服務器),它缺少例外提及的方法。我懷疑/WEB-INF/lib。擺脫它,它通常已經由有問題的應用服務器提供,你不需要將它包含在你的web應用中。順便說一下,這適用於所有應用服務器庫,如servlet-api.jar和配套。你不應該將它複製到webapp的/WEB-INF/lib。這是要求可移植性的麻煩。

2

我偶然發現了這個問題,當時我正在爲我的應用程序引擎項目尋找修復JSTL。我在google上找到了「Will It Play」的答案。顯然,你必須

<%@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和servlet 2.5。)