折腾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会自动加载它。
但愿本文对读者起到抛砖引玉的做用。