tomcat 中無法添加項目等問題的解決方案


博客地址:http://www.moonxy.com

一、前言

今天新建了一個 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"正常。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM