当前位置: 首页 > 面试题库 >

匹配根URL和静态资源投放

相诚
2023-03-14
问题内容

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

  • 应用程序应提供静态资源(css,js,图像…)
  • 根网址(http://my.host.org/webb_app/)应该由Spring控制器提供

我已经阅读了如何在SpringMVC中处理静态内容?,使用Spring映射到web.xml中的根,找不到静态资源,并且Tomcat在Spring
MVC应用程序上提供静态资源。所有人都提供了可行的解决方案,直到最近,我还是将它们用作烹饪食谱,直到该应用程序或多或少地可以接受为止。所有这些都没有参考,也没有清楚地了解其最终原因和最终工作方式。

因此,问题是:针对此需求配置Spring MVC应用程序的不同方式是什么,它们的缺点是什么,其背后的原因是什么。


问题答案:

首先,我将对DefaultServlet工作原理进行初步说明。根据Servlet
3.0规范
,容器通常提供默认的Servlet,该Servlet的优先级最低,并提供静态上下文。该映射/是此默认Servlet的隐式映射。

现在为解决方案:

将弹簧控制器映射到子层次结构

这是最简单的解决方案:你映射春天DispatcherServlet/pages,或者/pages/api例如。然后,默认servlet将提供所有其他URL(包括root)。为了服务于根控制器,可以映射控制器,其/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控制器映射到。

缺点:您不能提供直接在根上下文下使用的静态资源。

映射DispatcherServlet为默认servlet

实际上,将Spring映射DispatcherServlet/要替换容器中的默认servlet,以处理所有尚未处理的URL。通过这种映射,对于未映射到控制器的URL,Spring可以回退到原始的默认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通常会调用所有控制器,并具有原始的默认Servlet来服务静态(未映射)资源。不幸的是,这并 没有
为根URL工作,你必须使用<jsp:forward page="..."/>伎俩像第一个解决方案。

缺点 :

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

参考:Spring参考手册/ WebMVC框架/资源服务



 类似资料:
  • Url美化 以首页链接为例:http://www.demo.com/index.php?r=site%2Findex 1.开启apache-rewrite,打开/frontend/config/main.php中的components下面添加以下代码 'urlManager' => [ 'enablePrettyUrl' => true, 'showScri

  • 本文向大家介绍Django静态资源URL STATIC_ROOT的配置方法,包括了Django静态资源URL STATIC_ROOT的配置方法的使用技巧和注意事项,需要的朋友参考一下 缘由   新手学习 Django 当配置好 HTML 页面后,就需要使用一些静态资源,如图片,JS 文件,CSS 样式等,但是 Django 里面使用这些资源并不是直接引用一下就好,还要配置路径即 STATIC_UR

  • Fes.js 基于 html-webpack-plugin在新窗口打开 实现的模板功能,默认 HTML模板 是: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewp

  • 每个网站都需要静态资源:图片、样式表、网站图标(favicon)等。在这种情况下,您可以在项目的根目录下创建一个名为 static 的目录。 放入 该目录中的每个文件都将被复制到 生成的 build 文件夹中,并保留目录的层级结构。例如,如果您将名为 sun.jpg 的文件添加到 static 文件夹中,则该文件将被复制到 build/sun.jpg 路径。 这意味着: 对于 baseUrl: '

  • JS 代码中引用媒体文件 可以直接在代码中使用 ES6 的 import 语法引入文件并在 JSX 中使用,目前仅支持图片类型的媒体文件。 JSON 中引用媒体文件 当你需要在 app.json 中配置使用的本地媒体文件(比如导航栏图片地址)时,可以将使用到的媒体文件放置到 src 下的某个目录下,并在 build.json 中将其配置到 constantDir 字段的数组中,示例如下: {

  • 相关: 公共基础路径 相关: assetsInclude 配置项 将资源引入为 URL 服务时引入一个静态资源会返回解析后的公共路径: import imgUrl from './img.png' document.getElementById('hero-img').src = imgUrl 例如,imgUrl 在开发时会是 /img.png,在生产构建后会是 /assets/img.2d8e