运行servlet遇到 java.lang.IllegalArgumentException: Invalid [admin/admin] in servlet mapping
查看控制台错误信息如下:

Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [admin/admin] in servlet mapping
	at org.apache.catalina.core.StandardContext.addServletMappingDecoded(StandardContext.java:3178)
	at org.apache.catalina.Context.addServletMappingDecoded(Context.java:881)
	at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1391)
	at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1168)
	at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:774)
	at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301)
	at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5051)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)

可以通过错误信息知道,出错是因为java.lang.IllegalArgumentException: Invalid [admin/admin] in servlet mapping

解决这个问题,需要先了解servlet容器对url的匹配过程:

当 一个请求发送到servlet容器的时候,容器先会将请求的url去掉当前应用上下文的路径作为servlet的映射url,比如我访问的是 http://localhost/admin/login.jsp,我的应用上下文是test,容器会将http://localhost/admin去掉, 剩下的/login.jsp部分拿来做servlet的映射匹配。
在web.xml文件中,以下语法用于定义映射:
l. 以”/’开头和以”/”结尾的是用来做路径映射的。
2.以前缀”
.”开头的是用来做扩展映射的。
3.“/” 是用来定义default servlet映射的。
4.剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action

具体匹配顺序和规则是:
step1精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的 servlet了。
step2最长路径匹配。例子:servletA的url-pattern为/test/,而servletB的url-pattern为/test/a/,此 时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
step3扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。
.action匹配全部action 结尾的请求
.css 匹配全部 css结尾的请求
* 不能用 * ,否则报错
容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。
step4:如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet。

所以这里出错的原因是在@WebServlet(“admin/admin”)中第一个admin前没有“/”,导致servlet匹配url过程中出错。

tips:
在查询资料过程中,类似的错误还有在配置url的是写成**/test/*html**之类的也会出现匹配错误,具体原因参见扩展匹配。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