【问题标题】:mapping servlet to serve my requests映射 servlet 以服务我的请求
【发布时间】:2011-07-13 16:12:03
【问题描述】:

我想映射一个 servlet 以通过以下方式为包含 'app' 并以 *.html 结尾的请求提供服务

<url-pattern>/app/*.html</url-pattern>

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

java.lang.IllegalArgumentException: Invalid <url-pattern> 
/app/*.html in servlet mapping

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

【问题讨论】:

    标签: servlets


    【解决方案1】:

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

    <url-pattern>*.html</url-pattern>
    

    <url-pattern>/app/*</url-pattern>
    

    这一切都在Servlet API specification 的第 12.2 节中明确规定。以下是相关性摘录:

    12.2 映射规范

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

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

    要解决此问题,您有 2 个选项:

    1. 使用/app/* 模式并将非HTML 文件放入/app。把它们放在别处。

    2. 使用不同的前缀模式,例如/controller/*,并创建一个映射到/app/*Filter,并在doFilter() 方法中执行以下操作:

      String uri = ((HttpServletRequest) request).getRequestURI();
      if (uri.endsWith(".html")) {
          request.getRequestDispatcher("/controller" + uri).forward(request, response);
      } else {
          chain.doFilter(request, response);
      }
      

    相关:

    【讨论】:

      【解决方案2】:

      您何时收到此错误?您使用的是什么应用程序服务器/网络服务器?另外,请检查 /app 是否被映射到其他地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-30
        • 2011-08-19
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多