gpt4 book ai didi

java - 根 url 的匹配和静态资源的服务

转载 作者:行者123 更新时间:2023-11-30 03:43:21 25 4
gpt4 key购买 nike

我的问题是如何配置 Spring MVC 应用程序以同时允许

  • 应用程序应提供静态资源(css、js、图像...)
  • 根 URL (http://my.host.org/webb_app/) 应由 Spring Controller 提供服务

我已经读过How to handle static content in Spring MVC? , Using Spring, mapping to root in web.xml, static resources aren't foundTomcat serving static resources on Spring MVC app 。所有这些都提供了可行的解决方案,直到最近,我还使用它们作为 cooking 食谱,直到应用程序或多或少可以接受。所有这些都没有引用资料,也没有清楚地理解它最终起作用的原因和方式。

所以问题是:针对此需求配置 Spring MVC 应用程序的不同方法是什么,它们的缺点是什么以及它们背后的基本原理是什么。

最佳答案

我将首先介绍如何 DefaultServlet作品。根据Servlet 3.0 specifications ,容器通常提供一个默认的 servlet,它具有最低的优先级并提供静态上下文。映射/是此默认 servlet 的隐式映射。

现在给出解决方案:

将 spring Controller 映射到子层次结构

这是最简单的解决方案:您映射 Spring DispatcherServlet/pages ,或发送至 /pages/api例如。默认 servlet 将提供所有其他 URL(包括根)。要服务根 Controller ,您可以将 Controller 映射到 /home (例如)并且有 /index.jsp包含<jsp:forward page="/home"/> - 这是当前在使用扩展映射的其他框架中使用的方法,例如 Struts(*.do 对于旧的 Struts1)。

缺点:url 带有 /pages 说明不太好。

将资源映射到子层次结构

该解决方案在引用的页面中被广泛使用。 Spring DispatcherServlet映射到/*从而获取所有请求(除非存在更具体的映射)。要提供静态资源,您只需声明 ResourceHttpRequestHandler ,在 XML 中使用:

<mvc:resources mapping="/resources/**" location="/public-resources/"/>

或者在java配置中:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/");
}
}

这工作得很好,你可以将 Spring Controller 映射到 /直接。

缺点:您无法提供直接位于根上下文下的静态资源。

map DispatcherServlet作为默认 servlet

映射 Spring DispatcherServlet/实际上是替换容器中的默认 servlet 以处理所有尚未处理的 URL。通过此映射,Spring 可以针对未映射到 Controller 的 URL 回退到原始默认 servlet。为此,您必须配置 DefaultServletHttpRequestHandler URL 映射为"/**"和最低优先级。您可以使用 XML 来完成此操作:

<mvc:default-servlet-handler/>

或者在java配置中:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

}

这样,DispatcherServlet通常调用所有 Controller ,并使用原始默认 servlet 来服务静态(未映射)资源。不幸的是,这对于根 URL 不起作用,您必须使用 <jsp:forward page="..."/>像第一个解决方案一样的技巧。

缺点:

  • 无法直接映射根 URL,需要 index.jsp <jsp:forward page="..."/>技巧
  • 由于 Spring 替换了原始容器默认 servlet,它必须通过名称来调用它。它适用于常见容器(包括 Tomcat、Jetty、GlassFish、JBoss、Resin、WebLogic 和 WebSphere),或者您也可以将默认 servlet 的名称作为 XML 配置中的属性 ( <mvc:default-servlet-handler default-servlet-name="customDefaultServlet"/> ) 或作为参数(如果是 java)配置:configurer.enable("customDefaultServlet");

引用文献:Spring Reference Manual / Web MVC framework / Serving of Resources

关于java - 根 url 的匹配和静态资源的服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26325524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com