最近在学习 张孝祥老师的Tomcat 视频, 算是后知后觉了吧,为了以后复习巩固,我把一些要点记下来。
操作系统:win7 旗舰版 64位
Tomcat 版本:apache-tomcat-7.0.23-windows-x64.zip (直接加压使用)
Tomcat 解压目录:D:\tomcat-7.0.23(“Tomcat 解压目录” 根据具体情况改变 )
一、 设置Tomcat 运行环境
Tomcat 运行需要设置JAVA_HOME 环境变量
JAVA_HOME 变量的设置方式有两种:
方法1. 在“计算机” —— 右键点击 “属性” —— 点击 “高级系统变量” —— 在 “高级”选项卡下 —— 点击“ 环境变量” —— 在“系统变量” 下点击“新建” 按钮
输入“变量名” :JAVA_HOME
输入变量值:D:\jdk1.7.0_01 (这是我的JDK的安装目录)
然后一直点击确定按钮
方法2. 找到 D:\tomcat-7.0.23\bin 目录 下的 startup.bat 批处理文件,用文本方式打开
在第一行代码后面添加代码 set JAVA_HOME=D:\jdk1.7.0_01
如下:
@echo offset JAVA_HOME=D:\jdk1.7.0_01
二、环境变量测试:
运行cmd 下转到 D:\tomcat-7.0.23\bin 目录下运行 startup.bat
Tomcat 会弹出一个新的运行框,显示巴拉巴拉一堆运行状态回显,如果回显文字信息中没有错误和警告,说明 Tomcat 启动加载已经OK
浏览器运行: 弹出漂亮的 Tomcat 主页面 说明Tomcat 运行成功
三、 startup.bat 批处理文件详解
提示:我是在cmd中,转到 D:\tomcat-7.0.23\bin 目录下运行 startup.bat ,所以我的当前工作目录为:D:\tomcat-7.0.23\bin ,以此目录为例进行详解
Tomcat 解压目录:D:\tomcat-7.0.23
- @echo off //此行命令效果:只显示下列命令执行结果,不显示命令本身
@echo off //此行命令效果:只显示下列命令执行结果,不显示命令本身
- if "%OS%" == "Windows_NT" setlocal //如果本机OS是windows_NT 则设置本机环境变量
if "%OS%" == "Windows_NT" setlocal //如果本机OS是windows_NT 则设置本机环境变量
- rem Guess CATALINA_HOME if not defined //为注释代码:判断 CATALINA_HOME 环境变量是否已经配置
- set "CURRENT_DIR=%cd%" //设置CURRENT_DIR 变量(当前工作目录)为:D:\tomcat-7.0.23\bin
- if not "%CATALINA_HOME%" == "" goto gotHome //如果配置了 CATALINA_HOME 环境变量跳转执行 gotHome
rem Guess CATALINA_HOME if not defined //为注释代码:判断 CATALINA_HOME 环境变量是否已经配置 set "CURRENT_DIR=%cd%" //设置CURRENT_DIR 变量(当前工作目录)为:D:\tomcat-7.0.23\bin if not "%CATALINA_HOME%" == "" goto gotHome //如果配置了 CATALINA_HOME 环境变量跳转执行 gotHome
- set "CATALINA_HOME=%CURRENT_DIR%" //如果没有设置,则设置 CATALINA_HOME 变量为:D:\tomcat-7.0.23\bin
- if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome //查看"当前工作目录\bin" 目录(即D:\tomcat-7.0.23\bin\bin)下是否存在catalina.bat 文件,如存在跳转okHome
- cd .. //回到上级子目录,即:D:\tomcat-7.0.23 ,此时当前工作目录已经更改为:D:\tomcat-7.0.23
- set "CATALINA_HOME=%cd%" // 更改 CATALINA_HOME 变量值为:D:\tomcat-7.0.23
- cd "%CURRENT_DIR%" //切换至当前工作目录:D:\tomcat-7.0.23
set "CATALINA_HOME=%CURRENT_DIR%" //如果没有设置,则设置 CATALINA_HOME 变量为:D:\tomcat-7.0.23\bin if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome //查看"当前工作目录\bin" 目录(即D:\tomcat-7.0.23\bin\bin)下是否存在catalina.bat 文件,如存在跳转okHome cd .. //回到上级子目录,即:D:\tomcat-7.0.23 ,此时当前工作目录已经更改为:D:\tomcat-7.0.23 set "CATALINA_HOME=%cd%" // 更改 CATALINA_HOME 变量值为:D:\tomcat-7.0.23 cd "%CURRENT_DIR%" //切换至当前工作目录:D:\tomcat-7.0.23
- :gotHome
- if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome //如果找得到 catalina.bat 批处理文件,则跳转okHome
:gotHome if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome //如果找得到 catalina.bat 批处理文件,则跳转okHome
- echo The CATALINA_HOME environment variable is not defined correctly //找不到catalina.bat文件,显示错误信息,然后结束
- echo This environment variable is needed to run this program //在cmd执行startup.bat的当前目录不为:“tomcat解压目录”和“tomcat解压目录\bin”时会提示此错误信息
echo The CATALINA_HOME environment variable is not defined correctly //找不到catalina.bat文件,显示错误信息,然后结束 echo This environment variable is needed to run this program //在cmd执行startup.bat的当前目录不为:“tomcat解压目录”和“tomcat解压目录\bin”时会提示此错误信息
goto end
- //由此可见 catalina.bat 才是真正的执行 Tomcat 启动和关闭的批处理程序
//由此可见 catalina.bat 才是真正的执行 Tomcat 启动和关闭的批处理程序
- //在执行startup.bat时,如果startup.bat 文件不在 ”Tomcat解压目录“或者“Tomcat解压目录\bin” 目录下
//在执行startup.bat时,如果startup.bat 文件不在 ”Tomcat解压目录“或者“Tomcat解压目录\bin” 目录下
//才会提示CATALINA_HOME 错误信息
- :okHome
- set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" //至此catalina.bat文件已经确定存在了,现在设置 EXECUTABLE (执行文件)环境变量
:okHome set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" //至此catalina.bat文件已经确定存在了,现在设置 EXECUTABLE (执行文件)环境变量
- rem Check that target executable exists
rem Check that target executable exists
- if exist "%EXECUTABLE%" goto okExec //如果EXECUTABLE 变量已经设置成功,跳转okExec执行
if exist "%EXECUTABLE%" goto okExec //如果EXECUTABLE 变量已经设置成功,跳转okExec执行
- echo Cannot find "%EXECUTABLE%" //否则提示找不到catalina.bat 执行文件
echo Cannot find "%EXECUTABLE%" //否则提示找不到catalina.bat 执行文件
- echo This file is needed to run this program
- goto end
echo This file is needed to run this program goto end
- :okExec
- rem Get remaining unshifted command line arguments and save them in the
- set CMD_LINE_ARGS= //清除CMD_LINE_ARGS环境变量原来的值
:okExec rem Get remaining unshifted command line arguments and save them in the set CMD_LINE_ARGS= //清除CMD_LINE_ARGS环境变量原来的值
- :setArgs
- if ""%1""=="""" goto doneSetArgs //如果第二个参数为空跳转doneSetArgs,即已经接完了传入的参数
:setArgs if ""%1""=="""" goto doneSetArgs //如果第二个参数为空跳转doneSetArgs,即已经接完了传入的参数
- set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 //给 CMD_LINE_ARGS 添加参数,并以空格隔开
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 //给 CMD_LINE_ARGS 添加参数,并以空格隔开
- shift //截掉第一个参数,使第二个参数变为第一个参数
shift //截掉第一个参数,使第二个参数变为第一个参数
goto setArgs
- // 以上5行代码的作用就是将所有参数用空格间隔开,并赋值CMD_LINE_ARGS
// 以上5行代码的作用就是将所有参数用空格间隔开,并赋值CMD_LINE_ARGS
- :doneSetArgs
- call "%EXECUTABLE%" start %CMD_LINE_ARGS% //打开新窗口,执行 EXECUTABLE 环境变量所代表的catalina.bat 批处理文件与 CMD_LINE_ARGS 代表的参数
:doneSetArgs call "%EXECUTABLE%" start %CMD_LINE_ARGS% //打开新窗口,执行 EXECUTABLE 环境变量所代表的catalina.bat 批处理文件与 CMD_LINE_ARGS 代表的参数
:end //结束
总结:
1. startup.bat 的作用主要是检查catalina.bat 执行所需环境,并调用catalina.bat 批处理文件
2. shutdown.bat 文件与 startup.bat 文件的内容只有一点不同,即倒数第二行代码,通过修改执行参数 start 为stop 并交由catalina.bat 执行实现Tomcat 的关闭功能
补充:
1. rem
代码前面有 rem :所修饰的代码是注释说明文字
2. @
代码前面有 @ :所修饰的代码执行时,只显示执行结果,不显示命令本身
操作系统:win7 旗舰版 64位
Tomcat 版本:apache-tomcat-7.0.23-windows-x64.zip (直接加压使用)
Tomcat 解压目录:D:\tomcat-7.0.23(“Tomcat 解压目录” 根据具体情况改变 )
提示:我是在cmd中,转到 D:\tomcat-7.0.23\bin 目录下运行 startup.bat ,所以我的当前工作目录为:D:\tomcat-7.0.23\bin ,以此目录为例进行详解
在Tomcat中 catalina.bat 才是真正的执行 Tomcat 启动和关闭的批处理程序
一、catalina.bat详解部分代码:
- rem Get standard Java environment variables
- if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath//检查是否存在 setclasspath.bat 文件
- echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"//如果不存在,提示找不到setclasspath.bat 文件
- echo This file is needed to run this program
- goto end
- :okSetclasspath
- call "%CATALINA_HOME%\bin\setclasspath.bat" %1 //运行setclasspath.bat 文件
- if errorlevel 1 goto end
rem Get standard Java environment variables if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath//检查是否存在 setclasspath.bat 文件 echo Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"//如果不存在,提示找不到setclasspath.bat 文件 echo This file is needed to run this program goto end :okSetclasspath call "%CATALINA_HOME%\bin\setclasspath.bat" %1 //运行setclasspath.bat 文件 if errorlevel 1 goto end
- rem quotes into the CLASSPATH
- if "%CLASSPATH%" == "" goto emptyClasspath//如果CLASSPATH 变量没有设置,跳转emptyClasspath
- set "CLASSPATH=%CLASSPATH%;"
- :emptyClasspath
- set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"// 追加 bootstrap.jar 文件目录为CLASSPATH 环境变量
- // bootstrap.jar 是Tomcat 的内核,bootstrap.jar 同时引用了另外一个jar 包:commons-daemon.jar
- // 可以用解压文件查看bootstrap.jar\META-INF\MANIFEST.MF 文件,里面的Class-Path值为: commons-daemon.jar
- //Main-Class 值为:org.apache.catalina.startup.Bootstrap ,说明Tomcat主启动程序的类为Bootstrap
rem quotes into the CLASSPATH if "%CLASSPATH%" == "" goto emptyClasspath//如果CLASSPATH 变量没有设置,跳转emptyClasspath set "CLASSPATH=%CLASSPATH%;" :emptyClasspath set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"// 追加 bootstrap.jar 文件目录为CLASSPATH 环境变量 // bootstrap.jar 是Tomcat 的内核,bootstrap.jar 同时引用了另外一个jar 包:commons-daemon.jar // 可以用解压文件查看bootstrap.jar\META-INF\MANIFEST.MF 文件,里面的Class-Path值为: commons-daemon.jar //Main-Class 值为:org.apache.catalina.startup.Bootstrap ,说明Tomcat主启动程序的类为Bootstrap
- set _EXECJAVA=%_RUNJAVA%
- set MAINCLASS=org.apache.catalina.startup.Bootstrap//设置主启动类
- set ACTION=start
- set SECURITY_POLICY_FILE=
- set DEBUG_OPTS=
- set JPDA=
set _EXECJAVA=%_RUNJAVA% set MAINCLASS=org.apache.catalina.startup.Bootstrap//设置主启动类 set ACTION=start set SECURITY_POLICY_FILE= set DEBUG_OPTS= set JPDA=
- :doStart
- shift
- if not "%OS%" == "Windows_NT" goto noTitle
- if "%TITLE%" == "" set TITLE=Tomcat//设置TITLE (标题)参数为“Tomcat”
- set _EXECJAVA=start "%TITLE%" %_RUNJAVA% //在新窗口执行命令
:doStart shift if not "%OS%" == "Windows_NT" goto noTitle if "%TITLE%" == "" set TITLE=Tomcat//设置TITLE (标题)参数为“Tomcat” set _EXECJAVA=start "%TITLE%" %_RUNJAVA% //在新窗口执行命令
二、setclasspath.bat
- rem In debug mode we need a real JDK (JAVA_HOME)
- if ""%1"" == ""debug"" goto needJavaHome //debug 模式下需要设置JAVA_HOME环境变量
-
- rem Otherwise either JRE or JDK are fine
- if not "%JRE_HOME%" == "" goto gotJreHome //如果设置了JRE_HOME 变量,跳转gotJreHome
- if not "%JAVA_HOME%" == "" goto gotJavaHome //如果设置了JAVA_HOME 变量,跳转gotJavaHome
- echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined//提示没有设置JAVA_HOME、JRE_HOME环境变量
- echo At least one of these environment variable is needed to run this program
- goto exit
-
- :needJavaHome
- rem Check if we have a usable JDK
- if "%JAVA_HOME%" == "" goto noJavaHome //如果没设置JAVA_HOME变量,跳转noJAVAHOME
- if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome//检查所需可执行文件
- if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome
- if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome
- if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome
- set "JRE_HOME=%JAVA_HOME%"//JAVA_HOME环境完整,将JAVA_HOME变量赋值JRE_HOME
- goto okJava
rem In debug mode we need a real JDK (JAVA_HOME) if ""%1"" == ""debug"" goto needJavaHome //debug 模式下需要设置JAVA_HOME环境变量 rem Otherwise either JRE or JDK are fine if not "%JRE_HOME%" == "" goto gotJreHome //如果设置了JRE_HOME 变量,跳转gotJreHome if not "%JAVA_HOME%" == "" goto gotJavaHome //如果设置了JAVA_HOME 变量,跳转gotJavaHome echo Neither the JAVA_HOME nor the JRE_HOME environment variable is defined//提示没有设置JAVA_HOME、JRE_HOME环境变量 echo At least one of these environment variable is needed to run this program goto exit :needJavaHome rem Check if we have a usable JDK if "%JAVA_HOME%" == "" goto noJavaHome //如果没设置JAVA_HOME变量,跳转noJAVAHOME if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome//检查所需可执行文件 if not exist "%JAVA_HOME%\bin\javaw.exe" goto noJavaHome if not exist "%JAVA_HOME%\bin\jdb.exe" goto noJavaHome if not exist "%JAVA_HOME%\bin\javac.exe" goto noJavaHome set "JRE_HOME=%JAVA_HOME%"//JAVA_HOME环境完整,将JAVA_HOME变量赋值JRE_HOME goto okJava
总结:
1. 许多参数,类似于classpath之类的环境变量在批处理文件执行后就会覆盖系统设置的变量,批处理文件结束后,系统的变量才会生效,所以在批处理文件执行期间需要修改classpath文件可在批处理文件中设置
2. 运行Tomcat 只需设置JAVA_HOME 环境变量,CATALINA_HOME 环境变量会从执行 startup.bat 的当前目录 CD 变量中赋值
3. 想要在Tomcat启动失败后能看到一闪而过的窗口,可修改 catalina.bat 文件下的代码
- :doStart
- shift
- if not "%OS%" == "Windows_NT" goto noTitle
- if "%TITLE%" == "" set TITLE=Tomcat
- set _EXECJAVA="color: rgb(255, 0, 0);">start "%TITLE%" %_RUNJAVA%
- goto gotTitle
- :noTitle
- set _EXECJAVA="color: rgb(255, 0, 0);">start %_RUNJAVA%
:doStart shift if not "%OS%" == "Windows_NT" goto noTitle if "%TITLE%" == "" set TITLE=Tomcat set _EXECJAVA=
start "%TITLE%" %_RUNJAVA% goto gotTitle :noTitle set _EXECJAVA=
start %_RUNJAVA%
红色部分删去,等号前后不能有空格
环境说明:
Tomcat 解压目录:D:\tomcat-7.0.23
一、默认根目录
概念及原则
1. Tomcat 的默认根目录:D:\tomcat-7.0.23\webapps\ROOT(ROOT 目录下必须有WEB-INF 目录,ROOT 目录才会被设置为默认根目录)
2. 只能有一个默认根目录
3. 一个 默认根目录只能映射一个 “文件系统目录”
虚拟根目录的设置
1. Tomcat 自动将D:\tomcat-7.0.23\webapps\ROOT 设置为根目录
对应的设置为:D:\tomcat-7.0.23\conf\server.xml 文件里的 元素,name属性:主机名称,appBase属性:基准目录 ,基准目录下的Root 目录被自动设置为根目录
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
2. 在 server.xml 文件中设置 元素
path: 为空代表网站根目录
docBase:可以设置绝对路径,也可设置相对路径,相对路径是相对 appBase 属性所设的目录而言的
说明:每一个 元素是一个主机,元素是一个虚拟目录
浏览测试路径 URL:
这时需要在D:\tomcat-7.0.23\webapps\web 目录下存在,index.html 文件
浏览测试路径 URL: 访问的文件是D:\tomcat-7.0.23\webapps\web\index.html
二、虚拟子目录
1. 可以设置多个 “虚拟目录”
2. 可以将一个 “文件系统目录” 映射成任意的单级或多级 “虚拟目录” 结构形式
3. 一个 “文件系统目录” 可以被映射成多个 “虚拟目录”
URL请求所访问的web文件的查找匹配原则:最长路径匹配原则
先查找最长的 “虚拟目录" 是否匹配URL路径,如果不匹配,再查找匹配的短“虚拟目录"
虚拟子目录设置
1. 在 server.xml 文件中设置 元素
path: 以 / 开头 ,表示虚拟子目录
docBase:可以设置绝对路径,也可设置相对路径,相对路径是相对 appBase 属性所设的目录而言的
说明:每一个 元素是一个主机,元素是一个虚拟目录
浏览测试路径 URL:
2. 特定目录中包含的 XML 文档包含元素
例如:
2.1 Tomcat 4.X 的/webapps 目录
2.2 Tomcat 5.X 的/conf/<引擎名>/<主机名> 目录
3. 元素的appBase 属性所设置的基准目录的下一级目录中含有 WEB-INF/web.xml 文件
4. 元素的appBase 属性所设置的基准目录中有 var 文件
var 文件打包方式
只打包文件夹里面的内容,不打包文件夹本身。 例如打包为test.var
1. 进入文件夹F:\web,使用打包命令
jar -cvf test.var .
此时生成的var 包在 F:\web 目录下
浏览测试路径 URL:
2. 不进入文件夹,在F:\ 路径下,使用打包命令
jar -cvf test.var -C web .
此时生成的var 包在F:\ 目录下,将 var 包放到 F:\web 目录下
浏览测试路径 URL:
注意:在D:\tomcat-7.0.23\webapps 目录或者D:\tomcat-7.0.23\webapps\ROOT 目录下,貌似要解压出来,我在测试时不加压不行
说明:在编写blog是使用了张孝祥老师的视频截图
一、基于主机名的虚拟主机
网络环境:
1. 浏览器访问基于主机名的虚拟主机时,访问URL必须采用主机名,不能使用IP地址
2.整个网络系统中必须建立主机名与IP地址的映射关系
2.1使用本地 Hosts 文件建立主机名与IP的映射关系(C:\Windows\System32\drivers\etc\Hosts)
127.0.0.1
127.0.0.1
2.2 使用DNS (要钱的)
在设置好Hosts 文件后使用命令行ping localhost 和 都能ping 通
创建两个虚拟主机的虚拟目录结构如下:
F:\web
|———+ VM1
|—————+ROOT
|————————+WEB-INF
|————————+index.html
|———+ VM2
|—————+ROOT
|————————+WEB-INF
|————————+index.html
修改 server.xml 文件
添加以下代码直 server.xml 文件的 元素中
- <Host name="" appBase="F:\web\VM1"
- unpackWARs="true" autoDeploy="true" />
- <Host name="" appBase="F:\web\VM2"
- unpackWARs="true" autoDeploy="true" />
测试:
1. 重启Tomcat
2. 浏览器测试:
URL:
URL:
二、基于端口号的虚拟主机
配置原理:
1. 一个 元素用于配置一个对外的连接器,对于Web服务器的每一个监听端口号,都要配置一个独立的元素
2. 一个 元素对应的连接器必须有一个 元素关联
3. 将一个或多个 元素与 元素关联的方式:将 元素与 元素嵌套在同一个 元素中
配置方法:
在 server.xml 文件 的 元素里面添加另一个 元素
- <Service name="<span style="color: rgb(255, 0, 0);">secend-servspan>">
- <Connector port="<span style="color: rgb(255, 0, 0);">80span>" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
-
- <Engine name="Catalina" defaultHost="<span style="color: rgb(255, 0, 0);">span>">
-
- <Host name="" appBase="F:\web\VM1"
- unpackWARs="true" autoDeploy="true" />
-
- <Host name="" appBase="F:\web\VM2"
- unpackWARs="true" autoDeploy="true" />
-
- Engine>
- Service>
secend-serv"> 80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ">
注意:
1. 元素的 name 属性名称必须与原 名称不同,因此修改为:secend-serv
2. 元素的 port 属性修改为 80(或者其他你想要的不被占用的端口)
3. 元素的 defaultHost 属性修改为所包含的一个 属性的 name 属性值,我选用
4. 此部分我没有测试成功,正在尝试中……
三、基于IP地址的虚拟主机
1. HTTP 1.0 不支持Host 字段,在站点统一使用80 端口时,人吗只能采用不同的IP地址来建立虚拟主机
缺点:每个虚拟主机占用一个IP,IP消耗严重
2. HTTP 1.1 可以使用不同的主机名建立多个WEB站点,所以提供商一般不再建立基于IP地址的虚拟主机服务
3. Tomcat 不提供基于IP地址的虚拟主机方式
张孝祥老师的测试方式如下(我用下面方法无法测试,不知道为什么):
1. CMD 命令行下运行:telnet localhost 8080
2. Ctrl + ] , 然后回车
3. GET /test.html HTTP/1.1
Host:主机名
说明:主机名若不写,默认为localhost