标签:
web应用程序指供浏览器访问的程序,通常也简称为web应用。
web应用:例如有a.html 、b.html…..多个web资源,这多个web资源用于对外提供邮件服务,此时应把这多个web资源放在一个目录中,以组成一个web应用(或web应用程序)。
一个web应用由多个静态web资源和动态web资源组成,如
组成web应用的这些文件通常我们会使用一个目录组织,这个目录称之为web应用所在目录。
web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。那么在Tomcat服务器中,如何进行虚拟目录的映射呢?总共有如下的几种方式:
找到server.xml文件的host元素,如下:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
在<Host></Host>
这对标签加上<Context path="/JavaWebApp" docBase="c:\mail" />
,即可将在c盘下的mail这个JavaWeb应用映射到JavaWebApp这个虚拟目录上,JavaWebApp这个虚拟目录是由Tomcat服务器管理的,JavaWebApp是一个硬盘上不存在的目录,是我们自己随便写的一个目录,也就是虚拟的一个目录,所以称之为”虚拟目录”,代码如下:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Context path="/JavaWebApp" docBase="c:\mail" />
</Host>
其中,Context表示上下文,代表的就是一个JavaWeb应用,Context元素有两个属性:
使用浏览器访问”/JavaWebApp”这个虚拟目录下的1.html这个web资源,访问结果如下:
1.html可以正常访问,这说明我们已经成功地将在c盘下的mail这个JavaWeb应用映射到JavaWebApp这个虚拟目录上了,访问”/JavaWebApp/1.html”就相当于访问”c:\mail\1.html”。
注意:在Tomcat6之后中,不再建议在server.xml文件中使用配置context元素的方式来添加虚拟目录的映射,因为每次修改server.xml文件后,Tomcat服务器就必须要重新启动后才能重新加载server.xml文件。在Tomcat服务器的文档http://localhost:8080/docs/config/context.html#Defining_a_context
中有这样的说明:
It is NOT recommended to place
<Context>
elements directly in the server.xml file. This is because it makes modifying the Context configuration more invasive since the main conf/server.xml file cannot be reloaded without restarting Tomcat.
借助有道翻译为:
不建议直接在server.xml文件中放置
<Context>
元素。这是因为修改Context配置会带来更多的攻击性,因为若不重启Tomcat,主要的conf/server.xml文件不能被重新加载。
除了第一句话,翻译的真是狗屁不通。
tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚拟目录。换句话说,tomcat服务器webapps目录中的web应用,外界可以直接访问。
例如:把c盘下的mail这个JavaWeb应用直接copy到tomcat服务器webapps目录中,如下图所示:
此时Tomcat服务器就会自动为mail这个JavaWeb应用映射成一个同名的虚拟目录”/mail”,然后就可以使用浏览器访问这个JavaWeb应用的资源了,如下图所示:
参考Tomcat服务器文档:
我们主要关注下面这几句话:
In the $CATALINA_BASE/conf/context.xml file: the Context element information will be loaded by all web applications.
解释:$CATALINA_BASE指的就是tomcat服务器根目录。以上这句话的意思是说——在conf/context.xml文件中,Context元素信息被所有的web应用加载。即Context元素的配置信息会被所有web应用程序所共享。这不是我们所要的!!!
In the $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default file: the Context element information will be loaded by all web applications of that host.
解释:[enginename]指的是Tomcat服务器使用的引擎名称,Tomcat使用的引擎是Catalina;[hostname]指的是主机名。以上这句话的意思是说——在conf/Catalina/localhost/context.xml.default文件(没有就新建)中,Context元素信息将被这台主机上的所有web应用加载。同理,这也不是我们所想要的!!!
In individual files (with a “.xml” extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension). This file will always take precedence over any context.xml file packaged in the web application’s META-INF directory.
解释:在tomcat服务器的/conf/Catalina/localhost目录下添加一个以xml作为扩展名的文件,xml文件的名字可以任意取,比如下面的aa.xml,注意这一句话”The context path and version will be derived from the base name of the file“,这一句话的意思翻译过来就是”context元素的path属性源自于这个xml文件的名字”,上面提到过,Context元素的path属性是用来配置虚拟目录的名称的,所以虚拟目录的名称就是这个xml文件的名称。
在aa.xml文件中添加Context元素映射JavaWeb应用,代码如下:
<Context docBase="c:\mail" />
注意:在Context元素中并没有指明path属性来设置虚拟目录的名称,那么”c:\mail”映射的虚拟目录名称是神马呢,就是当前正在编辑的这个xml文件的名称aa。
使用这种方式映射虚拟目录的最大好处是修改了配置文件后不用重启Tomcat服务器,比如再复制一份aa.xml文件并重名为bb.xml文件。
此时有多条context path映射到JavaWeb应用。
注意:
在tomcat服务器的/conf/Catalina/localhost目录下添加的xml文件的名字还可以是这样的,如“ROOT.xml”:
此时默认的web应用就是c:\mail。当创建“ROOT.xml”文件后,需要重启tomcat服务器,因为要覆盖掉原来的默认web应用。需要重启tomcat服务器,就可这样访问了:
除了这种方法之外,还可在server.xml文件中配置:
<Context path="" docBase="C:\mail" />
只不过每次修改server.xml文件后,Tomcat服务器就必须要重新启动后才能重新加载server.xml文件。
开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错。
web应用中,web.xml文件是其中最重要的一个文件,它用于对web应用中的web资源进行配置。
WebRoot
→Web应用所在目录,一般情况下虚拟目录要配置到此文件夹当中,不是很明白这句话的意思。 WEB-INF
→此文件夹必须位于WebRoot文件夹里面,而且必须以这样的形式去命名,字母都要大写。web.xml
→配置文件,有格式要求,此文件必须以这样的形式去命名,并且必须放置到WEB-INF文件夹中。通过web.xml文件,可以将web应用中的:
web.xml的格式可以直接从Tomcat中参考得到:找到Tomcat目录下的webapps\ROOT\WEB-INF这个目录下的web.xml文件,把这个文件拷贝到我们新建的WEB-INF文件夹中,并修改这个web.xml文件,把里面的注释删除掉,只留下如下所示的代码即可:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 通过web.xml文件配置网站首页为1.html -->
<welcome-file-list>
<welcome-file>1.html</welcome-file>
</welcome-file-list>
</web-app>
配置虚似主机就是配置一个网站。
Tomcat服务器配置一个虚拟主机(网站),需要修改conf文件夹下的server.xml这个配置文件,使用Host元素进行配置,打开server.xml,可以看到Tomcat服务器自带的一个名称为localhost的虚拟主机(网站)。
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html
Note: The pattern used is equivalent to using pattern="common" -->
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
平时我们将开发好的JavaWeb应用放到webapps文件夹下,然后就可以使用http://localhost:端口号/JavaWebAppName
的方式去访问了,其实访问的就是name是”localhost”的那台虚拟主机(Host),这台虚拟主机管理webapps文件夹下的所有web应用。
例如:http://localhost:8080/mail/1.html
,这个URL地址访问的就是名称是localhost的那台虚拟主机下的mail这个应用里面的1.htm这个web资源。
我们可以使用如下的方式配置一个虚拟主机,例如:
<Host name="www.sina.com.cn" appBase="C:\sian">
</Host>
这里我们新配置一个虚拟主机,虚拟主机的name是”www.sina.com.cn”,虚拟主机”www.sina.com.cn”现在管理着sina文件夹下的所有web应用,平时我们在互联网上使用域名”www.baidu.com”访问百度的网站时,其实就是在访问一个名称是”www.baidu.com”的虚拟主机,所以当我们要访问name是”www.sina.com.cn”的这个虚拟主机时,就可以使用”域名(www.sina.com.cn)”去访问,注意一下appBase=”C:\sian”,这里的sina文件夹代表的不是一个项目的根目录,而是一个存放了一个或者多个JavaWeb应用的文件夹,如下图所示:
这就好像是Tomcat服务器的webapps文件夹一样,里面存放了很多的JavaWeb应用。
配置的主机(网站)要想通过域名被外部访问,必须在DNS服务器或windows系统中注册访问网站时使用的域名,找到”C:\Windows\System32\drivers\etc“目录下的hosts文件,如下图所示:
编辑这个文件,将新添加的网站的域名和IP地址绑定在一起,这样我们就可以在浏览器中使用www.sina.com.cn这个域名去访问name是www.sina.com.cn那个虚拟主机里面管理的那些web应用了。
# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a ‘#‘ symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
127.0.0.1 localhost
127.0.0.1 www.sina.com.cn
将设置的网站的域名www.sian.com.cn和本机的IP地址绑定在一起。
使用浏览器通过域名”www.sian.com.cn”访问”www.sian.com.cn”这个虚拟主机下的mail这个web应用下的1.html这个web资源,”www.sian.com.cn”这个虚拟主机开放了一个8080端口,用户只能通过这个8080端口去访问mail这个web应用下的1.html这个web资源。
标签:
原文地址:http://blog.csdn.net/yerenyuan_pku/article/details/51836130