• 使用SpringMVC时,web应用的资源路径问题


     

     web应用常见的资源存方式

    • 在WEB-INF下新建lib,存放要使用的jar包
    • 在WEB-INF下新建jsp文件夹,存放jsp文件。首页除外,首页就放到web下。
    • 在web下,或WEB-INF下,新建css、js、image文件夹,存放相关文件。

     

    WEB-INF目录是web应用的安全目录,里面的资源不能被浏览器直接访问。

    web下的静态资源(html、css、js、图片等)都不能被浏览器直接访问,

    直接放到web下,或者放到WEB-INF下,都是一样的。

    web下的动态资源(jsp)可以被浏览器直接访问,比如浏览器直接访问web下的首页index.jsp,这是可以的。

    如果把jsp放到WEB-INF下,那jsp受到WEB-INF的保护,浏览器就不能直接访问。

    SpringMVC提倡由controller处理请求,调用视图来响应,用户不能直接访问视图,所以把jsp放到WEB-INF下。

    总得留个页面作为网站入口吧,入口的index.jsp直接放在web下,用户可以直接访问。


    lib的存放

    部署项目时,会把jar包拷贝到输出目录的 WEB-INFlib 下。

    在WEB-INF下新建文件夹lib,把所需的jar包放到lib下,

    部署项目时,会把所有的jar包都拷贝到输出目录的  项目WEB-INFlib 里。

    如果我们是在web下新建lib存放jar包,或者在项目下新建lib存放jar包,

    部署项目时,会把所有的jar包拷贝到输出目录的  项目WEB-INFlib里,并会把我们新建的lib文件夹拷贝到输出目录的 项目下,这一步就多余了,没必要。

     如果部署时,jar包拷贝不全,参考:

    https://www.cnblogs.com/chy18883701161/p/12240317.html


    静态资源配置

    我们在web.xml中使用DispatcherServlet拦截所有请求,所有的请求都转交给controller处理。

    就是说,前端页面的<img />要加载图片、<script src="">要加载js脚本、<link />要加载的样式表,这些请求都会被DispatcherServlet拦截,

    而DispatcherServlet又找不到对应的controller来处理这些请求,即使路径是对的,在浏览器中f12->Network,看到状态码是404、或者400(由于找不到所需的资源而引起的错误)。

    我们需要配置一下静态资源,让DispatcherServlet放行某些静态资源的请求。

    有3种配置方式。


    配置方式一:配置资源映射(最常用)

        <mvc:resources mapping="/js/**" location="/js/**" />
        <mvc:resources mapping="/css/**" location="/css/**" />
        <mvc:resources mapping="/image/**" location="/image/**" />

    location是实际地址,mapping是映射地址。一般我们不改路径,只是让DispatcherServlet放行。

    <mvc:resources />是以文件夹为单位配置的,最小单位只能是文件夹,不能是文件。

    可以写上**表示该文件夹下的所有东西,也可以缺省**。

    这种方式可以放行对静态资源的请求、对WEB-INF下资源的请求、对动态资源(jsp)的请求。


    配置方式二:配置默认的ServletHandler

    <mvc:default-servlet-handler default-servlet-name="default" />

    配置web服务器默认的ServletHandler,DIspatcher拦截到静态资源后,找不到对应的controller来处理,会交给web服务器默认的ServletHandler来处理。

    默认的ServletHandler会调用web服务器的默认Serlvet来处理,web服务器的默认Servlet的处理方式都是直接放行(返回该资源作为响应)。

    但不同的web服务器,默认Servlet的name是不同的:

    • Tomcat、Jetty、Jboss、GlassFish的默认Servlet的name是default
    • Resin的是resin-file
    • WebLogic的是FileServlet
    • WebSphere的是SimpleFileServlet

    更换web服务器时,需要修改default-servlt-name,配置简单但项目移植性差。


    配置方式三:在web.xml中配置默认Servlet的映射

        <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>
        <servlet-mapping>
            <servlet-name>default</servlet-name>
            <url-pattern>*.jpg</url-pattern>
        </servlet-mapping>

    使用多个<filter-mapping>,不能一个<filter-mapping>里配置多个<url-pattern>,也不能在一个<url-pattern>里配置多个规则。

    麻烦且移植性差。


    方式一、三更灵活,可以指定要加载的静态资源,方式二是加载项目中所有的静态资源。

    方式二、三响应静态资源更快,因为web服务器启动时就会创建默认Servlet的实例,就会加载静态资源,静态资源一直在内存中,响应快、但吃服务器内存。

    方式一是请求这个静态资源时才加载,用完就释放,速度慢、但内存占用少。

  • 相关阅读:
    upc组队赛1 黑暗意志【stl-map】
    upc组队赛1 闪闪发光 【优先队列】
    upc组队赛1 流连人间的苏苏
    POJ 2387 Til the Cows Come Home 【最短路SPFA】
    POJ 2421 Constructing Roads 【最小生成树Kruscal】
    qrcode-使用
    submlie 配置php运行
    composer 安装laravel
    composer 配置镜像
    Laravel-队列
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/12249175.html
Copyright © 2020-2023  润新知