在Google App Engine for Java上使用JSTL

想要在Google App Engine上部署一个Google Apps的Sample Code — Event Publisher,结果问题连连.
一方面是各种dependencies的问题,这个只能怪自己粗心. 另外一个主要的问题就是Event Publisher使用了JSTL而Google App Engine For Java对JSTL的支持有些特别.特地记录一下提醒自己.
主要问题
服务器报错500.

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

原因分析
这个错误信息还是非常有名的.Google一下发现大致的原因是getELConext()这个方法是JSTL1.2之后才支持的方法.需要Servlet API 2.5以及JSP API 2.1的支持.具体产生错误的地方包括下面这三个地方.

注意事项一:注意使用的servlet标准版本
web.xml中会标注目前支持的servlet API版本.

<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" version="2.5">
...
</web-app>

如果你使用了2.4的话,那可能会抱错NoSuchMethodError.本文的错误和这个无关,只是总结一个可能影响JSTL使用的一个因素.

注意事项二:添加jsp header
GAE for Java需要用到下面的jsp header.如果你的jstl在GAE for Java中不工作,那么可以尝试添加下面的语句.

<%@page isELIgnored="false" %>

注意事项三:jstl.jar和standard.jar
Event Publisher需要使用第三方的jstl.jar和standard.jar,所以我在GAE for Java项目中也引入了这两个类库.
但是其实GAE for Java已经提供了对JSTL的支持.而且它的实现和标准的jstl略有差异(标准的jstl.jar不认注意事项二中的tag).所以千万不要画蛇添足自己引入这两个jar文件.

OK,还有什么问题.请留言给我吧.

 

无觅相关文章插件,快速提升流量