Tomcat容器入门介绍
转自javaresearch.com由timgball 整理
Tomcat是一个免费的开源Web服务器,最新版本是5.5.1,支持Servlet2.4,JSP2.0,非常适合初学者学习Java Web开发。下面是一个简单的Tutorial:[安装Tomcat],在安装Tomcat之前,必须首先安装JDK1.4,因为Tomcat本身是纯Java程序,需要JVM运行,此外JSP页面需要javac来编译运行,因此必须安装JDK(单装JRE不行)。然后从Tomcat官方站点下载最新版的Tomcat:Windows版本:http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.5.1/bin/jakarta-tomcat-5.5.1.zip ,Linux版本:http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.5.1/bin/jakarta-tomcat-5.5.1.tar.gz
Tomcat不需安装,直接解压到某个目录即可(请注意整个路径不要有中文名)。
[配置Tomcat]
先设置如下环境变量:
JAVA_HOME = <JDK安装目录>
TOMCAT_HOME = <Tomcat根目录>
在Path最后附加:
Path = ......;%JAVA_HOME%/bin
如果使用linux,请用export设置环境变量。
然后打开控制台窗口,输入javac,如果能够运行,说明能找到JDK的编译器,输入java -version,如果显示1.4.x_xx则配置正确,否则检查是否安装了低版本的JDK(比如1.3版本),如果有低版本的JDK,把它从Path中移除即可。
[启动和关闭Tomcat]
打开目录%TOMCAT_HOME%/bin,运行startup.bat(linux下是startup.sh),稍等片刻,直到出现信息: Server startup in XXXXX ms表示启动成功!要关闭Tomcat,最好不要直接关掉控制台窗口,运行%TOMCAT_HOME%/bin/shutdown.bat(linux下是shutdown.sh)。
[第一个JSP程序]
运行在Tomcat的Web程序全部放在%TOMCAT_HOME%/webapps下,每个应用单独一个目录,我们开始写第一个"Hello, world"JSP页面。
首先,我们在%TOMCAT_HOME%/webapps下新建一个hello目录,作为整个Web应用程序的根目录,然后在hello目录下新建hello.jsp,用任何文本编辑器输入以下内容:
<% out.println("Hello, world."); %>
然后启动Tomcat,打开浏览器,输入http://localhost:8080/hello/hello.jsp,稍等片刻,浏览器显示“Hello, world.”我们的第一个JSP运行成功!
[Web开发基础]
J2EE的Web应用程序有标准的格式,我们先创建如下结构的目录(请严格区分大小写):
hello |
+- WEB-INF |
+- classes |
+- lib
+- web.xml
所有需要的class文件均以WEB-INF/classes/为根目录按包名存放,所有的jar文件全部放在WEB-INF/lib下,Web服务器(比如Tomcat)会自动把classes和lib下的所有jar文件动态添加到CLASSPATH中,其中classes目录优先级高,如果classes和lib中某个jar的class全名相同,则只会找到classes下的文件。
WEB-INF/web.xml是标准配置文件,负责注册Servlet,Filter及其它用到的资源。在我们的hello应用中,因为没有web.xml,Tomcat会使用缺省的配置文件(就是tomcat自带的web.xml)。
一般说来,自己写的class包括servlets,filter,javaBean等编译后放在classes目录下,用到的第三方jar(如struts.jar)放在lib下。
JSP文件可放在根目录下的任意位置,但是位置不同会影响URL的格式。以上面的hello应用为例,我们指定hello/hello.jsp,则URL为http://localhost:8080/hello/hello.jsp,若是放在hello/admin/hello.jsp,则相应的URL变为http://localhost:8080/hello/admin/hello.jsp,若是放在WEB-INF下,则用户不可直接访问此JSP文件,只能通过RequestDispatch间接访问,此方法可向用户屏蔽真实的URL,在struts等Web框架中被广泛使用。
[发布Web应用程序]
发布Web应用程序非常简单,直接使用jar命令将整个hello目录打包,命名为xxx.war,然后复制到另一台计算机的%TOMCAT_HOME%/webapps/下(或者别的Web服务器如Resin,WebLogic也可),启动服务器,它会自动找到这个war文件并解压安装。
./catalina.sh start 开启tomcat服务
./catalina.sh stop 关闭tomcat服务
Tomcat配置异常及其解决
Tomcat配置异常及其解决
1、JAVA_HOME 配置错误,或者没有配置
这时候,可以按照上面的步骤在来一次,在命令行中输入Java -version,如果显示
就表示成功了。
2、如果你的机器已经占有了8080 端口,则无法启动
解决方法
(1) 你可以8080 先关闭
netstat –an
netstat –anb 来查看谁占用该8080
(2) 主动改变tomcat的端口.
到 conf/server.xml 文件中修改
3、 能够正常启动,但是会导航到另外一个页面
去修改工具->管理加载项,把默认的导航给禁用即可
4、浏览器显示404 Not Found
在访问 tomcat时候,一定要保证 tomcat 服务器是启动,不然就会出现这种错误。
Tomcat的目录结构文件
bin: 启动和关闭tomcat的bat文件
conf: 配置文件
-->server.xml : 该文件用于配置和 server 相关的信息, 比如 tomcat启动端口后,配置Host, 配置Context (容器,它装载的有Wrapper,通过它可以对所有资源进行访问)即web应用
-->web.xml : 该文件配置与 web应用(web应用就相当于是一个 web站点)
-->tomcat-users.xml: 该文件用户配置tomcat 的用户密码 和 权限
lib 目录: 该目录放置运行tomcat 运行需要的jar包
logs 目录:存放日志, 当我们需要去查看日志的时候,很有用!,当我们启动tomcat错误时候,可以查询信息.
webapps 目录: 该目录下,放置我们的web应用(web 站点), 比如:
建立 web1 目录 下面放置我们的html 文件 jsp 文件..图片... 则 web1就被当做一个web应用管理起来(☞ 特别说明tomcat 6.0 以后支持 tomcat 5 版本 还有别的设置)
work: 工作目录: 该目录用于存放jsp被访问后 生成的对应的 server文件 和.class文件
如何访问一个web应用的某个文件
应用程序通过端口与操作系统进行连接,因此可以通过系统的端口号访问到应用程序,这是应用程序之间通信的途径
PS:想要访问一个WEB应用中的某个文件可以采用url(Uniform Resource Locator)统一资源定位符来访问,其格式如上。
Tomcat应用部署目录结构规范
Tomcat管理虚拟目录
需求:当希望将web应用部署到非webapps目录下时,换句话说,就是希望把非webapps目录下的web项目部署到tomcat中怎么解决这问题。
PS:可以通过虚拟目录配置技术解决。
配置步骤
1、找到server.xml文件
2、编辑host节点,添加Context path
//这里配置的设置都将成为,服务器找不到资源的第二方案,或者覆盖默认配置的方式
<Context path="/应用名" docBase="web应用所在的绝对路径"/>
例如:要访问该web应用根目录下的hello.html文件
实际访问时输入的地址:http://localhost:8088/应用名/hello.html
3、重启、重新部署生效
还可以参考http://www.cnblogs.com/w-wfy/p/6242329.html
context的几个属性的说明
path: 应用名称
docbase: web应用所在的绝对路径
reloadable: 如果设为ture ,表示 tomcat 会自动更新 web应用,但是这个开销大,建议在开发过程中,可以设为true, 但是真的发布了,则应当设为false
upackWAR: 如果设为 ture ,则自动解压,否则不自动解压.
PS:war包的打包和Tomcat怎么部署war包可以使用搜索引擎找到。
Tomcat管理虚拟路径配置
请问高人
如何在项目里面的JSP页面显示D盘的图片,项目部署在E 盘,就是说 图片不是放在项目下的文件夹?
解决方法:
虚拟路径啊,假设你的工程叫 abc
在 tomcat 的 server.xml 中设置
<Context docBase="e:/pic" path="/abc/pic" />
这样的话,就可以使用 http://localhost:8080/abc/pic 这个前缀访问 e:/pic 中的图片了。即jsp中<img src="http://localhost:8080/abc/pic/xx.jpg"/>如此写资源路径
这是因为当服务器访碰到两个 http://localhost:8080/http://localhost:8080/abc/pic时就会知道,这是一个虚拟路径,不按path路径走,选择docBase的路径找资源。
配置域名
实现的步骤如下:
//域名就是使用简易字符替代IP,这里www.myweb.com替代127.0.0.1,像localhost替代127.0.0.1一样
(1) 在C:\WINDOWS\system32\drivers\etc 下的host文件 添加127.0.0.1 www.myweb.com
(2) 在tomcat 的server.xml文件添加主机名
<Host name="www.myweb.com" appBase="d:\web3”>
<Context path="/" docBase="d:\web3" />
//这里是说,如果上述path路径访问不到,就到docBase路径下访问
</Host>
(3) 在d:\web3 加入了一个 /WEB-INF/web.xml 把 hello2.html设为首页面,如果连端口都不希望带,则可以把tomcat的启动端口设为80即可.
(4) 重启生效
Tomcat框架机制
Tomcat配置默认主机
在tomcat/conf/server.xml 文件
<Engine name="Catalina" defaultHost="主机名">
如:<Engine name="Catalina" defaultHost="www.myweb.com">
Tomcat配置线程池
Connector是可以配置共享线程池的,其作用是在访问量多的情况下,自动增加线程数量,直到maxThread为止,访问量趋于平缓之后渐渐减少线程数量,最少到minSpareThreads。开启Tomcat,该线程池即有minSpareThread条线程。
- <Service name="Catalina">
- <Executor name="myThreadPool" namePrefix="catalina-exec-"
- maxThreads="50" minSpareThreads="10"/>
- <Connector port="8181" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"
- executor="myThreadPool" />
- </Service>
Executor标签即为线程池
maxThreads属性即为最大线程数
minSpareThreads即为最小空闲的线程数
Connector标签即为连接器
executor属性即为指定线程池
PS:Connector标签可以配置,maxThread,minSpareThreads两个属性,其作用和配置executor属性一样,但同时配置了executor和maxThread,minSpareThread。Connector会优先选择executor配置的线程池。
PS:建议使用executor属性和Executor标签来配置线程池,这样不仅可设置的线程池参数更多,而且也可以实现几个Connector共享一个线程池的配置,注意:不是共享一个线程池。
Tomcat配置访问日志
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
该配置为server.xml中的默认配置,其在Host标签下。
className:类名,默认的访问日志类为org.apache.catalina.valves.AccessLogValve
directory:文件存放目录,默认是:logs,其相对路径是Tomcat的主目录
prefix:前缀
suffix:后缀
fileDateFormat:按照什么时间给日志切片(分成不同日志文件,防止单一日志文件过大)。官方文档的描述:The default value is yyyy-MM-dd
. If you wish to rotate every hour, then set this value to yyyy-MM-dd.HH
.
rotatable:该属性是与fileDateFormat配套使用的,默认为true,如果设置为false,日志文件将不切片。
pattern:输出文件的模式(格式)。
有以下模式:(截取自官方文档)
- %a - Remote IP address
- %A - Local IP address
- %b - Bytes sent, excluding HTTP headers, or '-' if zero
- %B - Bytes sent, excluding HTTP headers
-
%h - Remote host name (or IP address if
enableLookups
for the connector is false) - %H - Request protocol
- %l - Remote logical username from identd (always returns '-')
- %m - Request method (GET, POST, etc.)
-
%p - Local port on which this request was received. See also
%{xxx}p
below. - %q - Query string (prepended with a '?' if it exists)
- %r - First line of the request (method and request URI)
- %s - HTTP status code of the response
- %S - User session ID
- %t - Date and time, in Common Log Format
- %u - Remote user that was authenticated (if any), else '-'
- %U - Requested URL path
- %v - Local server name
- %D - Time taken to process the request, in millis
- %T - Time taken to process the request, in seconds
- %F - Time taken to commit the response, in millis
- %I - Current request thread name (can compare later with stacktraces)
There is also support to write information incoming or outgoing headers, cookies, session or request attributes and special timestamp formats. It is modeled after the Apache HTTP Server log configuration syntax. Each of them can be used multiple times with different xxx
keys:
-
%{xxx}i
write value of incoming header with namexxx
-
%{xxx}o
write value of outgoing header with namexxx
-
%{xxx}c
write value of cookie with namexxx
-
%{xxx}r
write value of ServletRequest attribute with namexxx
-
%{xxx}s
write value of HttpSession attribute with namexxx
-
%{xxx}p
write local (server) port (xxx==local
) or remote (client) port (xxx=remote
) -
%{xxx}t
write timestamp at the end of the request formatted using the enhanced SimpleDateFormat patternxxx
手工方式打WAR包
第一步:进入到要打包的目录下,注意,目录结构必须符合Tomcat规范。
SwitchdeMacBook-Pro:webapps switch$ cd Restaurant/
第二步:使用jar cvf 打包后文件名 打包的文件夹
SwitchdeMacBook-Pro:Restaurant switch$ jar cvf Restaurant.war .
已添加清单
正在添加: SoybeanMilk.html(输入 = 58) (输出 = 48)(压缩了 17%)
正在添加: WEB-INF/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: WEB-INF/classes/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: WEB-INF/classes/com/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: WEB-INF/classes/com/netease/(输入 = 0) (输出 = 0)(存储了 0%)
正在添加: WEB-INF/classes/com/netease/NoodlesServlet.class(输入 = 1114) (输出 = 608)(压缩了 45%)
正在添加: WEB-INF/classes/com/netease/NoodlesServlet.java(输入 = 740) (输出 = 318)(压缩了 57%)
正在添加: WEB-INF/web.xml(输入 = 361) (输出 = 173)(压缩了 52%)
PS:可以看到打包成功了
SwitchdeMacBook-Pro:Restaurant switch$ ls
Restaurant.war SoybeanMilk.html WEB-INF
第三步:将打包好的文件移动至应用目录,默认为:Tomcat主目录下的webapps
SwitchdeMacBook-Pro:Restaurant switch$ mv Restaurant.war ..
PS:可以看到移动到了webapps目录下
SwitchdeMacBook-Pro:Restaurant switch$ cd ..
SwitchdeMacBook-Pro:webapps switch$ ls
ROOT Restaurant Restaurant.war docs examples host-manager manager
PS:这是将原来的应用删除
SwitchdeMacBook-Pro:webapps switch$ rm -rf Restaurant
PS:原来的应用已被删除
SwitchdeMacBook-Pro:webapps switch$ ls
ROOT Restaurant.war docs examples host-manager manager
PS:启动Tomcat
SwitchdeMacBook-Pro:webapps switch$ ../bin/startup.sh
Using CATALINA_BASE: /Users/switch/apache-tomcat-7.0.70
Using CATALINA_HOME: /Users/switch/apache-tomcat-7.0.70
Using CATALINA_TMPDIR: /Users/switch/apache-tomcat-7.0.70/temp
Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
Using CLASSPATH: /Users/switch/apache-tomcat-7.0.70/bin/bootstrap.jar:/Users/switch/apache-tomcat-7.0.70/bin/tomcat-juli.jar
Tomcat started.
PS:访问该应用
SwitchdeMacBook-Pro:webapps switch$ curl http://localhost:8080/Restaurant/noodles
<html><body>
<h1> Noodles with Tomcat</h1>
</body></html>
PS:可以看到webapps目录下自动生成了该war包对应的应用
SwitchdeMacBook-Pro:webapps switch$ ls
ROOT Restaurant Restaurant.war docs examples host-manager manager
SwitchdeMacBook-Pro:webapps switch$
----------参考《Apache Tomcat 7 Configuration Reference (7.0.70) - The Valve Component》
----------参考《韩顺平.细说Servlet》