映射servlet以满足我的请求

时间:2011-03-11 17:31:35

标签: servlets

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

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

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

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

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

2 个答案:

答案 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减去上下文路径   并且路径信息为空。
  •   
  • 所有其他字符串仅用于完全匹配。
  •   

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

  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);
    }
    

  3. 相关:

答案 1 :(得分:0)

你什么时候收到这个错误?您使用的是什么app-server / web-server?另外,请检查/ app是否正在其他地方映射。