tomcat war&war exploded getservletContext资源上传重启消失


浅谈项目使用war包和jar包部署的优缺点 - 禅明空间 - OSCHINA - 中文开源技术交流社区
Tomcat部署时war和war exploded区别以及平时踩得坑_徐刘根的博客-CSDN博客

war exploded:在tomcat->edit Configuration->deployment->’+'创建artifact

一般默认好像是war。 这两种方式getServletContext的位置是不一样的。

IDEA:war、war exploded

定义

war模式:将WEB工程以包的形式上传到服务器 ;

war exploded模式:将WEB工程以当前文件夹的位置关系上传到服务器;

(1)war模式这种可以称之为是发布模式,看名字也知道,这是先打成war包,再发布;

(2)war exploded模式是直接把文件夹、jsp页面 、classes等等移到Tomcat 部署文件夹里面,进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。

(3)在平时开发的时候,使用热部署的话,应该对Tomcat进行相应的设置,这样的话修改的jsp界面什么的东西才可以及时的显示出来。

区别:在getServletContext的时获取的位置是不一样的。

热部署

区别在于==是否支持热部署(修改jsp界面可以不用重启项目)==: idea配置热部署依然是在Configuration中,设置
on update action:update resources,
on frame deactivation:update resources。

资源上传重启消失、getRealPath、getServletContext

String filename = file.getOriginalFilename();   //获取文件名
String suffix = filename.substring(filename.lastIndexOf("."));
String src = request.getServletContext().getRealPath("file/video/images/");
System.out.println(request.getServletPath());
System.out.println(request.getServletContext());
System.out.println(src);
File dest = new File(src+ "/" + name + suffix);
String imgPath = "file/video/images/" + name+suffix;

servletPath: /manager/video/add(请求的地址)

getServeltContext: org.apache.catalina.core.ApplicationContextFacade@7617ce1c(不懂是啥)

getServletContext:(war方式获取到的是tomcat目录下的webapps)(而war_exploded获取到的是你代码的位置也就是我这里的C:\Users\xxx\Desktop\cinema2\video\src\main\webapp\file\video)

C:\Tomcat9-window64\apache-tomcat-9.0.17\webapps\video_war\file\video\images\

原因:在使用war方式部署项目是通过加载本地项目在部署到相应servlet的appbase位置,而上传资源是上传到tomcat的appbase里的位置,所以每次重启资源就会消失。

解决

  1. 采用war_exploded

  2. 上传资源在重启之前移到自己项目的相应位置

以下都是在一次次尝试得出的结论:

  1. 使用war,修改tomcat里server.xml 设置(纯属自作聪明不生效,项目还是部署在tomcat的webapps上了)

catalina_base

  1. 修改base的server.xml也无用,重启时修改不生效。说明不是从这里加载的。但是说明了生成的catalina_base文件在这里(启动输出信息的开头位置就有这些路径),改动是否生效就可以查看这个地方
    2.[在这里插入图片描述](https://img-blog.csdnimg.cn/20210504000934671.png)

  2. 在IDEA -》edit Configuration ,Configure可以设置tomcat base directory但是无法设置为本地项目地址,需要tomcat_config文件,从此处可以得知catalina_base是从tomcat中的conf文件进行加载相关配置的

在这里插入图片描述

  1. 勾选deploy application configured in tomcat instance 可以让tomcat的配置文件修改在idea生效,即catalina_base 位置的配置文件会随tomcat中conf文件改变而改变(比如server.xml,在添加context docBase不勾选的话修改不生效,但是appbase是生效的,原因不明,以下是文档解释)

This setting controls whether the apps you already have present in TOMCAT_HOME\webapps directory will be deployed when Tomcat is started from IntelliJ IDEA.

appbase

事实证明,上述是对的,修改tomcat中conf-server.xml中的appbase路径就会改变生成webapp的位置(即部署的位置),但无法将图片直接上传的本地上,还是需要自己复制过去。

docbase是填项目的位置 ,一般idea会自动部署,这个自己不用填。(因为你打开项目用的就是这个路径)

   <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
<Context path="/" docBase="C:/Users/lixin/eclipse-workspace/j2ee3/web" debug="0" reloadable="false" />

为什么添加了docBase还是无效呢?

  1. 没有生效 勾选deploy application configured in tomcat instance
  2. 代码中的source没有

appbase、docbase区别:

default appBase is webapps folder. and docBase is you application folder.

Tomcat里 appBase和docBase的区别 - The NoteBook of EricKong - BlogJava

最终结论

尝试这么多次,才想起无法解决的原因就只是因为以war方式进行部署,request.getServletContext.getRealPath获取的就是webapp的地址,而不是项目所在的地址。这么简单一句话开头就进行了说明,自己没想清楚进行乱试,徒增笑料耳。

最终想到的解决方式(stupid):以war方式想要不手动复制解决,就在每次上传成功时,在从tomcat/webapp 读取文件 在写入到想要写入的位置,即进行两次文件读取写入。

这个人和我最后总结结论近乎一致

idea配置tomcat里你不知道的小秘密_乔治大哥的博客-CSDN博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值