案例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} }。
感谢。
答案 0 :(得分:4)
浏览器会在链接的资源上发送单独的HTTP请求,例如CSS文件,JS文件和图像。这些请求的网址也与/
的网址格式相匹配。因此,对这些请求也会调用myapp
servlet。但是,您的myapp
servlet似乎没有正确处理它们,因此这些请求会返回完全不同的内容。尝试单独请求这些资源,以了解您的servlet实际返回到webbrowser的内容:
在您的情况下,您希望让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,因此我无法直接链接到它。
规范说明的内容是使用以下规则(按顺序):