Servlet.service() for servlet [jsp] in context with path [/mvcTest] threw exception [java.lang.NullPointerException] with root cause
java.lang.NullPointerException這是在用tomcat寫一個小應用時遇到的錯誤,在網上看了很多沒看明白,最終試錯n次后發現了問題,
其實這個問題(我遇到的那種情況,可能這個報錯不止我遇到的這種情況導致)的根本原因是:.jsp頁面代碼導致的,因為為了實現
前端和后台的交互,在有些jsp代碼中需要后台傳入相應的數據到該jsp中,所以jsp代碼中就有了接收的代碼段,而當我們想跳轉到該
jsp頁面時卻沒有傳入相應的數據就會報上面所示的錯誤:空指針(因為后端沒有參數傳入時那么jsp中的參數就是一個空值,而
空值是不能進行很多操作的)。我們有時直接跳到jsp頁面成功是因為該jsp頁面是不需要傳入數據的。
如何處理這個問題:當然是傳入相應的數據了,注意用request對象傳數據時,requset對象 域空間中的數據只能存活於一個請求中,
那么就可能需要多次setAttribute()和多次getAttribute()
當然如果在jsp頁面中對 用到傳入參數的相關代碼塊做判斷也是可以的,即滿足相應的條件時再執行該代碼塊
即在jsp頁面端時判斷時要加上判斷接收到的數據是否為null,不為空的話再執行含有參數的代碼塊;
你也可以自己測試,如果你想跳到相應的頁面,則直接在瀏覽器中訪問看是否可以訪問到,訪問出錯,那肯定就說明該jsp頁面是不能直接
訪問的,可能需要傳入參數,當然前提是你的代碼要是正確的;
說到這里你明白的話就不必往下看了,下面是我遇到的場景
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
當然導致這個問題的原因可能不止我下面所說的這一種。下面我先說一下我出錯時的應用場景:
我用一個servlet來管理所有的操作(簡單的增刪改查),其中需要查詢 和 注冊(增)的內容是通過表單提交的,而刪除和修改
(應用中是通過id)是通過與記錄綁定來實現是刪除那條記錄的,下面是具體的一個效果
當然進行編輯操作時需要跳轉到另外一個頁面(modify.jsp)因為編輯是和對象綁定的在前端是這樣來寫的:
這句話的作用是:點擊編輯時跳到 servlet中去執行modify方法,在servlet配置時我將<url-pattern>這一項配置為 *udo,而在dopost方法中我做了一些出來,
截取方法名,利用反射通過方法名來調用具體的方法(這個地方可以不用糾結,當然后面我會在其他文章中另外說這個問題),modify()方法中,我跳轉到了modify.jsp頁面,並且攜帶上了記錄的id信息,所以在寫modify.jsp代碼的時候,肯定就會出現接收id的相關信息,直接看運行吧
首先看我通過正確的方法訪問到該頁面:主要看瀏覽器的地址欄,傳入了id,當然這里id是先傳給servlet,servlet中的方法再轉發到相應的modify.jsp頁面去的,
轉發的話地址欄是不會改變的,所以地址欄沒有變為localhost:8080/mvcTest/modify.jsp?id=5;對這個地方不理解得話可以看一下轉發與重定向的區別。
再看一下我直接訪問modify.jsp頁面,看到這里你可能會想我直接在url上傳值過去可以訪問嗎?
答案當然可以:例如可以這樣:localhost:8080/mvcTest/modify.jsp?id=10;但是可能會造成其他的問題,我這里是修改,如果我傳入
的id數據庫中沒有怎么辦,我還是去測試一下:
直接傳id的截圖:id=100在我的數據庫中是沒有的,結果瀏覽器頁面就這樣一直空白