尝试用idea通过maven生成war包,然后用tomcat发布,参照Servlet入门这篇文章一步一步执行,但是到了发布阶段出现了如下图
立马傻眼了,是我的程序写的有问题?无法解析servlet,还是配置有问题?为了弄明白问题到底出在哪,我做了如下尝试:
- 重新查看自己编写的servlet,也没发现什么,毕竟就那么几行,又从网上找了一个例子例子2,两个例子差不多,最后发现依旧出现上面的图片。
- 程序没有问题,那可能是war包打的有问题,毕竟我也是第一次用maven,索性重新创建一个普通的项目,参照例子2只生成class文件,并把文件放到tomcat安装目录\webapps\ROOT里,结果正确显示了内容,此时证明我的war包可能真的有问题。
- 仔细看了一下war包,实际上就是一个按照特定目录结构的压缩文件夹,从网上查找可以通过jar -cvf xxx.war . 这个命令把相关文件夹手工打成war包,一个class文件+一个web.xml文件+特定的目录(WEB-INF、META-INF),这个动作看着简单,但是也经过一番波折,如果目录结构不对在tomcat启动过程中会有提示,这部分内容还是要仔细看的
上面这个截图是没有问题的,如果有问题例如war包结构不对,会有一行警告信息。
- 我把第2步ROOT里的文件手工打了一个war包,放到webapps这个目录中,还是出现“Directory listing for”这个图片,看来不是war包的问题,一定是配置出错了。
- 当时我的web.xml以及对应的文件目录结构如下图,
在浏览器输入localhost:8080/dpcv/出现“Directory listing for”,正当我一筹莫展之时,我突然输入了localhost:8080/dpcv/dpcv/ 正确的结果出现了,顿时两眼放光,一丢丢的小兴奋啊,到底是什么原理呢?
接下来就是找到答案,也就是理解《servlet-mapping》这个标签的含义,当我在浏览器里输入localhost:8080/dpcv/时,实际上找的是webapps里dpcv这个文件夹,而实际上我想访问的是dpcv这个servlet,《servlet-mapping》就是负责这个映射的,也就是在localhost:8080/dpcv/个目录的基础上,我要再访问/dpcv才能得到dpcv这个servlet,然后通过《servlet》标签,获取实际的class文件,理解了这个过程就可以随心所欲的配置web.xml了
接下来未来验证自己的推断,我又编写了一个My.class文件,并把它放到了dpcv这个war包里,web.xml如上
如果我访问My.class只需要localhost:8080/dpcv/456/ 即可,如果还需要访问dpcv.class 则需要localhost:8080/dpcv/123
bingo
再记一下过程中的其他小常识吧
通过shutdown.bat关闭tomcat有时候无法停止,需要手工杀死相关进程,可以先通过netstat -ano|findstr “8080” 查看进程号,再通过taskkill F /PID 进程号 杀死进程