使用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-INF\lib 下。
在WEB-INF下新建文件夹lib,把所需的jar包放到lib下,
部署项目时,会把所有的jar包都拷贝到输出目录的 项目\WEB-INF\lib 里。
如果我们是在web下新建lib存放jar包,或者在项目下新建lib存放jar包,
部署项目时,会把所有的jar包拷贝到输出目录的 项目\WEB-INF\lib里,并会把我们新建的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的实例,就会加载静态资源,静态资源一直在内存中,响应快、但吃服务器内存。
方式一是请求这个静态资源时才加载,用完就释放,速度慢、但内存占用少。
使用SpringMVC时,web应用的资源路径问题的更多相关文章
- web静态页面资源访问路径问题
我使用的是idea,今天搭建一个项目时遇见了css和js路径错误,导致浏览器获取不到资源路径 这是我最开始写的路径 <link href="/main/loginMain.css&qu ...
- 关于在打包Jar文件时遇到的资源路径问题(二)
在关于<关于在打包Jar文件时遇到的资源路径问题(一)>中,以及描述了当资源与可执行JAr分离时的资源路径代码的编写问题,后来想了想,为什么将<Java核心技术卷一>中的程序1 ...
- 关于在打包Jar文件时遇到的资源路径问题(一)
当我们将程序写好,并进行打包成Jar文件时,通常都带有各种资源,这些资源可以是图像或者声音文件,也可以是别的如文本文件或二进制文件等,这些资源都和代码密切相关.例如在一个JPanel类上显示一些可能变 ...
- 给tomcat配置外部资源路径(应用场景:web项目访问图片视频等资源)
对于一个web项目来说,除了文字之外,图片,视频等媒体元素也是其重要的组成部分.我们知道,web项目中如果用到大量的图片.视屏的资源,我们 通常的做法是只在数据库中存储图片.视频等资源的路径,web项 ...
- web项目中各种路径的获取(复制,为以后好找资源)
web项目中各种路径的获取 1.可以在servlet的init方法里 String path = getServletContext().getRealPath("/"); 这将获 ...
- electron项目中使用js web worker时,new worker(path)路径问题
如题,在new worker时需要传入js文件路径,可是在electron环境中使用出现问.同目录下,recorder.jsworker.js recorder.js中调用 var path = '. ...
- 配置springMVC时出现的问题
配置springMVC时出现的问题 项目结构如图:
- springMVC设置不拦截静态资源的方法
SpringMVC提供<mvc:resources>来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决: 方案一.拦截器中增加针对静 ...
- JAVA WEB项目中各种路径的获取
JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报 分类: JAVA开发(41) 1.可以在s ...
随机推荐
- 【PAT甲级】1067 Sort with Swap(0, i) (25 分)
题意: 输入一个正整数N(<=100000),接着输入N个正整数(0~N-1的排列).每次操作可以将0和另一个数的位置进行交换,输出最少操作次数使得排列为升序. AAAAAccepted cod ...
- 的aspnet_client文件夹
在早期,有一些asp.net组件是默认要调用(从客户端调用)服务器根(域名)下这个子目录里边的文件的. 不过如果你使用高版本的asp.net,那么全都从你的网站里调用了,因为asp.net有了更好地直 ...
- PHP的自定义模板引擎
前面的话 在大多数的项目组中,开发一个Web程序都会出现这样的流程:计划文档提交之后,前端工程师制作了网站的外观模型,然后把它交给后端工程师,它们使用后端代码实现程序逻辑,同时使用外观模型做成基本架构 ...
- 「JSOI2014」强连通图
「JSOI2014」强连通图 传送门 第一问很显然就是最大的强连通分量的大小. 对于第二问,我们先把原图进行缩点,得到 \(\text{DAG}\) 后,统计出入度为零的点的个数和出度为零的点的个数, ...
- Python 基础之文件操作与文件的相关函数
一.文件操作 fp =open("文件名",mode="采用的模式",encoding="使用什么编码集")fp 这个变量接受到open的返 ...
- ThinkPHP6源码分析之应用初始化
ThinkPHP6 源码分析之应用初始化 官方群点击此处. App Construct 先来看看在 __construct 中做了什么,基本任何框架都会在这里做一些基本的操作,也就是从这里开始延伸出去 ...
- Python - 代码片段,Snippets,Gist
说明 代码片段来自网上搬运的或者自己写的 华氏温度转摄氏温度 f = float(input('请输入华氏温度: ')) c = (f - 32) / 1.8 print('%.1f华氏度 = %.1 ...
- app生命周期之即将关闭
需求:当软件正在进行任务还未结束时,如果用户强制退出软件,需要将一些数据进行保存等处理. 策略:当用户使用多任务将软件挂起,并滑掉软件时,接下来有5妙钟的时间留给软件做处理.会调用- (void)ap ...
- vue学习笔记:Hello Vue
编写简单例子,了解下基本语法 <!DOCTYPE html> <html> <head> <meta charset="utf-8 "&g ...
- 【原】php中fastcgi和php-fpm是什么东西
fastcgi 是一个与平台无关,与语言无关,任何语言只要按照它的接口来实现,就能实现自己语言的fastcgi能力和web server 通讯. PHP-CGI就是PHP实现的自带的FastCGI管理 ...