404在web.xml中定义defualt servlet时访问静态内容时出错

时间:2011-05-03 15:41:52

标签: tomcat servlets default

我在Tomcat 7容器中运行webapp,并在尝试访问静态内容(.css等)时收到404错误。以下是我的目录结构:

  • ROOT
    • META-INF
    • 资源
      • CSS
    • WEB-INF
      • LIB

我在部署描述符中定义了一个默认的servlet,如下所示:

<servlet>
    <servlet-name>HomeController</servlet-name>
    <servlet-class>controller.HomeController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HomeController</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

HomeController servlet将请求转发给.jsp,并且视图正确呈现。

request.getRequestDispatcher("view.jsp").forward(request,
        response);

“view.jsp”有一个指向位于上面列出的css文件夹中的样式表(style.css)的链接。但是,因为servlet被配置为默认servlet,所以我现在无法访问css文件夹中的静态内容,并且对此样式表的任何请求都会返回404错误。

<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/style.css" />

这有什么办法吗?提供静态资源的最佳方法是什么,但仍然能够定义默认的servlet?

2 个答案:

答案 0 :(得分:2)

不要自己生成自己的默认servlet。使用servletcontainer的内置默认servlet。您的前端控制器应映射到更具体的URL模式,例如*.html/pages/*

如果您的目的是不更改URL,那么您应该创建一个额外的Filter类,该类映射在/*上,并在请求/resources/*时继续链接,否则转发到映射在/pages/*上的前端控制器servlet。

E.g。

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

将您的CSS与网址中的/resources路径直接关联,就像您在公共网站内容文件夹结构中一样。

<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/resources/css/style.css" />

另见:

答案 1 :(得分:1)

你不应该像这样从资源路径链接css:

<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/resources/css/style.css" />