IDEA中, web项目的img标签src的路径问题及静态资源加载路径问题

做一个Javaweb的项目,涉及到图片上传,并且需要将图片通过URL回显给JSP页面,在调试的时候发现,上传到tomcat的图片再重新部署之后就消失了。研究了半天发现才解决了。首先说一下,为什么要将图片存放到tomcat服务器或者更直白点说是web工程目录下的原因:

项目中对于图片的处理在于用户上传比如自己的头像,上传后再查看时,就直接根据服务器的URL指定图片的位置去查看图片,通俗点就是jsp页面中的<img >标签的src属性的路径就直接指向服务器该图片存放的位置。鉴于这一点,所以将图片文件存放在了tomcat中,而不放在服务器磁盘文件系统中,这样前端JSP就可以直接通过URL访问到图片资源。

 

发现的问题:在调试的时候,我的开发环境十分通用,就是eclipse for jee ,服务器为tomcat7.0。在配置eclipse runtime服务器运行环境时,工程发布的位置选择的是直接将工程发布到tomcat的webapps目录下。配置过程如下:

1.在为eclipse添加到tomcat7.0服务器后,将服务器的工程全部remove掉,如下图:

remove all,然后右键clean一下,这时再open,如下图

 

 

在server locations下选择第二个,这时工程在ADD到服务器时就直接到了tomcat 的webapps目录下了。

 

遇到的问题:发现上传的图片在改动eclipse上的代码的时候,也就是重新部署后,tomcat下的webapps中的工程目录下的图片全部没有了,很奇怪,经过研究发现,原因如下:

我们在Java代码中上传图片时,图片的路径是通过代码

request.getSession().getServletContext().getRealPath("/img")

来获取路径的,而这句代码返回的路径是tomcat中webapps目录下的工程路径,图片就直接保存到了tomcat中。

当我们重新发布工程的时候,tomcat其实是先将原来的工程删掉,然后再将改动过的新的工程放上去。而改动过的新的工程师来自与我们eclipse的工作空间中的工程,这就也难怪了,因为我们是把图片直接上传到的tomcat服务器下,而不是放到工作空间的工程目录下,自然重新部署后图片就没了。


解决办法:

归根到底的原因就是因为

request.getSession().getServletContext().getRealPath("/img")

这句代码搞的鬼,所以在调试时,我们在Java代码中保存上传的图片位置时将图片的保存路径应该保存在eclipse工作空间的目录下,如:

String path = "E:\\program\\eclipse project\\Server\\WebContent\\img";

这样,图片在上传到该工作空间后,因为项目发生了改变,eclipse会再次发布工程,这时图片便会同步到tomcat服务器中,这时,我们前端jsp页面也就可以通过URL定位到图片了。

 

注意的地方:

归根到底这些问题其实还是因为我们是在调试的工程中,发布后肯定是不会出现这些问题的。因为你想想我们的web工程一般是发布到Linux下,发布了之后你的tomcat服务器只有关闭和打开,而不会对工程重新部署,自然也就不会出现这些问题。然后这也同时出现了另外一个问题,就是我们的web系统是在Linux下,也不会有eclipse环境,那也就更不用谈什么工作空间了,所以如果在代码中String path = "E:\\program\\eclipse project\\Server\\WebContent\\img";这么写系统肯定会报错咯。所以最终来说,改成这样也只是权宜之计,方便我们在调试的时候用的,到项目正式发布的时候需要我们再将路径改成request.getSession().getServletContext().getRealPath("/img")的。

 

 

 

---------------------------------------------------------------------------分割线--------------------------------------------------------------------------------------------------------------

还有另外一种说法:

 

背景:
相对路径和绝对路径,  这问题在原来的myeclipse或者eclipse中不是个大问题,因为在myeclipse或者eclipse中,项目通过tomcat发布都是发布到webapp目录下的,而在上传图片这种静态资源的时候,考虑到图片不能随着项目发布而消失,所以我们以前的解决方法就是在tomcat的webapp目录下建一个与项目同级的files文件夹,用于存储图片,excel,word等静态文件。这样的话就可以有效的避免在项目发布的过程中静态资源消失的问题。

