• [J2EE]Spring MVC中访问静态资源[转]


    1 文献来源

    2 前言

    2.1 访问不到静态资源起因

    如果web.xml:DispatcherServlet配置".do"这样的URL拦截器,就不存在访问不到静态资源的问题。
    如果web.xml:DispatcherServlet配置"/"拦截了所有的请求,同时对
    .js,*.jpg的访问自然也就被拦截了。

        <!-- 前端控制器/中央控制器 -->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-servlet.xml</param-value>
                <!--<param-value>classpath:applicationContext.xml,classpath:spring-security.xml</param-value>-->
            </init-param>
            <!-- ↓加载 /WEB-INF/[servlet-name]-servlet.xml -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <!-- 所有匹配'/'的请求都进入SpringMVC -->
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    

    2.2 讨论范围

    本文仅讨论第二种情况下,当Spring MVC 的拦截路径配置为'/'(拦截所有请求)时,访问静态资源的解决方案。

    3 解决方案

    3.1 方案1:[web.xml]激活Tomcat的defaultServlet来处理静态文件

    建议:可写在DispatcherServlet的前面, 让defaultServlet先拦截

    • Tomcat, Jetty, JBoss, and GlassFish 默认 Servlet的名字 — "default"
    • Google App Engine 默认 Servlet的名字 — "_ah_default"
    • Resin 默认 Servlet的名字 — "resin-file"
    • WebLogic 默认 Servlet的名字 — "FileServlet"
    • WebSphere 默认 Servlet的名字 — "SimpleFileServlet"
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.png</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    

    3.2 方案2:[springmvc-servlet.xml]激活defaultServlet - <mvc:default-servlet-handler />

    defaultServlet配置:
    (1)加入对静态资源的处理:js,gif,png.docx等
    (2)允许使用"/"做整体映射

    <!-- 会把 "/**" url,注册到 SimpleUrlHandlerMapping 的 urlMap 中,
         把对静态资源的访问由 HandlerMapping 转到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 处理并返回.
         DefaultServletHttpRequestHandler 使用就是各个 Servlet 容器自己的默认 Servlet. -->
    <mvc:default-servlet-handler />
    

    3.3 方案3:[springmvc-servlet.xml]Spring 3.0.4以后支持<mvc:resources location mapping />

    • location元素: webapp目录下的 static 包下的所有文件/目录不被拦截
    • mapping元素: 以/static 开头的所有请求路径,如/static/a 或者/static/a/b
    • 使用 < mvc:resources / > 元素,把 mapping 的 URI 注册到 SimpleUrlHandlerMapping的urlMap 中
    • DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源交由Servlet处理
    <!-- ↓如此就不必另外添加一个mvc来处理静态资源,而mvc知道静态资源所处的位置为resources文件夹↓ -->
    <mvc:resources location="/resources/" mapping="/resources/**"/>
    <!-- ↓在SpringMVC3.0之后推荐使用↓ -->
    <!-- 将 /img/** 映射到 ResourceHttpRequestHandler 进行处理,location指定静态资源的存储位置  -->
    <!-- 作用: DispatcherServlet不会拦截以/static开头的所有请求路径,并当作静态资源交由Servlet处理 -->
    <mvc:resources location="/img/" mapping="/img/**"/>
    <mvc:resources location="/js/" mapping="/js/**"/>
    <mvc:resources location="/css/" mapping="/css/**"/>
    
    • /webapp/WEB-INF目录:

    WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。当然,你非要放在WEB-INF中,则必须修改resources映射,如:
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

  • 相关阅读:
    怎么将一个类的成员函数作为指针传递给另一个类的成员函数 沉沉_
    C/C++中的头文件多文件组织 沉沉_
    函数的返回值返回变量和引用 沉沉_
    多操作赋的语义判断(如 int& *a和int* &a) 沉沉_
    ctags: 提示错误ctags: unrecognized option 'format=2' 沉沉_
    C++中关于流的概念 沉沉_
    Verilog 初学笔记顺序操作 和 并行操作的一点思考(参考黑金教程:Verilog HDL那些事 建模篇) 沉沉_
    void 指针 (转载) 沉沉_
    C语言的体系结构main函数存在的必然性(听杨力祥老师的课) 沉沉_
    转载:VC6.0中容易遇到的错误。http://hi.baidu.com/%C8%FD%C9%EE/blog/item/4a756ff2cb6bdb19b07ec5df.html 沉沉_
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/13055101.html
Copyright © 2020-2023  润新知