折騰Tomcat折騰了兩個晚上,第一個晚上怎麼都進不了Tomcat的首頁,第二個晚上進去了,可是新建的Web項目,在瀏覽器中運行,老是 Error on Apache Tomcat: The requested resource is not available 坑爹!!!!。html
首先我要說一點,在IntelliJ IDEA裏面「new Project」就至關於咱們eclipse的「workspace」,而「new Module」纔是建立一個工程,這是要注意的一點。java
最終多虧了某大神這篇文章的一句話,但願之後遇到一樣問題的朋友,都能快速解決。這篇文章的做者明顯工做在Mac OS X下,無奈我知之甚少,我仍是在windows下進行了配置。具體在某些方面有誤差的,個人問題會本身用小字體批註。web
這標題實在有點拗口,不知道怎麼寫好,但看了標題也就明白文本的內容。最近幾天在折騰這些玩意兒,因此寫寫總結。除了環境搭建,本文仍是一篇入門級的上手教程。apache
老樣子,先廢話幾句,IntelliJ IDEA,這個名字不知道誰想出來的,也真夠拗口的,發音大體如此:[in 'te li dʒei ai di: i: ei],我仍是簡稱之爲IntelliJ吧,「Intel」有「智能」的意思,IntelliJ也自稱最智能的Java集成開發環境。我此次使用的是最新 的版本——13.1,能夠在jetbrains.com的官方網站上下載:http://www.jetbrains.com/idea/小程序
Tomcat是Java的web服務器,目前最新版是8.0.5,能夠從這裏下載到:http://tomcat.apache.org/download-80.cgivim
固然了,搞Java開發,JDK是必須的,JDK的最新版是8u5,也就是Java8的第5個更新版本,能夠從這裏下載到:http://www.oracle.com/technetwork/java/javase/downloads/index.htmlwindows
此次所有搞到最新的了!不要跟我說什麼新版本不穩定不成熟,我不聽。:)api
JDK的安裝是很簡單的,裝載dmg鏡像,而後雙擊圖標運行安裝程序,會安裝到這個位置:/Library/Java/JavaVirtualMachines,貌似不須要什麼額外的其它配置了。瀏覽器
環境變量的配置在windows下,百度經驗很好,貼個連接http://jingyan.baidu.com/article/f96699bb8b38e0894e3c1bef.html
tomcat
Tomcat並不區分Linux版和Mac版(但Windows版倒是要區分的),下載下來就是一個tar.gz包,真正 的綠色軟件,解壓,放到合適的位子去,就算完成安裝了。通常來講,是放到/usr/local去,/usr目錄就至關於Windows的「program files」目錄嘛。但此次我不知道咋搞的(忘了當時參考了個啥文檔了),竟然弄到/Library下面去了:/Library/Tomcat /apache-tomcat-8.0.5。(若是遇到權限問題的話,就用root帳號上去chmod一下)
我習慣性地不修改默認的目錄名,依然叫「apache-tomcat-8.0.5」,但我會作一個軟連接指向這個目錄:
$cd /Library/Tomcat $ln -s apache-tomcat-8.0.5 Home
這樣就能輕易用/Library/Tomcat/Home去訪問tomcat了。這樣作還有一個好處,哪天Tomcat更新的新版本, 我直接把Home指向新版本的目錄便可,其它關於對Tomcat的路徑引用的配置不用改,舊的版本能夠繼續保留用於測試,要換回去也很簡單,改一下 Home的指向便可。
啓動Tomcat:
$cd /Library/Tomcat/Home/bin $./startup.sh
當即用瀏覽器訪問一下:http://localhost:8080/,你應該能看到:
(坑爹!第一天晚上這個居然一夜都沒有出現這個界面,locathost:8080就是不行啊,localhost直接進入iis7界面,我一狠心把iis7卸載了,仍是不行,不過反過來想一想,關人家iis嘛事,人家默認使用的貌似是80端口~~~
具體的問題是,在運行startup.bat時候,下面的這個dos界面老是一閃而過,有人說在末尾加pause,讓它暫停,看一下出錯信息,因爲該文件當時不讓我改,也懶得備份(好膚淺的理由,明明能夠改),因此就沒有更改。最後的最後呢,讓我發現問題了,就是Java_Home的問題了,師姐之前在電腦上裝了一個1.6,我又裝了一個1.8,Java_Home仍是1.6的路徑,而後他就不行了。。。最後更新一下Java_Home環境變量,通關~~至於事故緣由,待查,還有startup.bat文件具體實現了什麼操做,下一篇再說。。。)
這個默認的頁面包括了不少有用的東西,不過我想最有用的應該是Documentation,有空的話,真的值得看看,大多數問題都能在 那裏找到答案。也許你還想點「Server Status」按鈕看看服務器狀態,但你立刻發現不行,你沒有設置管理員的用戶名/密碼,它不讓你看。(後面我會講如何弄)
若是你看不到這個頁面,必定是哪裏出了什麼問題,要查看Tomcat的的日誌去找緣由,日誌在這個目錄下:/Library/Tomcat/Home/logs,日誌文件名與日期相關,好比:「catalina.2014-05-12.log」。
中止Tomcat:
$./shutdown.sh
可能你還注意到bin目錄下有一些bat文件,那是給Windows準備的,能夠刪除掉。
另外,重啓tomcat的方法是:先shutdown,而後再startup,不能直接startup,貌似沒有一個直接restart的腳本(也許你能夠本身寫一個)。
配置管理員用戶名密碼,剛纔你不是想查看服務器狀態結果不行嗎?在這裏配:
$vim /Library/Tomcat/Home/conf/tomcat-users.xml
在<tomcat-users>節點中加這麼一行:
<user username="admin" password=「123456" roles="manager-gui" />
就設置好了一個叫admin的管理員,密碼是123456。(這也能叫密碼?)重啓Tomcat生效。
須要在localhost後面加上8080會讓你感到不爽,你想把這個去掉,使用默認端口號80,能夠在這裏配置:
$vim /Library/Tomcat/Home/conf/server.xml
找到這一行:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
把8080改成80便可。但!且慢,因爲系統權限的問題,80端口不是隨隨便便誰都能開啓的,你須要root權限來運行Tomcat,不然綁定端口 就會失敗。我建議是放棄,畢竟誰會用本身的Mac來作服務器呢?但我會把8080改成8079,這是由於後面用IntelliJ調試程序的時 候,IntelliJ會啓動新的Tomcat實例,你們都習慣性地使用8080這個端口,爲了不這個衝突,把默認的8080改一下是有必要的。
順便提一下,在Mac下想知道哪些端口被佔用了,能夠用:
$sudo lsof -i | grep LISTEN
在Linux下能夠用netstat,但Mac下的netstat命令貌似跟Linux下的出入蠻大,不知道爲何會這樣。
windows 下能夠經過以下方式查詢,第一條命令查看各端口使用狀況,第二條命令查看8080端口,發現其進程父ID 6940 ,再經過第三條命令查看ID 6940,是Java.exe
C:\Users\pc>netstat -ano 活動鏈接 協議 本地地址 外部地址 狀態 PID TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 804 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 0.0.0.0:902 0.0.0.0:0 LISTENING 3808 TCP 0.0.0.0:912 0.0.0.0:0 LISTENING 3808 ... ........... ......... ......... .... C:\Users\pc>netstat -aon|findstr "8080" TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 6940 C:\Users\pc>tasklist|findstr "6940" java.exe 6940 Console 1 43,492 K
雖然沒有絕對的安全,但大牛們說「不用SSL的安全都是‘僞裝安全’」。因此……
先來看看Tomcat的結構圖(此圖來自於傳智播客的教學視頻,因此不太清晰,湊合看看):
從圖中能夠看出,咱們要配置https其實就是要配置Connector,Connector在以前配置端口的地方已經接觸過了,有印象吧?固然,咱們還得準備些材料。那就是密鑰,準備方法以下圖:
若是你的我的目錄(即「cd ~」轉到的目錄)已經有「.keystore」,那麼還要提示你輸入密鑰庫的口令,我這裏祕鑰庫的口令是654321,tomcat這個密鑰的口令也是654321。
這樣一來,就在你的密鑰庫中建立了一個叫tomcat的密鑰,其中只指明瞭「名字與姓氏」的信息爲localhost,別的均可以留空。完以後你能夠看看.keystore究竟是個什麼玩意兒:
$od ~/.keystore
其實啥都看不出來,一堆加密的二進制碼。
接着就是Tomcat的server.xml文件了:
$vim /Library/Tomcat/Home/conf/server.xml
在<Service>節點中加一個<Connector>節點:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystorePass="654321" />
注意,一點都不能寫錯,包括字母大小寫都要徹底寫正確方可。保存,重啓服務器,打開:https://localhost:8443/
Safari瀏覽器提示你沒法驗證localhost身份,這是很顯然的,你的證書是你本身造的,沒有CA(證書頒發機構)的擔保,因此瀏覽器默認是不信任你的,但你能夠選擇「繼續」。
提示:https在實際生產環境中是很是有用的東西,但在開發環境中沒什麼用,咱們只須要知道有這回事,這裏先把這個配置拿掉。不拿掉的話後面運行程序的時候可能會出現一個8443端口被佔用的錯誤提示。(儘管此錯誤其實也無關痛癢)。
有兩種方法:
第一是直接把應用放在webapps目錄下,Tomcat會自動解釋;
另外一種是在conf/Catalina/localhost下面放入一個xml文件,如放一個叫test.xml的文件,內容是:
<Context docBase="/Users/guogangj/test" />
而後在/Users/guogangj/test下建立一個index.html,隨便寫點內容:
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> test </title> </head> <body> <h1>test</h1> </body> </html>
而後訪問:http://localhost:8079/test/index.html,就能看到test這幾個大字了。
下載的安裝包是個dmg,安裝無壓力,打開並拽入「應用程序」中便可。直接運行,根據提示進行一些默認的配置便可。
說實在的,IntelliJ的項目建立方式不如其它IDE的直觀,反正我一開始是沒搞懂(其實搞懂也很簡單),另外IntelliJ的不一樣版本之間 是有差別的,網上找的一些資料並不許確,最好仍是直接看官方文檔,根據它的Tutorial走走,此次我看的官方文檔是針對IntelliJ v12的,而如今我用的是v13,所幸的是差異並不大。
New Project,而後這樣選:
那個Versions只能選3.1,貌似以前還能選3.0,這個版本實際上是Servlet的版本,最新的版本是3.1,須要用Tomcat8來承 載,若是你選擇用Tomcat7來承載的話,會有一個warning說不認識這個版本,使用默認版本云云,忽略這個warning就是。
在下一步中指定項目名,SDK果斷選擇最新的1.8(Java8):
這樣一來你的服務器的運行環境得部署爲Java8,不過這個也沒啥壓力,Java8多了很多頗有用的新特性,若是沒有什麼歷史負擔的話幹嗎不用?
Finish,咱們如今來看看整個project的結構:
.idea 這是IntelliJ的相關東西,咱們不用管,src目錄用於放java源文件,web目錄用於放web資源,WEB-INF是java web應用固定的存放配置及類庫的目錄,index.jsp是咱們首頁,HelloWorld.iml是IntelliJ的項目文件,打開工程就是打開它 了,External Library是一些外部引用的庫,展開看看好多。
如今咱們來建立一個Servlet,Servlet是Java的服務器端小程序(其實也能夠不小),右擊src目錄:
而後命名爲SayHello:
展開,打開SayHello.java的時候卻發現IntelliJ提示找不到符號:
這必定是由於某些包沒引用。如何引用?通常都是設置CLASSPATH,告訴java如何去找它的包,而這裏咱們能夠直接指定包的位置。
打開Project Struture設置對話框(快捷鍵爲<Cmd>+<;>),如圖:
點加號,選「Jars or directories…」,再找到Tomcat下的servlet-api.jar。
這樣就能夠了,咱們把doPost刪掉,用不到,再在doGet方法中寫點東西輸出,SayHello.java就變成這樣:
package com.mycompany; import java.io.IOException; import java.io.PrintWriter; /** * Created by guogangj on 14-5-13. */ public class SayHello extends javax.servlet.http.HttpServlet { protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } }
java的代碼寫好了,配置文件也要加點東西,打開web.xml,加上一個「<servlet-mapping>」節點,改完後的web.xml變成這樣:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>SayHello</servlet-name> <servlet-class>com.mycompany.SayHello</servlet-class> </servlet> <servlet-mapping> <servlet-name>SayHello</servlet-name> <url-pattern>/sayhello</url-pattern> </servlet-mapping> </web-app>
編譯(<Cmd>+<F9>),經過無壓力。但,怎麼運行?
Java Web項目沒法單獨運行,它須要一個程序來承載(Host)它,這和微軟體系的東西是很相似的,ASP.net程序須要IIS來承載對不?而如今咱們很明顯須要用Tomcat來承載這個Web程序。
首先咱們要配置好Tomcat,<Cmd>+<,>打開IntelliJ的配置。
如上圖那樣配置好Tomcat。
而後打開Project的運行配置:
繼續看圖:
再看圖,如此般設置:
這裏它提示你有個問題,說缺少artifacts配置,你能夠順着它的指引,fix一下便可。點OK。
此次能夠跑了,<Shift>+<F10>。注意看IntelliJ的輸出窗口裏有什麼提示信息,若是有,想一想看是什麼緣由,我經常會碰到一些端口沒法打開的問題,通常都是端口被佔用了。
IntelliJ運行Java Web程序的時候會開啓新的Tomcat實例,極可能會和以前運行的Tomcat實例發生衝突,解決衝突的最快的辦法一般是直接把以前運行的Tomcat shutdown掉。
如今看看運行的成果吧:http://localhost:8080/sayhello
是否是看到「Hello World!」?這是用Java代碼輸出的「頁面」,而不是靜態頁面。
工程編譯後生成的內容在/work/HelloWorld/out/production/下,咱們要對其中的內容進行打包的話,能夠這樣:
$tar cvf HelloWorld.war /work/HelloWorld/out/production
IntelliJ固然也能夠幫助你作這個動做,如圖:在工程配置中選擇artifact的類型,artifact不知道中文怎麼翻譯好,在不少遊戲中,它都被翻譯爲「神器」,但這裏能夠簡單把它理解爲Java的發佈包。
這樣你就能在其中指定的Output directory中找到那個War包了,把War包直接丟到Tomcat的webapps目錄下,Tomcat會自動加載它。
但願本文對讀者起到拋磚引玉的做用。