1. 程式人生 > >getServletContext() Ljavax/servlet/ServletContext;

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如果不能相容的話,就容易出現錯誤。就如上面的錯誤哩