3

情况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" />都不会使用 .

有人可以帮我理解为什么吗?

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

如果我尝试从 REST 客户端发送 GET 请求,就像http://localhost:8080/myapp/user/1它不起作用一样,我需要.do在最后添加并发送相同的请求,例如http://localhost:8080/myapp/user/1.do.

谢谢。

4

2 回答 2

4

浏览器对链接资源(如 CSS 文件、JS 文件和图像)发送单独的 HTTP 请求。这些请求的 URL 也与 的 URL 模式匹配/。所以你的myappservlet也会被这些请求调用。但是,您的myappservlet 似乎没有正确处理它们,因此这些请求返回完全不同的东西。尝试自己单独请求这些资源,以了解您的 servlet 实际返回到 Web 浏览器的内容:

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

在您的情况下,您希望让您的myappservlet 忽略对这些资源的请求。最好的方法是创建一个过滤器来做到这一点。假设所有这些资源/assets都在/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);
}

应该为你工作。

于 2011-07-03T16:43:51.357 回答
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. “[T]容器将尝试提供适合所请求资源的内容。如果为应用程序定义了“默认”servlet,则将使用它。”
于 2011-07-03T11:51:03.020 回答