激活碼:
最新全家桶激活碼獲取方法:https://docs.qq.com/doc/DS3hpVWFnQ2ZGVnhH
前言
學校小組Project那些外華人啥也不會, 基本上我一個人全包了前端和後端, 說實話這些天來也感受到了寫一個比較拿得出手的web確實也不是這麼容易的, 特別是我沒什麼項目經驗, 很多時候碰到問題只能自己往死裡想, 一個地方一個地方的debug. 以前我一直有點看不起web開發, 覺得web開發挺簡單的, 也沒什麼好學的, 但是再簡單的東西, 如果沒有經驗, 也簡單不起來. 這次的網頁, 實際功能不需要多複雜, 邏輯也沒有多複雜, 但是真的要實現起來確實不是想象中那樣信手拈來. 往往問題出現的地方總是你思維的死角, 知識的盲區.
項目部署debug
從昨天下午, 我照常把自己寫的網頁push到服務器上, 結果, 問題來了... 無論訪問什麼網頁, 直接404...
-
首先來簡單介紹一下我這次的改動 : 為了開發方便, 我之前jsp一直放在web的主目錄下, 然後最近差不多寫完了, 於是我就採用了典型SSH框架中的目錄結構(但是我沒用SSH框架, 準備先自己寫一個proj感受一下, 然後再用框架, 感受框架帶來的不同) : 也就是將JSP全部移到WEB-INF中, 採用Servlet截獲請求後轉發給jsp的方式. 在我的電腦上沒有任何問題, 但是一到服務器上, 就是404.
-
一看到404, 我的第一印象是配置文件有問題, 也就是說web.xml中Servlet的match pattern寫的不對. 因為在我的mac上, proj是在IDEA中開發, 然後IDEA自動將項目目錄部署, 這時候項目的根目錄就是頁面的根目錄, 而在我的服務器這邊, 我的項目放在了sixTech文件中(前面有個帖子提到了), 而這個文件所在的目錄才是網頁的根目錄. 所以我一頓改, 但是可惜, 一直是穩穩的404.
之後的幾個小時裡我嘗試在項目下非WEB-INF中加入jsp進行調試, 發現jsp可以正常執行, 另外我也可以通過這個jsp來引用WEB-INF中的JSP, 但是這裡一引用就出問題了, 問題出在jstl, 也就是典型的
This absolute uri http://java.sun.com/jsp/jstl/core cannot be resolved
, 而這個問題實際上就是簡單的jstl安裝問題, 而我使用的是jstl-1.2, 並不需要在web.xml中添加配置, 只需要簡單地在WEB-INF的lib中加入jstl-1.2jar包另外在需要使用jstl的jsp中引入即可, 但是它就是一直報這個錯, 解決方法通過控制變量排查了很久, 昨天晚上日常的鍛鍊也耽誤了, 還是沒有找到問題, 我可以100%確定我這個引入是沒錯的. 那時候整個人都是絕望的, 弄著弄著就11點多了, 日常鍛鍊也耽誤了, 帶著不甘和痛苦我只能選擇睡覺.-
今天早上起來, 我腦子稍微清醒了點, 我先是嘗試著寫了一個小的, 相對簡單的測試項目進行發佈, 在裡面我沒有使用jstl, 發現還是不行, 這顯然排除了代碼或者配置文件的問題, 而且裡面只有一個簡單的Servlet和一個jsp. 我開始思考是不是問題出現在容器端而不是我的項目端? 但是我每次開啟服務器確實沒有報錯. 最後我索性把我mac上的tomcat整個拷貝到服務器中, 又進行了一次測試, 仍然沒有問題. 這個時候我基本上已經放棄了, 我沮喪的甚至有點蒙.
這時候估計是老天開眼了, 我突然想到去看看tomcat的log文件, 這一看不得了, 發現了新的天地, tomcat的log中發現了類似 :
java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0 (unable to load class frontend.listener.StartupListener) [duplicate]
的話, 我一搜索, 發現問題了, 這是典型的編譯java使用的jdk和jre版本不符的問題. 我一查, 服務器的java版本是1.7, 我的mac不用說肯定是最新版本1.8. 這個問題的最蹊蹺之處也得到了解釋, 為什麼我寫在web-inf外的jsp能夠被執行而裡面的不行, 因為寫在外面的jsp, 是由容器(這裡是tomcat)在用戶第一次訪問時轉化為java並編譯加載的, 也就是說都發生在我的服務器上, 所以編譯加載用的都是1.7的jdk, 而我web-inf中的jsp是通過我的Servlet轉發的, 而Servlet的編譯發生在我的mac上, 在我打war包的時候就發生了, 也就是所有的Servlet是用1.8的jdk編譯, 而是用1.7的jre去執行1.8的jdk編譯出來的class, 顯然是不兼容的, 所以這個Servlet就炸了, 莫名其妙的一堆問題突然就全解決了.