一、配置虚拟路径
Tomcat默认的项目部署目录是其根目录下的webapps目录,也就是说,你想要发布自己的项目,就必须将其打包放在webapps下。那么,问题来了,如果我们不想移动项目的原有位置,还想让tomcat帮我们管理这个应用,该怎么办呢?那就需要一定的配置了。tomcat提供了几种配置方案。在cmd中启动tomcat服务器,打开浏览器,输入http://localhost:8080/ 回车,进入tomcat主页,找到documentation或configuration链接,点击进入:
这里写了几种方式:
(1)修改tomcat/conf/server.xml文件,这种方式配置起来感觉最方便,但每次修改都要重启服务器。
找到文件最后的host标签,再加入context标签,context首字母大写,如下:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
<Service name="Catalina">
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" maxSwallowSize="-1"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<!--加入的内容-->
<Context path="/buyBook" docBase="F:/Project/Book"/>
</Host>
</Engine>
</Service>
</Server>
context标签的docBase是具体的web应用的路径,也就是你要发布的项目,Project可以认为是工程目录,一个工程目录下可以有多个web应用。path相当于对这个路径起个别名,在浏览器输入http://localhost:8080/buyBook就相当于访问这个目录。我要访问Book目录下的1.html,就可以直接输入http://localhost:8080/buyBook/1.html。当然别名可以为空,即path="", 这种情况下访问1.html就可以直接输入http://localhost:8080/1.html。不过对于多个web应用还是起个别名比较好。
(2):在conf/catalina/localhost/下新建xxx.xml,在里面加入context标签。这时,xxx就相当于上面那种方法的path属性,即访问的别名。
内容为:
<!--此时,path由文件名指定,所以就不用写了-->
<Context path="" docBase="F:/Project/Book"/>
直接在浏览器敲http://localhost:8080/buyBook/1.html 回车即可访问1.html。
这种方式修改配置文件名或内容后,不用重启服务器,直接就能访问。
tomcat还支持多级虚拟路径,例如将上面的buyBook.xml修改为:a#b#c.xml
访问时就要这样:http://localhost:8080/a/b/c/1.html
二、配置域名
可能有很多像我一样初学Web的同学很好奇,为什么在浏览器输入www.baidu.com就能访问百度主页,而我们开发时要输入http://localhost:8080/项目名/....,其实www.baidu.com是主机名,baidu.com是域名,输入主机名,回车后,系统首先要从本机查找主机名对应的IP地址,如果找到的话就直接访问对应的IP地址,如果找不到,就要从DNS域名解析服务器中查找。一个主机名对应着一台服务器上的资源,因此我们可以访问到服务器上的资源。
在server.xml中host标签就是配置主机对应的资源:
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
</Host>
可以看到tomcat将localhost主机对应的资源设置为webapps下的资源。这就是我们应该将项目部署在webapps下面的原因。
那我们能不能也直接敲www.baidu.com来访问我们自己的web应用呢?当然可以。不过我们要在DNS解析前告诉浏览器应该访问的IP地址。在c:/Windows/System32/drivers/etc目录下的hosts文件中配置了对应域名的IP地址,我们只需将www.baidu.com指向本机就Ok了。
然后再在server.xml文件中加入自己的host标签,同时将port端口号改为80,这样访问的时候就不用指定端口了。完整配置如下
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
<Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>
<GlobalNamingResources>
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
<Service name="Catalina">
<!--原来的8080要修改-->
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443" maxSwallowSize="-1"/>
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
<Engine defaultHost="localhost" name="Catalina">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
</Host>
<!--自己写的host标签-->
<Host appBase="F:/Project" autoDeploy="true" name="www.baidu.com" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt"/>
<Context path="" docBase="F:/Project/Book"/>
</Host>
</Engine>
</Service>
</Server>
效果:
注意:web项目下最好有个index.html,因为默认把index.html作为主页,如果是其他页面,要在主机名后面加上访问的路径。
最后,修改的东西最好测试后再修改过来,不然后期学习过程中可能造成不必要的麻烦。