用Java开发的项目,因为很简单,所以用的依然是Servlet。之前一切正常,但是新增了一个Servlet之后,部署到服务器,却总是启动失败,控制台打印的东西很多,但是分析发现主要错误应该是这个地方:
Caused by: java.lang.IllegalArgumentException: The servlets named [RevelationServlet] and [cn.lzgd.servlet.RevelationServlet] are both mapped to the url-pattern [/RevelationServlet] which is not permitted。意思应该是这两个Servlet同时部署到这/RevelationServlet这一个路径了。
但是web.xml里面我只部署了这一个啊,没有重复啊。
<servlet> <display-name>RevelationServlet</display-name> <servlet-name>RevelationServlet</servlet-name> <servlet-class>cn.lzgd.servlet.RevelationServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>RevelationServlet</servlet-name> <url-pattern>/RevelationServlet</url-pattern> </servlet-mapping>
找其他地方也找不到哪里的问题。试着将web.xml里面对应的这个Servlet的路径删掉,竟然可以启动了!看来就是这个地方的问题。但是也不能不部署啊,找来找去,问题还是没有解决。只要在web.xml里加上对这个Servlet的url-pattern的指向就会出错。
上网查找了半天,大都是说web.xml的部署重复,到哪里复制一份web.xml过来就好了之类,根本无法解决问题。
正在郁闷的时候,无意间发现Servlet的代码里面,在类前面,有这么一句:@WebServlet("/RevelationServlet"),这不就是提示说重复的那个路径么,原来在这里!去查看其它没有问题的Servlet,前面却没有这么一句。基本断定是在这里重复的了,因为在web.xml里面也指向了这个路径。试着删掉这一句,果然tomcat可以启动了。
那么问题来了,既然在Servlet的代码里已经写了这么一句了,是不是在web.xml里面就不用再部署了呢,换句话说这两个地方的作用是等同的呢?于是果断将web.xml里面关于这个Servlet的部署给删掉,依然能运行。
至此,终于真相大白。因为新建Servlet的时候都会自动生成这一句代码:@WebServlet("/RevelationServlet"),已经声明了通过这个路径就可以找到这个Servlet,而如果再去web.xml里面去声明,当然就重复了。其他的Servlet为什么没有出现问题,是因为在其他Servlet在编辑之前我都把这句当做无用的内容给删掉了。看来这自动生成的代码还是要慎重删除。
不得不承认,虽然多年前就开始接触java,但是到今天对java仍然是一知半解,有很多东西不知道是什么意思,只是看别人怎么做,就怎么做。具体是谁教我要在web.xml里面部署Servlet路径的也是忘了,也许以前的Eclipse版本不会自动生成这一句代码,而新版本可以自动生成。学习还是不要只停留在表面,多去探索一下为什么比较好。
本文出自 “穿越丛林” 博客,请务必保留此出处http://luqyu.blog.51cto.com/1663183/1615271
原文:http://luqyu.blog.51cto.com/1663183/1615271