tomcat - 在 web.xml 中定义默认 servlet 时访问静态内容时出现 404 错误

标签 tomcat servlets default

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

  • 根目录
    • 元信息
    • 资源
      • CSS
    • WEB-INF
      • 类(class)
      • 图书馆

我在我的部署描述符中定义了一个默认的 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,并正确呈现 View 。

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 的最佳方法是什么?

最佳答案

不要自行开发您自己的默认 servlet。使用 servletcontainer 的内置默认 servlet。您的前端 Controller 应该映射到更具体的 URL 模式,例如*.html/pages/*

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

例如

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 链接到 URL 中的 /resources 路径,就像您在公共(public) webcontent 文件夹结构中一样。

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

另见:

关于tomcat - 在 web.xml 中定义默认 servlet 时访问静态内容时出现 404 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5872050/

相关文章:

java - 在 java servlet 中创建异步进程

java - 未在 servlet 上调用 POST 方法 - GWT 项目

html - 点击后退按钮时如何将 <select> 元素更改回默认值?

WPF 在 TextBlock 上设置默认样式会覆盖标签的样式

sql - 默认值表达式函数何时/如何绑定(bind)到 search_path?

java - 调用 Https 网址

java - 集成 apache tomcat 和 solr

java - 使用不同的路径将war文件部署到Tomcat

java - 如何使用 Apache 负载均衡器配置 Tomcat 实例故障转移设置?

java - 意外的 EOF;期待元素 <attribute> 的关闭标记