我正在使用GWT-2.0.3和eclipse插件构建一个GWT项目。 好吧,首先我试过,JSTL1.2和servlet 2.5,
,我使用:
<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?请帮忙!感谢。
答案 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
。这就要求可移植性问题。