最近做程序时
就是自定义一个 JSTL 标签,输出文字到 JSP 中
遇到这个错误
java.lang.NoSuchMethodError: javax.servlet.ServletContext.getContextPath()Ljava/lang/String;
我翻开java ee 的jar包,里面明明有这个方法呀,居然敢说没有,颠倒是非,郁闷呀。后来google了一下,在下面的地址
http://www.mojavelinux.com/wiki/doku.php?id=java:developmentnotes
找到了一点线索:
This exception results from attempting to use Java EE 5 components (such as JSF 1.2) in a J2EE 1.4 environment. Either the container does not support Java EE 5 or you have the 2.4 servlet API somewhere in the runtime path.
我用的是tomcat 5.5 , MyEclipse 7.5, JSTL 1.2 用的也都是java EE 5 的jar包,后来猜猜可能是 JSTL 版本问题,经我多方查找,果然不出所料,在下面的地址:
http://blog.csdn.net/Jack850703/archive/2009/05/08/4160827.aspx
找到
分 析:这个问题网上找了半天没看到解决方法,只好自己想办法。想起先前看到的一个知识 点:tomcat 6 实现了 servlet 2.5 和JSP2.1的规范相应的 tomcat 5 实现的是 2.4和2.0,想到tomcat5不支持JSTL1.2,于是替换JSTL1.1的包试试看后,问题解决
解决方法:移出工程lib目录中的JSTL1.2.jar,添加standard-1.1.jar和JSTL1.1.jar
总结:
jstl1.1 版本由2个必要包构成:standard-1.1.jar和 JSTL1.1.jar;而jstl1.1版本只有一个必要包JSTL1.2.jar。(一开始在替换的过程中想当然的用JSTL1.1.jar换 JSTL1.2.jar,然后遗漏了standard-1.1.jar,耽搁了不少时间。)
经测试,tomcat6.0支持JSTL1.2版本,也支持JSTL1.1版本;tomcat5.5只支持JSTL1.1(JSTL1.1一下版本未测试)
不 建议将2个版本的3个包同时放在工程中,可能会发生版本冲突。(另外,实际操作的时候发现 JSTL1.2.jar和JSTL1.1.jar这2个包放一起可以在tomcat5.5和tomcat6.0上跑,鉴于JSTL1.1.jar里面没有 c.tld等文件,猜测JSTL1.1.jar里面只是放置了1.1的专用的类和信息)
也就是说
tomcat 5.5 不支持 JSTL 1.2, 要换成tomcat 6 才支持。