我想映射一个servlet来提供包含'app'的请求,并以下列方式以* .html结尾
<url-pattern>/app/*.html</url-pattern>
但是在运行应用程序时它会给我一个错误
java.lang.IllegalArgumentException: Invalid <url-pattern>
/app/*.html in servlet mapping
请帮我映射一下。请提供我可以了解这些网址映射规则和约定的链接。
答案 0 :(得分:11)
这确实无效。通配符必须是分别表示后缀或前缀模式的第一个或最后一个字符。
<url-pattern>*.html</url-pattern>
或
<url-pattern>/app/*</url-pattern>
Servlet API specification的第12.2节明确规定了这一点。以下是相关摘录:
12.2映射规范
在Web应用程序部署描述符中,使用以下语法进行定义 映射:
- 以
‘/’
字符开头并以‘/*’
后缀结尾的字符串用于 路径映射。- 以
‘*.’
前缀开头的字符串用作扩展名映射。- 空字符串(
""
)是一个特殊的URL模式,它完全映射到 应用程序的上下文根,即http://host:port/<contextroot>/
形式的请求。 在这种情况下,路径信息是’/’
,servlet路径和上下文路径是 空字符串(““
)。- 仅包含
’/’
字符的字符串表示该字符串的“默认”servlet 应用。在这种情况下,servlet路径是请求URI减去上下文路径 并且路径信息为空。- 所有其他字符串仅用于完全匹配。
要解决此问题,您有两个选择:
使用/app/*
模式并执行不将非HTML文件放入/app
。把它们放在别处。
使用不同的前缀模式,例如/controller/*
,并创建Filter
映射到/app/*
并在doFilter()
方法中执行以下操作:
String uri = ((HttpServletRequest) request).getRequestURI();
if (uri.endsWith(".html")) {
request.getRequestDispatcher("/controller" + uri).forward(request, response);
} else {
chain.doFilter(request, response);
}
答案 1 :(得分:0)
你什么时候收到这个错误?您使用的是什么app-server / web-server?另外,请检查/ app是否正在其他地方映射。