博客地址:http://www.moonxy.comhtml
1、前言java
今天新建了一個 maven 項目,添加程序文件以後,發現沒法添加項目,而後修改配置,將應用添加到了 tomcat,啓動時又報錯,解決出現的錯誤後,再啓動,又發現找不到首頁,而後也須要設置一下,訪問到首頁以後,修改後的 jsp 和 java 文件等不能實時編譯生效,而後還有中文亂碼的問題,通過一番努力終於解決了,現作以下概括。web
2、解決方案數組
2.1 tomcat 沒法添加工程瀏覽器
右鍵 tomcat,Add and Remove...,沒法找到項目,以下:tomcat
咱們回到項目目錄,選擇須要添加的項目,右鍵選擇 Properties 選項,也能夠直接按住快捷鍵 Alt+Enter 打開 Properties 對話框。服務器
在左側,點擊 Project Facetsapp
在右邊勾選如圖示的三項:Dynamic Web Module、Java、JavaScript。點擊 Apply,Apply and Close,等待更新配置結束,會自動退出。eclipse
再次給 tomcat 添加項目,發現已經顯示在了左邊,以下:webapp
這樣,就可將項目添加到 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"正常。