<servlet-mapping> </servlet-mapping> </url-pattern>中的<url-pattern>

时间:2011-07-03 11:27:44

标签: rest servlets url-pattern

案例1

  <servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

案例2

  <servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

如果我使用案例1,那么我不会使用<link rel="stylesheet" type="text/css" href="${contextPath}/assets/styles.css" />设置任何页面样式,但如果我使用案例2,则所有内容都会被设置样式。

有人可以帮我理解原因吗?

另外,有人可以告诉我应该使用哪种模式,以便我不必担心扩展吗?我应该使用/*吗?问题是,如果我在开发我的应用程序时使用/*时现在使用*.do,那么一切似乎都在破坏,不仅是样式,而且我没有得到任何图片,没有JCaptcha以及与链接有关的一切。

如果我尝试从http://localhost:8080/myapp/user/1这样的REST客户端发送GET请求,它不起作用,我需要在末尾添加.do并发送相同的请求,如{{1} }。

感谢。

2 个答案:

答案 0 :(得分:4)

浏览器会在链接的资源上发送单独的HTTP请求,例如CSS文件,JS文件和图像。这些请求的网址也与/的网址格式相匹配。因此,对这些请求也会调用myapp servlet。但是,您的myapp servlet似乎没有正确处理它们,因此这些请求会返回完全不同的内容。尝试单独请求这些资源,以了解您的servlet实际返回到webbrowser的内容:

  

http://localhost:8080/myapp/assets/styles.css

在您的情况下,您希望让myapp servlet忽略对这些资源的请求。最好的方法是创建一个过滤器来做到这一点。假设所有这些资源都在名为/assets的文件夹中,那么您可以通过将servlet映射到更具体的URL模式(例如/myapp/*并创建Filter)来实现此目的。在/*上监听,/assets透明地继续请求/响应链,并将所有其他请求发送到/myapp

所以,这个配置

<filter>
    <filter-name>filter</filter-name>
    <filter-class>com.example.Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>controller</servlet-name>
    <servlet-class>com.example.Controller</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>controller</servlet-name>
    <url-pattern>/myapp/*</url-pattern>
</servlet-mapping>

与过滤器doFilter()中的以下内容结合使用:

String uri = ((HttpServletRequest) request).getRequestURI();
if (uri.startsWith("/assets")) {
    chain.doFilter(request, response); // Goes to container's default servlet.
} else {
    request.getRequestDispatcher("/myapp" + uri).forward(request, response);
}

应该适合你。

答案 1 :(得分:3)

以下是Oracle J2EE教程的相关页面:http://download.oracle.com/docs/cd/E13222_01/wls/docs81/webapp/components.html#148787

此页面提供了一些示例,并将读者引用到Servlet规范:

  

有关servlet映射的更多信息,例如一般servlet映射规则和约定,请参阅Servlet 2.3规范的第11节:http://www.jcp.org/aboutJava/communityprocess/final/jsr053/

该规范值得一读,但您需要点击“我同意”下载PDF,因此我无法直接链接到它。


规范说明的内容是使用以下规则(按顺序):

  1. 尝试执行完全匹配。
  2. 尝试进行前缀匹配,优先考虑与最长前缀的匹配。
  3. 尝试进行后缀匹配。
  4. “容器将会是 尝试提供适合所请求资源的内容。如果是“默认” servlet是为应用程序定义的,它将被使用。“