运行环境:Tomcat6.0,eclipseMars
实现方法
(建议)方法1.%TOMCAT_HOME%/conf/server.xml文件中
<host> </host>之间加入如下代码:
<Context path="/inspect/uploadMedia" docBase="E:\project\inspect\uploadMedia" reloadable="true" crossContext="true"/>
最终 <host>的内容为:
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
<Context docBase="inspect" path="/inspect" reloadable="true" source="org.eclipse.jst.jee.server:inspect"/>
<Context path="/inspect/uploadMedia" docBase="E:\project\inspect\uploadMedia" reloadable="true" crossContext="true"/>
</Host>
方法2.不重启Tomcat就使虚拟目录生效
%TOMCAT_HOME%\conf\Catalina\localhost 新建JspTest.xml文件,
如%TOMCAT_HOME%\conf\Catalina\localhost\JspTest.xml
内容为:
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="E:\project\inspect\uploadMedia" reloadable="true" crossContext="true"/>
这种方法可以理解就是新建一个项目,识别xml的文件名为项目路径。
方法2中path是不需要的,设不设都认为是xml的文件名是其项目路径。
所以有2个缺点:①不能与项目名保持一致,如果你的项目是“域名/项目名“访问的情况,这种方式在页面指向虚拟目录资源时,不能使用项目根路径。②如果直接“域名”访问项目。这种方法的路径就是要加上xml作为虚拟路径。
其他尝试:
项目同名xml文件中只能有一个<Context> 不能像sever.xml中<HOST>配多个<Context>。
不能删除或修改原来指向项目的<Context>的docBase,这里修改了原项目就不能访问了。
属性说明:
%TOMCAT_HOME%:指tomcat的要根目录
docBase 是实际路径,一般为绝对磁盘路径,也可以写相对路径,相对路径是相对于tomcat安装目录的webapps目录,通常设置虚拟目录的目的是将tomcat的安装和项目的保存分开,所以这里建议使用磁盘绝对路径,并且这个磁盘路径不是在tomcat目录下。
workDir 是tomcat运行是对JSP文件做编译后的文件,这个文件最好也是分开。可以不设置
path 为虚拟路径,访问时的路径,注意:一定要加“/”。值得注意的是:path可以为"/"那么访问“IP:端口”就可以访问到布置的工程,如果为"/test",那么必须得访问“IP:端口/test”才能访问到。如果上面的项目path有内容,新加的虚拟路径就要在前面加上“/inspect”如"/inspect/uploadMedia",否则表示要通过http://localhost:8080/mediainfos访问到虚拟路径(即没有项目名。)
debug 建议设置为0,开发时也设置0,反正是用来放上传文件的,没什么感觉。
reloadable开发时设置true,实际部署时设置false。如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用
crossContext="true":虚拟路径要访问到别的电脑时如 docBase="//IP/data1" ,要配置成true,访问本地其他盘不影响。简而言之,允许跨域访问。
几个问题:
1. eclipseMARS每次重新部署或重启tomcat的时候会覆盖server.xml、 web.xml 和 \conf\Catalina\localhost\inspect.xml的问题,
是因为eclipseMARS中有这几个文件的配置文件,直接修改项目名为server/tomcatx.x下面相应的文件,部署的时候就直接覆盖tomcat目录下的原文件。
2. <host> </host>之间在修改之前就存在下面这一个context,是eclipse发布的时候添加的。这个删除项目就起不来。
<Context docBase="inspect" path="/inspect" reloadable="true" source="org.eclipse.jst.jee.server:inspect"/>
3. 虚拟目录默认不支持非英文路径(那些直接说不支持中文的人根本就没研究),原始的webapp目录下可以支持。如果想让虚拟路径也支持可以在server.xml中<Connector>(protocol="HTTP/1.1"的那个)添加URIEncoding="utf-8"(编码视具体项目而定)属性。
<Service>
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
</Service>
网上一些错误的信息:
1.%TOMCAT_HOME%/conf/web.xml文件中把虚拟路径显示目录给禁止啦,此时可以在web.xml文件中找到把listings 改为true。
其实不用改就能使用虚拟目录,建议为false。这个参数是控制能不能访问虚拟路径下的目录,为true时,即地址栏输入http://localhost:8080/inspect/uploadMedia/可以显示uploadMedia下的文件夹和文件,
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
上面的修改是全局修改。若在某一个应用中开启listing时,在WEB-INF/web.xml中:
<servlet>
<servlet-name>media</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>media</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>