2010-03-02 105 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。)