目录
Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
Servlet 规范是开放的,除了 Sun 公司,其它公司也可以实现 Servlet 规范,目前常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它们都被称为“Servlet 容器”。Servlet 容器用来管理程序员编写的 Servlet 类。
Servlet容器最新版本是6.0 。
1.2.1 简介

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP(JavaServer Pages) 程序的首选。
Tomcat官网 Apache Tomcat® - Welcome!
最新版本是 Apache Tomcat 10.1 beta版实现了 Jakarta EE的 Servlet 6.0 和 JavaServer Pages 3.1 规范,较为稳定版本还是 10.0或者8.5版本。
1.2.2 Tomcat的目录结构
| 子目录 | 说明 |
|---|---|
| bin | 命令中心(启动命令,关闭命令……) |
| conf | 配置中心(端口号,内存大小……) |
| lib | Tomcat 的库文件。Tomcat 运行时需要的 jar 包所在的目录。 |
| logs | 存放日志文件。 |
| temp | 存储临时产生的文件,即缓存。 |
| webapps | 存放项目的文件,web 应用放置到此目录下浏览器可以直接访问。 |
| work | 编译以后的 class 文件。 |
bin 目录
bin 目录用来存放 Tomcat 命令,主要分为两大类,一类是以.sh结尾的 Linux 命令,另一类是以.bat结尾的 Windows 命令。很多环境变量都在此处设置,例如 JDK 路径、Tomcat 路径等。

下面是几个常用的 Tomcat 命令:
conf 目录
conf 目录主要是用来存放 Tomcat 的配置文件,如下图所示:

下面是常用到的几个文件:
lib 目录
lib 目录主要用来存放 Tomcat 运行需要加载的 jar 包。

logs 目录
logs 目录用来存放 Tomcat 在运行过程中产生的日志文件,清空该目录中的文件不会对 Tomcat 的运行带来影响。
在 Windows 系统中,控制台的输出日志在 catalina.xxxx-xx-xx.log 文件中;在 Linux 系统中,控制台的输出日志在 catalina.out 文件中。
temp 目录
temp 目录用来存放 Tomcat 在运行过程中产生的临时文件,清空该目录中的文件不会对 Tomcat 的运行带来影响。

webapps 目录
webapps 目录用来存放应用程序(也就是通常所说的网站),当 Tomcat 启动时会去加载 webapps 目录下的应用程序,我们编写的 Servlet 程序就可以放在这里。Tomcat 允许以文件夹、war 包、jar 包的形式发布应用。

work 目录
work 目录用来存放 Tomcat 在运行时的编译文件(也即 class 字节码文件),例如 JSP 编译后的文件。清空 work 目录,然后重启 Tomcat,可以达到清除缓存的作用。
安装前说明:安装8.5、9.0、10.0版本的Tomcat需要的Java8以上
Java8 安装
下载JDK安装包 Java Downloads | Oracle

下载完安装好后设置环境变量
1》我的电脑-属性-高级系统设置-环境变量-系统变量-Path
增加两个变量值:C:\Program Files\Java\jdk1.8.0_223\bin 和 C:\Program Files\Java\jdk1.8.0_223\jre\bin
配置完之后在 DOS 命令中执行 java -version,显示Java版本即安装成功
Tomcat 安装

进入官网 Apache Tomcat® - Welcome! 下载安装包,进行安装后配置环境变量
1》我的电脑-属性-高级系统设置-环境变量-系统变量-Path
增加两个变量值:C:\Program Files\apache-tomcat-8.5.54\bin 和 C:\Program Files\apache-tomcat-8.5.54\lib
配置完之后在 DOS 命令中执行 startup,访问 localhost:8080 显示下面界面即安装成功

安装Java8
- sudo apt update
-
- apt install openjdk-8-jdk
-
- java -version

