getServletContext() Ljavax/servlet/ServletContext;

java.lang.NoSjavax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;
java.lang.NoSjavax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;

     同事的电脑上能跑得动的代码,上传到服务器出现错误。帮同事调试了一下错误,稍微分享给大家 ~~ 如果你出现了上述的错误,希望对你有帮助
一、错误信息如下:
1.0 错误代码如下:

严重: Servlet.service() for servlet springMvc threw exception
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;
    at com.fh.controller.store.StoreController.upload(StoreController.java:402)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

2.0 点击错误的信息

String path2 = request.getServletContext().getRealPath("/");

这里写图片描述
二、错误解释如下:
(1)综合来看,是你j2ee容器(也许是tomcat)自带的api规范不是3.0的,或者tomcat版本过低,并没实现3.0规范导致。看下tomcat自带lib下的servlert-api.jar 这个包的版本。
(2)如何验证呢? 到tomcat–>lib–>解压jsp-api.jar和servlet-api.jar–>解压文件夹–>META-INF–>用记事本打开:MANIFEST.MF文件
解压后的信息如下:一看就是自己的版本太老了,看不到更详细的信息。下面截图是tomcat6自带的servlet-api.jar包
这里写图片描述
(3)这里解压tomcat7关于上述两个包的版本信息

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.4
Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.)
X-Compile-Source-JDK: 1.6
X-Compile-Target-JDK: 1.6

Name: javax/servlet/jsp/
Specification-Title: Java API for JavaServer Pages
 //版本信息
Specification-Version: 2.2 
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: javax.servlet.jsp
Implementation-Version: 2.2.FR
Implementation-Vendor: Apache Software Foundation
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.4
Created-By: 1.6.0_45-b06 (Sun Microsystems Inc.)
X-Compile-Source-JDK: 1.6
X-Compile-Target-JDK: 1.6

Name: javax/servlet/
Specification-Title: Java API for Servlets
 //版本信息
Specification-Version: 3.0
Specification-Vendor: Sun Microsystems, Inc.
Implementation-Title: javax.servlet
Implementation-Version: 3.0.FR
Implementation-Vendor: Apache Software Foundation

你看,tomcat7的jsp-api也只是2.2的版本。更加说明了tomcat6的版本过低。估计tomcat8自带的jsp-api版本就是3.0及以上的。

三、解决方法
1.0 网上很多解决方法都是替换jar包,提升更高版本的jar包。例如:拷贝tomcat8版本的jsp-api替换原来的jar包。或者下载最新的jar包
【提示】:我个人是不希望这样解决的。别忘了我的tomcat版本是6.0的,替换高版本的jsp-api.jar。不知道后续会不会有一些用到jsp新特性的方法对我的tomcat6有要求。这样就很难排查了。更换了高版本的jar包之后是完全可以跑得动的~~ 亲测可以。
2.0 问题出在新的写法上,该代码的初衷是获取项目根路径。改成老版本的写法即可

//由原来的
String path2 = request.getServletContext().getRealPath("/");
//改成
String path2 = request.getSession().getServletContext().getRealPath("/");

然后问题就完美解决了
这里写图片描述
       发现我同事使用的是jdk8+tomcat8。这样子他本地的项目是完全没有问题的。但是到了我低版本的tomcat6就出现了问题。这里给大家一个小小的建议。个人建议你的web开发环境跟公司同步。以上述例子来讲。如果公司使用tomcat7+jdk1.7。你用tomcat6+jdk1.6去跑tomcat7+jdk1.7的项目,项目可能会出现一些tomcat6+jdk1.6没有的新特性。又如你用tomcat8+jdk1.8的环境去跑公司项目,你本地应该是没有问题的,tomcat1.8+jdk1.8会向下兼容,完美过渡。但是你上传代码到服务器的时候,tomcat7+jdk1.7如果不能兼容的话,就容易出现错误。就如上面的错误哩

猜你喜欢

转载自blog.csdn.net/xiaozhegaa/article/details/79219614