目录
- idea用tomcat发布javaWeb项目中的存在的图片存储路径问题解决
- Java获取当前项目的路径使用IDEA
idea用tomcat发布javaWeb项目中的存在的图片存储路径问题解决
链接1:idea用tomcat发布javaWeb项目中的存在的图片存储路径问题解决------------------:链接2:javaweb图片上传 tomcat重新部署 图片消失
总结:
- 使用eclipse,使用tomcat发布项目,将项目发布到tomcat目录在的webapp目录中
- 使用idea,使用tomcat发布项目,静tomcat发布到artifacts中的Output directory所对应的文件目录下。
- javaweb图片上传tomcat重启部署,图片消失
- eclipse解决是将静态资源存到与工程目录同级目录下或者存在eclipse工作空间的目录下String path = “E:\program\eclipse project\Server\WebContent\img”;
这样,图片在上传到该工作空间后,因为项目发生了改变,eclipse会再次发布工程,这时图片便会同步到tomcat服务器中,这时,我们前端jsp页面也就可以通过URL定位到图片了。
当我们重新发布工程的时候,tomcat其实是先将原来的工程删掉,然后再将改动过的新的工程放上去- idea 重新发布工程的时候。tomcat不将原来的工程删掉,是在原基础上将添加的内容追加上去
背景:
公司最近跟潮流,在技术一块进行了大刀阔斧的改革,换了编辑器(idea),换了框架(Spring+SpringMVC+Hibernate),更新了底层,优化了代码,除了原有的后台框架基础(ZK),和我们这些五大三粗的程序员和程序媛们,所有的都换了,这样的好处也就是让我们这些目光短浅的井底之蛙也见到了外面的世界,见到了外面新奇的技术,总的来说还是很有好处的。这也让我们提起了干劲,摸索着前进。
今天在做微信图片上传的时候碰到了一个坑爹的骂娘的bug,这问题在原来的myeclipse中不是问题,因为在myeclipse中,项目通过tomcat发布都是发布到webapp目录下的,而在上传图片这种静态资源的时候,考虑到图片不能随着项目发布而消失,所以我们以前的解决方法就是在tomcat的webapp目录下建一个与项目同级的files文件夹,用于存储图片,excel,word等静态文件。这样的话就可以有效的避免在项目发布的过程中静态资源消失的问题。但是换到idea中之后,由于在idea中,项目通过tomcat发布时,项目并不是存在tomcat里的,而是存在artifacts中的Output directory所对应的文件目录下。
所以用了绝对路径也找不到,用相对路径更加不对,花了很多时间。后来想到,既然路径可以自己定义那为什么不和以前一样放在tomcat的webapp下面呢,不仅熟悉,而且安全,可以控制权限,这里建议大家不要把项目代码或者静态资源放在服务器的C、D、E这种硬盘上,如果被黑客入侵那么资源就没了,tomcat的webapp目录可以设置访问修改权限所以比较安全。修改了项目发布的路径就简单了。
- 在项目的入口请求中,也就是用户整个系统的入口页面跳转请求中获取服务器的根目录,可以使用request.getSession().getServletContext().getRealPath("/");这个方法拿到localhost:8080/项目名。
这种地址,接下来通过String 的indexOf()方法和subString()方法讲项目名替换掉加上 files/… 了。这样图片就放到了服务器的根目录下。 - 图片存好了就需要访问了。在js或者jsp中最好直接使用绝对路径,这样会少掉很多问题。 idea中支持虚拟路径,专门用于访问静态资源,点开tomcat的配置
- 点击右侧的+号,选择External Source…选择你存图片的路径,然后在右边的Application context中输入访问你静态图片的路径,也就是img,点击ok,这样你在浏览器里直接可以通过localhost:8080/img/…访问你的图片了,在js或者jsp中也可以直接使用这个路径访问图片。但是localhost要换成域名,因为别人在别的地方访问你的网站需要域名地址。
- 总结:
- 一般静态资源不会和项目放在一起,以防止项目重启图片也没了。
- 访问静态资源最好可以使用绝对路径,可以在idea中设置虚拟路径作为静态资源的访问路径。
Java获取当前项目的路径使用IDEA
//不推荐使用获取工程的根路径
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/