安装Tomcat
下载安装包并安装 Index of /dist/tomcat
- cd /opt
-
- #下载并解压文件
- wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.4/bin/apache-tomcat-8.5.4.tar.gz
- sudo tar xzvf apache-tomcat-8.5.4.tar.gz
- sudo mkdir /opt/tomcat/
- sudo mv apache-tomcat-8.5.4/* /opt/tomcat/
- sudo rm -rf apache-tomcat-8.5.4
-
- #更改安装目录的所有权
- sudo chown -R www-data:www-data /opt/tomcat/
-
- #更改安装目录的访问权限
- sudo chmod -R 755 /opt/tomcat/
为Apache Tomcat创建一个系统单元
- sudo vim /etc/systemd/system/tomcat.service
-
- # 写入一下内容,生效后即可使用 service tomcat [start|restart|stop|status] 操作程序
-
- [Unit]
- Description=Tomcat
- After=network.target
-
- [Service]
- Type=forking
-
- User=root
- Group=root
-
- Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
- Environment=JAVA_OPTS=-Djava.security.egd=file:///dev/urandom
- Environment=CATALINA_BASE=/opt/tomcat
- Environment=CATALINA_HOME=/opt/tomcat
- Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
- ExecStart=/opt/tomcat/bin/startup.sh
- ExecStop=/opt/tomcat/bin/shutdown.sh
- [Install]
- WantedBy=multi-user.target
- # 重新启动守护程序使文件更改生效
- sudo systemctl daemon-reload
-
- # 重新启动Apache Tomcat服务
- sudo systemctl start tomcat
-
- # 设置Apache Tomcat在系统启动时自动启动
- sudo systemctl start tomcat
-
- # 检查服务状态
- sudo systemctl status tomcat
conf文件下配置
1》conf/tomcat-users.xml文件,为Apache Tomcat配置管理员账号
- #在tomcat-users标签中加入下面配置的账号和密码
- <!– user manager can access only manager section –>
- <role rolename="manager-gui" />
- <user username="manager" password="StrongPassword" roles="manager-gui" />
-
- <!– user admin can access manager and admin section both –>
- <role rolename="admin-gui" />
- <user username="admin" password="StrongPassword" roles="manager-gui,admin-gui" />
访问 http://ip:8080/manager/html 报403的话需要配置一下访问ip
- $ cd /webapps/manager/META-INF
- $ vim context.xml
-
- # 配置访问的ip,修改Valve标签的allow属性值,allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"(任意ip访问)
-
- <Context antiResourceLocking="false" privileged="true" >
- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
- allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
- <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
- Context>
2》conf/server.xml文件
该配置文件用于配置tomcat的服务,设置服务器的端口号,添加虚拟机等。
server.xml的一个Service节点代表在Tomcat上的一个服务,可以配置多个Service,为每个Service配置不同的端口,让Tomcat实现不同的端口提供不同的服务。
一般情况下我们并不需要配置多个Service,server.xml默认配置了一个“Catalina”的Service,默认使用8080端口。
- <Server port="8005" shutdown="SHUTDOWN">
-
-
- <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
-
- <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
-
- <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
-
- <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
-
- <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
-
- <GlobalNamingResources>
- <Resource name="UserDatabase" auth="Container"
- type="org.apache.catalina.UserDatabase"
- description="User database that can be updated and saved"
- factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
- pathname="conf/tomcat-users.xml" />
- GlobalNamingResources>
-
- <Service name="Catalina">
-
-
-
-
- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-
- <Engine name="Catalina" defaultHost="localhost">
-
- <Realm className="org.apache.catalina.realm.LockOutRealm">
- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
- Realm>
-
- <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
-
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log" suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
-
-
- Host>
- Engine>
- Service>
- Server>
3》conf/context.xml文件
该配置文件用于配置tomcat的服务,设置服务器的端口号,添加虚拟机等。
server.xml的一个Service节点代表在Tomcat上的一个服务,可以配置多个Service,为每个Service配置不同的端口,让Tomcat实现不同的端口提供不同的服务。
一般情况下我们并不需要配置多个Service,server.xml默认配置了一个“Catalina”的Service,默认使用8080端口。
-
- <Context>
-
-
-
- <WatchedResource>WEB-INF/WEB.xmlWatchedResource>
-
- <WatchedResource>${catalina.base}/conf/web.xmlWatchedResource>
-
-
-
- Context>
4》conf/web.xml文件
- <web-app>
- <display-name>display-name>定义了WEB应用的名字
-
- <description>description> 声明WEB应用的描述信息
-
- <context-param>context-param> context-param元素声明应用范围内的初始化参数。
-
- <filter>filter> 过滤器元素将一个名字与一个实现javax.servlet.Filter接口的类相关联。
- <filter-mapping>filter-mapping> 一旦命名了一个过滤器,就要利用filter-mapping元素把它与一个或多个servlet或JSP页面相关联。
-
- <listener>listener>servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知.Listener元素指出事件监听程序类。
-
- <servlet>servlet> 在向servlet或JSP页面制定初始化参数或定制URL时,必须首先命名servlet或JSP页面。Servlet元素就是用来完成此项任务的。
-
- <servlet-mapping>servlet-mapping> 服务器一般为servlet提供一个缺省的URL:http://host/webAppPrefix/servlet/ServletName。
-
- 但是,常常会更改这个URL,以便servlet可以访问初始化参数或更容易地处理相对URL。在更改缺省URL时,使用servlet-mapping元素。
-
- <session-config>session-config> 如果某个会话在一定时间内未被访问,服务器可以抛弃它以节省内存。
-
- 可通过使用HttpSession的setMaxInactiveInterval方法明确设置单个会话对象的超时值,或者可利用session-config元素制定缺省超时值。
-
- <mime-mapping>mime-mapping>如果Web应用具有想到特殊的文件,希望能保证给他们分配特定的MIME类型,则mime-mapping元素提供这种保证。
-
- <welcome-file-list>welcome-file-list> 指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件。
-
- <error-page>error-page> 在返回特定HTTP状态代码时,或者特定类型的异常被抛出时,能够制定将要显示的页面。
-
- <taglib>taglib> 对标记库描述符文件(Tag Libraryu Descriptor file)指定别名。此功能使你能够更改TLD文件的位置,而不用编辑使用这些文件的JSP页面。
-
- <resource-env-ref>resource-env-ref>声明与资源相关的一个管理对象。
-
- <resource-ref>resource-ref> 声明一个资源工厂使用的外部资源。
-
- <security-constraint>security-constraint> 制定应该保护的URL。它与login-config元素联合使用
-
- <login-config>login-config> 指定服务器应该怎样给试图访问受保护页面的用户授权。它与sercurity-constraint元素联合使用。
-
- <security-role>security-role>给出安全角色的一个列表,这些角色将出现在servlet元素内的security-role-ref元素的role-name子元素中。分别地声明角色可使高级IDE处理安全信息更为容易。
-
- <env-entry>env-entry>声明Web应用的环境项。
-
- <ejb-ref>ejb-ref>声明一个EJB的主目录的引用。
-
- < ejb-local-ref> ejb-local-ref>声明一个EJB的本地主目录的应用。
-
- web-app>
bin文件下配置
1》bin/catalina.sh / bin/catalina.bat 配置运行内存
在文件上面加上下面内容
- # JAVA_OPTS参数说明:
-
- # -server 启用jdk 的 server 版
- # -Xms java虚拟机初始化时的最小内存
- # -Xmx java虚拟机可使用的最大内存
- # -XX:PermSize 内存永久保留区域
- # -XX:MaxPermSize 内存最大永久保留区域
-
- # catalina.sh 配置
- set JAVA_OPTS=-server -Xms1024m -Xmx1024m -XX:PermSize=256M -XX:MaxNewSize=512m -XX:MaxPermSize=512m
-
- # catalina.bat 配置
- # 在Execute The Request Command注释下面添加参数,设置jvm内存最大值
- set "JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m"
1》将项目复制到webapps目录下
如果我们想将 web 项目部署到 tomcat 中,只需将项目文件夹复制到 webapps 目录,然后通过可通过 localhost:8080+目录+文件名 来进行访问。比如部署一个 web1 项目:

2》使用war包进行部署
将项目打包成一个 war 包,再将 war 包放到 webapps 目录下即可。
tomcat 会自动将在 webapps 目录下的 war 包给解压缩,生成项目文件夹,就可以对项目进行访问了。删除 war 文件,对应解压后的文件夹也会随之被删除。
3》修改server.xml配置文件进行部署
我们可以修改安装目录下的 conf/server.xml 配置文件来部署指定路径下的项目文件夹,这样就不需要将项目复制到 webapps 目录下了。
在 Host 标签下新增一个 Context 标签,在 docBase 属性中填写项目存放的路径,在 path 中填写项目虚拟目录。可以新增多个 Context 标签。修改 server.xml 后必须重启 tomcat 才生效。
比如下面,我们就可以通过 http://localhost:8080/web1/文件名 来对资源进行访问:
- # 配置具体应用项目:
- # docBase是项目的位置,可以是绝对路径,也可以是相对路径。如果是相对路径,则必须发布在虚拟主机的应用默认发布目录下。
- # path是指定访问该Web应用的URI
- # reloadable是指定是否重新加载/WEB-INF/classes和/WEB-INF/lib目录下改动后的内容
-
"web1" path="/web1" reloadable="true"/>
4》新增配置文件方式进行部署(热部署)
一般来说我们不会直接修改 server.xml 配置文件,因为这是整个 tomcat 的配置文件,修改有问题的话很容易导致tomcat出错。
此时我们可以在安装目录下的 conf/Catalina/localhost (tomcat下本身是没有该文件夹,可以自己新建)文件夹下新增配置文件,比如 web2.xml ,然后在该配置文件下输入以下信息:
<Context docBase="D:\var\www\html\web1" />
docBase指定项目的根目录。此时虚拟目录就是配置文件的名称(XML文件名)来决定,然后就可以访问项目了:http://localhost:8080/web2/文件名
如果我们想取消该部署,只需删除该 xml 文件即可,或者修改可以将后缀 xml 改为其他后缀,并且修改立即生效,无需重启服务器,所以这种部署方式也称为热部署。