【问题标题】:How to use JSTL in a GWT project?如何在 GWT 项目中使用 JSTL?
【发布时间】:2011-01-22 18:37:46
【问题描述】:

我正在构建一个带有 GWT-2.0.3 和 eclipse 插件的 GWT 项目。 好吧,首先我尝试了 JSTL1.2 和 servlet 2.5,

  • 我确实将 jstl-1.2.jar 添加到 war/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>
        ...
    

如果我删除 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吗?请帮忙!谢谢。

【问题讨论】:

标签: gwt jstl


【解决方案1】:

我建议只切换到外部 Java 服务器(例如 Tomcat,您似乎已经安装了它并且可以与您的配置一起使用) - 比尝试使用 GWT 附带的残缺 Jetty 更容易解决问题。

说明可以在docs 中找到。如果你坚持使用 GWT 的 Jetty,以后只会遇到更多问题。


更新,请参阅下面 Pascal Thivent 的评论:

@Pascal:抱歉,我不是说“切换到外部服务器,不要说话”,只是我在 SO 和 GWT's Google Group 上看到很多人在配置时遇到问题GWT 附带的 Jetty - 在某些情况下,这是因为配置与标准有些不同,因为 GWT 团队包含了一个较旧/修改(我无法获得关于此的任何可靠信息)版本的 Jetty,例如参见 this post和 cmets 那里,一些引号:

注意:我相信jetty的版本 随 GWT 提供的版本低于 6.1.12 并且 因此你必须离开第一个 示例文档中的参数作为它 在码头 6.1.12rc3 中添加。见 Jetty 文档顶部的注释 页。


据说Jetty支持servlet 2.5 通过 web.xml 条目进行规范和资源注入或 @resource 注释。不过,我有 尚未弄清楚这是否受支持 由 GWT 附带的 Jetty 版本。 如果有人弄清楚是否 这不起作用,如果是这样,它是怎么回事 完成请告诉我。

当有人想要使用 EJB 时会出现其他问题。

所有这些(可能以更简洁/更隐秘的方式)都写在 GWT 的文档中 - 为此我在上面提供了一个链接,指向解决此问题的确切段落。
希望这可以解决一些问题 - 切换到外部服务器似乎是最简单、最简单和最好的解决方案 - 没有“特殊 GWT”配置,这意味着您可以使用您将在生产中使用的相同配置/服务器,没有需要将您的配置迁移到,例如Tomcat,迁移后没有意外的错误等。

【讨论】:

  • 非常感谢,我想如果我切换到 tomcat 就无法使用托管模式。
  • 没有具体问题的链接,没有提到具体问题,没有参考,什么都没有。我在这个答案中唯一看到的是 FUD,
  • 你说得对,我已经编辑了我的答案来澄清这一点,希望它更少 FUD,更符合 SO 的通常(高)标准 :)
【解决方案2】:

我在为我的应用引擎项目寻找修复 JSTL 时偶然发现了这一点。我在谷歌的“Will It Play”页面上找到了答案。显然你必须添加

&lt;%@page isElIgnored="false" %&gt;

到您的 JSP 页面以启用 EL 解析。

【讨论】:

    【解决方案3】:

    我也收到此错误。

    我发现我可以通过将 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 库移回类路径来解决此问题,这看起来就像您可以在 Jetty 中使用 JSTL 或 GWT 序列化,但不能同时使用两者。

    (GWT 2.1、JSTL1.2 和 servlet 2.5。)

    【讨论】:

      【解决方案4】:
      java.lang.AbstractMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext;
      

      webapp 的运行时类路径可能被不同版本的 EL JAR 文件(旧版本或不同应用服务器的一个)弄乱了,该文件缺少提到的异常方法。我怀疑/WEB-INF/lib。摆脱它,它通常已经由相关的应用服务器提供,你不需要将它包含在你的 webapp 中。这适用于所有 appserver 库,例如 servlet-api.jar 和顺便说一句。你永远不应该将它复制到 webapp 的 /WEB-INF/lib 中。那是在寻找便携性问题。

      【讨论】:

        猜你喜欢
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 2012-10-15
        • 1970-01-01
        相关资源
        最近更新 更多