【问题标题】:Servlet URL and physical directoriesServlet URL 和物理目录
【发布时间】:2011-12-27 07:12:25
【问题描述】:

所以,现在我已经将我的 JSP 文件从 /content 移动到 /WEB-INF/content 在编码我的 ProcessServlet 以使用 forward() 来获取它们之后,我应该如何设置我的 web.xml URL 模式来获取到 Servlet?

注意:我的 JSP 与 CSS、图像和 JS 文件一起位于 /content 下。所以 /content/css、/content/image、/content/js 都还在。

我发现如果我在 web.xml 中为我的 Servlet 使用模式“/content/*”,那么对 css、图像和 js 的请求也会通过 Servlet。我应该如何避免这种情况?

有人可以建议一种更好的方法来设置我的 URL 和目录吗?

【问题讨论】:

    标签: java servlets web.xml


    【解决方案1】:

    您不必使用 servlet 进行此类转发。如果 jsp 页面的数量不大,可以直接在 web.xml 中为它们声明映射,就像对 servlet 所做的那样(参见示例 here)

    【讨论】:

    • 目前有 150 个 JSP 文件,而且这个数字只会增长。我喜欢我的 Servlet,因为它是处理常见任务的中心位置。
    【解决方案2】:

    这就是我的设置方式:

    +-WEB-INF/
    |   +-jsp/*.jsp
    +-styles/*.css
    +-images/*.jpn,*.png,etc.
    

    我使用 servlet 映射来映射动态内容,例如*jsp,并保留默认的 servlet 来处理静态内容。当然,这不是解决问题的唯一方法。

    web.xml 看起来像这样:

    <servlet-mapping>
        <servlet-name>Your Servlet</servlet-name>
        <url-pattern>/content/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    大多数servlet容器都提供了默认的servlet,你不需要编写一个。对于 tomcat 和 jetty,关键字是“default”。

    【讨论】:

    • 那么,您的 URL 模式进入 Servlet 的条目是什么?我的是: /content/*
    • 基本上,您的模式没有变化,但您需要将这些 url 更改为静态内容,例如/content/images/ 到 /images/
    • 另外,为什么你需要一个用于 CSS、图像、js 等的 Servlet?这不只是 Java 必须做的额外工作吗?我最终想让常规的 Apache 为所有这些静态资源提供服务(现在一切都通过 Tomcat)。
    • Arg,我希望你不要这么说。我意识到这是一个可能的结果。这意味着我必须更改对我的静态内容(例如样式表、图像和 js)的所有 URL 引用。我喜欢我的 URL 结构,我可以不保留它吗?
    • 在servlet容器中,任何东西都必须通过一个servlet,即使是静态内容。如果您未定义映射,则默认 servlet 将自动用于映射所有内容。 apache 也是如此,但没有 servlet 这样的东西。在 apache httpd 中,它有自己的方式将图像(静态内容)从硬盘传输到您的 http 连接中。
    【解决方案3】:

    2 个选项:

    1. 将/content/css、/content/image、/content/js 移动到/resources/css 等。要修复现有 JSP 中的 URL,只需使用 find&replace 智能方法。应该是一分钟的工作。

    2. 将 servlet 的 URL 模式 /content/* 更改为其他内容,例如/pages/*.

      • 如果您想保留现有 URL,请在 /content/* 上添加一个过滤器,该过滤器基本上执行以下操作:

        String uri = ((HttpServletRequest) request).getRequestURI();
        if (uri.startsWith("/content/css/") || uri.startsWith("/content/image/") || uri.startsWith("/content/js/")) {
            chain.doFilter(request, response); // Goes to default servlet.
        } else {
            request.getRequestDispatcher("/pages" + uri).forward(request, response);
        }
        

      这只是一个巨大的变化。您可能需要修复 JSP 中的所有链接,以确保它们的设计方式与您在单个位置指定 &lt;base&gt; 的主模板不同。此外,您可能希望为旧书签和搜索索引添加 301 重定向。

    【讨论】:

    • 谢谢,这给了我很多选择。我会一直抱怨这个link,但我可以。
    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多