如何在GWT项目中使用JSTL?

时间:2010-03-02 15:13:51

标签: gwt jstl

我正在使用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的jetty服务器版本应该是6.1,但我不确定,如果确实如此,它应该支持EE5,那么任何人都集成了GWT和JSTL?请帮忙!感谢。

4 个答案:

答案 0 :(得分:2)

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

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


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

@Pascal:对不起,我不是故意只说“切换到外部服务器,不说话”,只是我看到很多人在SO和GWT's Google Group上有配置GWT附带的Jetty的问题 - 在某些情况下,这是因为配置与标准有些不同,因为GWT团队包括旧版/修改版(我无法获得任何可靠的信息)版本的Jetty,例如参见{ {3}}并在那里发表评论,引用:

  

注意:我相信码头的版本   随GWT一起发货低于6.1.12和   因此你必须先离开第一个   示例文档中的参数为   在jetty 6.1.12rc3中添加了。见   请注意Jetty文档的顶部   页。


  

据说Jetty支持servlet   2.5通过web.xml条目注入规范和资源注入   @resource注释。但是,我有   还要弄清楚这是否得到支持   由GWT附带的Jetty版本。   如果有人弄清楚是否或   这不是有效的,如果是这样的话   请告诉我。

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

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

答案 1 :(得分:2)

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

<%@page isElIgnored="false" %>

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

答案 2 :(得分:1)

我也得到了这个错误。

我发现我可以通过将GWT SDK移动到Eclipse Java Build Path中类路径的底部来修复它 - &gt;订单和导出对话框。

但是,这会破坏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。)

答案 3 :(得分:0)

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

webapp的运行时类路径可能会混杂使用不同版本的EL JAR文件(旧版本或不同的应用程序服务器),这些文件缺少所提到的异常方法。我怀疑/WEB-INF/lib。摆脱它,它通常已经由相关的appserver提供,你不需要将它包含在你的webapp中。这适用于所有appserver库,如servlet-api.jar和顺便说一下。你永远不应该将它复制到webapp的/WEB-INF/lib。这就要求可移植性问题。