一、前言
今天新建了一個 maven 項目,添加程序文件之后,發現無法添加項目,然后修改配置,將應用添加到了 tomcat,啟動時又報錯,解決出現的錯誤后,再啟動,又發現找不到首頁,然后也需要設置一下,訪問到首頁之后,修改后的 jsp 和 java 文件等不能實時編譯生效,然后還有中文亂碼的問題,經過一番努力終於解決了,現做如下歸納。
二、解決方案
2.1 tomcat 無法添加工程
右鍵 tomcat,Add and Remove...,無法找到項目,如下:
我們回到項目目錄,選擇需要添加的項目,右鍵選擇 Properties 選項,也可以直接按住快捷鍵 Alt+Enter 打開 Properties 對話框。
在左側,點擊 Project Facets
在右邊勾選如圖示的三項:Dynamic Web Module、Java、JavaScript。點擊 Apply,Apply and Close,等待更新配置結束,會自動退出。
再次給 tomcat 添加項目,發現已經顯示在了左邊,如下:
這樣,就可將項目添加到 tocmat 中了。
2.2 tomcat 啟動時報錯
tomcat 啟動時報錯:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].
出現這個錯誤,多半情況是找不到依賴的 jar 包。
進入項目的 Properties 對話框,左側點擊 Deployment Assembly,進入如下界面:
點擊 Add...,選擇 Java Build Path Entries,如下:
點擊 Next,選擇 Maven Dependencies,點擊 Finish,如下:
點擊 Apply 之后,就可以正常啟動 tomcat 了。
2.3 啟動 tomcat 后,發現無法訪問首頁
訪問項目 http://localhost:8080/esnews/,發現無法訪問首頁,首先想到的是在 web.xml 中沒有配置默認首頁,如下檢查 web.xml:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>esnews</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
發現 web.xml 配置了首頁,然后找到項目在 tomcat 中的部署目錄:
點擊進入項目之后,發現沒有 jsp 文件。
首先確保編譯配置正常,如下:
test 下的目錄編譯到 target/test-classes,其他編譯到 target/classes 目錄即可,其他一般默認不需要改變什么。
然后進行部署的配置,繼續進入 Deployment Assembly,點擊 Add...,選擇 Folder,如下:
添加項目的 jsp 文件所在的 webapp 目錄,如下:
點擊 Apply 應用之后,重啟 tomcat,再次訪問項目,發現可以正常訪問了。
2.4 修改 jsp 和 java 文件后,不能實時編譯生效
tomcat 啟動后,在 eclipse 中 編輯 jsp 和 java 文件,發現不能實時編譯生效。
1)確保開啟自動編譯
2)確保開啟 tomcat 中的自動發布
開啟自動發布之后,修改的 jsp 會立即生效,tomcat 不會重啟;修改 java 文件后,tomcat 會自動重啟。
3)關閉 tomcat 的自動重啟
將對應項目的 Context 標簽中的 reloadable 設置為 false,這樣在 修改 java 文件后會自動編譯,tomcat 不會自動重啟,但在 tomcat 中會即時生效。
2.5 servlet 獲取中文參數亂碼
request 請求參數出現的亂碼問題
get 請求:
對於 URL 中的中文參數,瀏覽器會對中文進行 urlencode,轉為16進制進行傳輸,tomcat 不會再對數據進行編碼,只會解碼,默認按照 8859-1 進行解碼,然后通過.getBytes("ISO-8859-1") 編碼(還原傳遞過來的16進制數組),再通過 UTF-8 解碼。流程就是:urlencode編碼(utf-8)--> tomcat 解碼(ISO-8859-1) --> 自行編碼(ISO-8859-1,相當於還原)--> 解碼(utf-8)。
tomcat 8 之前的默認編碼是 ISO-8859-1,而 tomcat 8 的默認編碼為 utf-8。
post 請求:
post 請求方式的參數是在請求體中,相對於 get 請求簡單很多,沒有經過 urlencode 這一步的編碼過程,所以只需要在服務器端,設置服務器解碼的碼表跟瀏覽器編碼的碼表是一樣的就行了,在這里瀏覽器使用的是 UTF-8 碼表編碼,那么服務器端就設置解碼所用碼表也為UTF-8 就可以了。
設置服務器端使用 UTF-8 碼表解碼
request.setCharacterEncoding("UTF-8"); //命令 Tomcat 使用 UTF-8 碼表解碼,而不用默認的 ISO-8859-1 了。
所以在很多時候,在 doPost 方法的第一句,就是這句代碼,防止獲取請求參數時亂碼。
總結請求參數亂碼問題
get 請求和 post 請求方式的中文亂碼問題處理方式不同
get:請求參數在請求行中,涉及了 http 協議,手動解決亂碼問題,,其原理就是進行兩次編碼,兩次解碼的過程
new String(xxx.getBytes("ISO-8859-1"),"UTF-8");
post:請求參數在請求體中,使用 servlet API 解決亂碼問題,其原理就是一次編碼一次解碼,命令 tomcat 使用特定的碼表解碼。
request.setCharaterEncoding("UTF-8");
使用 request.setCharacterEncoding() 只能用來處理 POST 請求,對 GET 則無效。
當然也可以使用 GBK,但是建議使用 UTF-8:
一般默認安裝的tomcat應用服務器的接收get方式提交的數據是以ISO-8859-1方式處理的,假如服務器接收的url鏈接是以gbk方式加密的。那么你需要解碼才能對上邊的中文進行正確的識別。否則你服務器接收到的就是亂碼。一般的解碼操作的方法是new String(request.getParameter("zhongwen").getBytes("ISO-8859-1"),"GBK"),意思就是將獲取的數據轉成GBK。
如果你不想進行解碼操作,那么有一種方案就是將服務器的接收方式直接設定成 GBK,這個時候就不需要進行轉碼了。直接 request.getParameter("zhongwen"); 就能獲取正確的經過gbk編碼過的數據。
具體操作方式,在 tomcat/conf/server.xml 中增加一個配置參數:URIEncoding="GBK"(此處是針對gbk編碼的設定)
最終更改文件的位置在:
<Connector port="80" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
就是在你更改 tomcat 端口的地方。Connector 上增加這么一個參數就 ok 了。
2.6 Java 文件路徑錯誤導致無法編譯
有時候 Java 文件的編輯器打開時會出現如下狀態,顯示的是 "空心J":
而且該 Java 無法編譯,使用的編輯器也不對,出現這種情況的原因就是,當前 Java 文件所處的目錄不對,導致文件無法被編譯到 classpath 中。
修改 Java 文件目錄后打開,顯示 "實心J"正常。