但是换到idea中之后,由于在idea中,项目通过tomcat发布时,项目并不是存在tomcat里的,而是存在artifacts中的Output directory所对应的文件目录下。

 

 

 

所以用了绝对路径也找不到,用相对路径更加不对,花了很多时间。后来想到,既然路径可以自己定义那为什么不和以前一样放在tomcat的webapp下面呢,不仅熟悉,而且安全,可以控制权限,这里建议大家不要把项目代码或者静态资源放在服务器的C、D、E这种硬盘上,如果被黑客入侵那么资源就没了,tomcat的webapp目录可以设置访问修改权限所以比较安全。修改了项目发布的路径就简单了。

 

所以正确的做法如下: 

*****事实上, 由于idea有个虚拟路径这种东西

正确的配置上的话,  如下图, 就可以访问静态资源等文件了

 

 

因此正确的步骤是: 

在项目的入口请求中,也就是用户整个系统的入口页面跳转请求中获取服务器的根目录,可以使用request.getSession().getServletContext().getRealPath("/");这个方法拿到localhost:8080/项目名,  在这个地址下,接下来通过String 的indexOf()方法和subString()方法把项目名替换掉加上刚刚配置的 /files/… 就可以了,  这样图片或者其他的静态资源就正常的加载出来了。

//不推荐使用获取工程的根路径
 String a = request.getRealPath("/")
 //获取jsp的路径,这个方法比较好用,可以直接在servlet和jsp中使用
 String b = request.getRealPath(request.getRequestURI());
 //获取工程的根路径,这个方法比较好用,可以直接在servlet和jsp中使用
 String c = request.getSession().getServletContext().getRealPath("/");
 //获取工程classes 下的路径,这个方法可以在任意jsp,servlet,java文件中使用,因为不管是jsp,servlet其实都是java程序,都是一个 class。所以它应该是一个通用的方法。
 String d = this.getClass().getClassLoader().getResource("").getPath();
System.out.println(
"a等于:"+a); //a等于:D:\idea\idea_project\javahou\out\artifacts\storeSystem_war_exploded\

System.out.println("b等于:"+b); //b等于:D:\idea\idea_project\javahou\out\artifacts\storeSystem_war_exploded\storeSystem\AdminProductServlet

System.out.println("c等于:"+c); //c等于:D:\idea\idea_project\javahou\out\artifacts\storeSystem_war_exploded\

System.out.println("d等于:"+d); //d等于:/D:/idea/idea_project/javahou/out/artifacts/storeSystem_war_exploded/WEB-INF/classes/

 

配置 tomcat 中的静态资源的上下文访问路径,  如下图: 

 

首先, 在其他的工具中, 使用绝对路径或者相对路径, 就可以访问图片等静态资源,   在js或者jsp中最好直接使用绝对路径,这样会少掉很多问题。但是 idea中支持虚拟路径,专门用于访问静态资源,首先,  点开tomcat的配置, 进行如下的操作

 

 

 

 

在需要使用到静态资源的地方使用上图中配置的静态资源上下文路径再加上资源的相对路径即可,  如下图

 

 

 

 

 

 

总结:

 


1. 使用eclipse,使用tomcat发布项目,将项目发布到tomcat目录在的webapp目录中
2. 使用idea,使用tomcat发布项目,静tomcat发布到artifacts中的Output directory所对应的文件目录下。
3. javaweb图片上传tomcat重启部署,图片消失
  eclipse解决是将静态资源存到与工程目录同级目录下或者存在eclipse工作空间的目录下String path
= “E:\program\eclipse project\Server\WebContent\img”; 这样,图片在上传到该工作空间后,因为项目发生了改变,eclipse会再次发布工程,这时图片便会同步到tomcat服务器中,这时,我们前端jsp页面也就可以通过URL定位到图片了。 当我们重新发布工程的时候,tomcat其实是先将原来的工程删掉,然后再将改动过的新的工程放上去
4. idea 重新发布工程的时候。tomcat不将原来的工程删掉,是在原基础上将添加的内容追加上去

 

posted @ 2021-12-16 13:37  nicholasm4  阅读(3876)  评论(0编辑  收藏  举报