映射servlet以满足我的请求

Pok*_*uri 5 servlets

我想映射一个servlet来提供包含'app'的请求,并以下面的方式结束*.html

<url-pattern>/app/*.html</url-pattern>
Run Code Online (Sandbox Code Playgroud)

但在运行应用程序时,它给了我一个错误

java.lang.IllegalArgumentException: Invalid <url-pattern> 
/app/*.html in servlet mapping
Run Code Online (Sandbox Code Playgroud)

请帮我映射一下.请提供我可以了解这些网址映射规则和约定的链接.

Bal*_*usC 11

这确实无效.通配符必须是分别指示后缀或前缀模式的第一个或最后一个字符.

<url-pattern>*.html</url-pattern>
Run Code Online (Sandbox Code Playgroud)

要么

<url-pattern>/app/*</url-pattern>
Run Code Online (Sandbox Code Playgroud)

这一点在Servlet API规范的第12.2节中都有明确规定.这是相关的摘录:

12.2映射规范

在Web应用程序部署描述符中,以下语法用于定义映射:

  • 以字符开头‘/’并以‘/*’后缀结尾的字符串用于路径映射.
  • ‘*.’前缀开头的字符串用作扩展名映射.
  • 空字符串("")是一个特殊的URL模式,它完全映射到应用程序的上下文根,即表单的请求http://host:port/<contextroot>/.在这种情况下,路径信息是’/’,并且servlet路径和上下文路径是空的string(““).
  • 仅包含’/’字符的字符串表示应用程序的"默认"servlet.在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null.
  • 所有其他字符串仅用于完全匹配.

要解决此问题,您有两个选择:

  1. 使用/app/*模式,也没有把非HTML文件/app.把它们放在别处.

  2. 使用不同的前缀模式,/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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

有关: