目标
上传的图片保存在工程目录下,并能通过URL而不是绝对路径访问到。要能长久保存,避免在tomcat重启时被自动删掉。
初步思路
项目默认在tomcat/wtpwebapps路径下。之前写好上传代码,经过测试可以成功上传,但是tomcat重启后自动被删除。Google原因是该路径下保存的东西是临时的,配置tomcat虚拟路径即可解决。
按照网上流传的普遍解决方法
找到%TOMCAT_HOME%/conf/server.xml,(即tomcat的安装目录下面相关的文件)打开此xml文件,在 之间加入如下代码:
<Context path="/myproj" reloadable="true" debug="0" docBase="E:/workspace/myProj" />
操作步骤
- 原来的配置
<Context docBase="wiki-web" path="/wiki" reloadable="true" source="org.eclipse.jst.jee.server:wiki-web"/>
- 修改后
<Context docBase="E:\wiki-web" path="/wiki" reloadable="true" />
效果
可以通过URL查看到上传的图片,但是不能进行上传操作。关注点
source="org.eclipse.jst.jee.server:wiki-web"
如果在context配置中加上这句,就可以实现上传,但不能访问。
那么这句代码代表什么意思?
你觉得上面那个看起来不像是一个协议前缀 org.eclipse.jst.server 么?也就是说它是依赖于是什么东西来处理它。因此这个只适合 eclipse 来嵌入式插件来用它。它实际上并不是直接给 Tomcat 用的,而是插件在 “Publish” 时处理过一次后才交给 Tomcat,如下图所示:我们先在 JST 插件的工作目录下查看它管理>的服务器的部署状态索引文件 tmp-data,找到你的服务器的配置目录可能是 tmp0 或 tmp1 之类的,里面的内容才是真正给 Tomcat 用的,另外,当我们为服务器配置启用 ‘Serve Modules without publishing’ 时它的真实内容变成了下面第2张图片所示,明显的它加载了一个像插件一样的东西
org.eclipse.jst.server.tomcat.loader.WtpDirContext 和 org.eclipse.jst.server.tomcat.loader.WtpWebappLoader ,也就是说原来的 source 对应的目录什么的实际上并没有什么实际意义,至少可以由插件来提供自定义的实现方式,要注意到由 eclipse 来启动这个 tomcat 时可能提供的参数跟我们手工启动时是不一样的(至少它提供了 eclipse 的插件 jar 库在 ${catalina.base}/lib 中),也给我们一个扩展 tomcat 在开发环境中的功能的一个真实案例,我们还可以提供远程部署或者自动化从CVS上取代码自动部署的可能性,我们只需要给出 repository 和 tag 名称让它自动完成。最后我们在 .metadata 里面的临时工作目录下发现了它的 loader 库,我们反编译来研究一下开拓一下我们的视野。
好吧其实没看懂
怀疑是server的问题
new了一个新的server,把工程拉到下面跑
无法访问已上传图片
这次的发布路径是默认的..\workspace.metadata.plugins\org.eclipse.wst.server.core\temp1
我之前就知道这也是个临时目录,所以开始关注tomcat的server location属性设置。
这是修改后的,使用自定义路径,然后在server.xml里这样配置
<Context docBase="E:\wiki-web" path="/wiki" reloadable="true" source="org.eclipse.jst.jee.server:wiki-web"/>
重启tomcat,一切正常了,传个图片再重启,图片没被删!
问题解决了!
但是原因呢?
以下是从一篇博文中抽取的部分 原文链接
其实 D:\workSpace.metadata.plugins\org.eclipse.wst.server.core\tmp0\ 这个目录就是eclipse的对 D:\Tomcat 6.0 目录的一个克隆,从而使 D:\workSpace.metadata.plugins\org.eclipse.wst.server.core\tmp0\ 也能够具备源服务器的功能。
我把项目部署发布到tomcat的wtpwebapps目录下或workspace.metadata…目录下,都不能实现我的目标,因为这两个目录都是临时目录,上传的东西肯定会在重启时删掉的。设置deploy path让工程发布到其他路径下,再配置虚拟路径,将项目映射到tomcat,问题解决。
- 后记
把工程路径改回默认docBase=”wiki-web”
<Context docBase="wiki-web" path="/wiki" reloadable="true" source="org.eclipse.jst.jee.server:wiki-web"/>
同时将发布路径设置为自定义路径,也可以实现效果。
所以问题的本质就是发布路径的问题。
关于context的解释
Context代表了运行在Host上的单个Web应用,一个Host可以有多个Context元素,每个Web应用必须有唯一的URL路径,这个URL路径在Context中的属性path中设定.
Context元素的属性:
path:指定访问该Web应用的URL入口。docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于Host的appBase属性的相对路径,如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。
reloadable:如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。