Tomcat & Servlet
文章目录
1、web 相关概念回顾
-
软件架构
- C/S:客户端/服务器端
- B/S:浏览器/服务器端
-
资源分类
-
静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析。
如: html,css,JavaScript
-
动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源。动态资源被访问后,需要先转换为静态资源,再返回给浏览器。
如:servlet/jsp,php,asp…
-
-
网络通信三要素
- IP:电子设备(计算机)在网络中的唯一标识;
- 端口:应用程序在计算机中的唯一标识。 0~65536;
- 传输协议:规定了数据传输的规则
- 基础协议:
- tcp:安全协议,三次握手。速度稍慢
- udp:不安全协议。速度快
- 基础协议:
2、web 服务器软件
- 服务器:安装了服务器软件的计算机
- 服务器软件:接收用户的请求,处理请求,做出响应
- web 服务器软件:接收用户的请求,处理请求,做出响应
- 在 web 服务器软件中,可以部署 web 项目,让用户通过浏览器来访问这些项目
- web 容器
- 常见的 java 相关的 web 服务器软件:
- webLogic:oracle 公司,大型的 JavaEE 服务器,支持所有的 JavaEE 规范,收费的;
- webSphere:IBM 公司,大型的 JavaEE 服务器,支持所有的 JavaEE 规范,收费的;
- JBOSS:JBOSS 公司的,大型的 JavaEE 服务器,支持所有的 JavaEE 规范,收费的;
- Tomcat:Apache 基金组织,中小型的 JavaEE 服务器,仅仅支持少量的 JavaEE 规范 servlet/jsp。开源的,免费的。
- JavaEE:Java 语言在企业级开发中使用的技术规范的总和,一共规定了 13 项大的规范。
2.1、Tomcat 的使用
-
安装:解压压缩包即可
注意:安装目录建议不要有中文和空格
-
卸载:删除目录就行了
-
启动:
-
bin/startup.bat
,双击运行该文件即可 -
访问:
http://localhost:8080 回车访问自己
http://别人的ip:8080 访问别人
-
可能遇到的问题:
-
黑窗口一闪而过:
- 原因: 没有正确配置 JAVA_HOME 环境变量
- 解决方案:正确配置 JAVA_HOME 环境变量
-
启动报错:
-
暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
netstat -ano
-
温柔:修改自身的端口号
conf/server.xml
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
一般会将 tomcat 的默认端口号修改为 80。80 端口号是 http 协议的默认端口号。
好处:在访问时,就不用输入端口号。
-
-
-
-
关闭
-
正常关闭:
bin/shutdown.bat
ctrl+c
-
强制关闭:
点击启动窗口的×
-
2.1.1、Tomcat 的配置
-
部署项目的方式:
-
直接将项目放到 webapps 目录下即可。
-
/项目名称:项目的访问路径;专业术语也称为 “虚拟目录”
-
简化部署:将项目打成一个 war 包,再将 war包放置到 webapps 目录下。
war 包会自动解压缩。
-
-
配置 conf/server.xml 文件
在 <Host> 标签体中配置
<Context docBase="D:\hello" path="/hehe" />
- docBase:项目存放的路径
- path:虚拟目录
-
在 conf\Catalina\localhost 创建任意名称的 xml 文件
在文件中编写
<Context docBase="D:\hello" />
- 虚拟目录:xml 文件的名称
-
-
静态项目和动态项目:
-
目录结构
java 动态项目的目录结构:
– 项目的根目录:
– WEB-INF 目录:
– web.xml:web 项目的核心配置文件
– classes 目录:放置字节码文件的目录
– lib 目录:放置依赖的 jar 包
-
-
将 Tomcat 集成到 IDEA 中,并且创建 JavaEE 的项目,部署项目
3、Servlet:server applet
概念:运行在服务器端的小程序
- Servlet 就是一个接口,定义了 Java 类被浏览器访问到(tomcat 识别)的规则。
- 将来我们自定义一个类,实现 Servlet 接口,复写方法。
3.1、快速入门
-
创建 JavaEE 项目
-
定义一个类,实现 Servlet 接口
public class ServletDemo1 implements Servlet
-
实现接口中的抽象方法
-
配置 Servlet
在 web.xml 中配置:
<!-- 配置 Servlet --> <servlet> <!-- 给 servlet 起一个名字 --> <servlet-name>demo1</servlet-name> <!-- 起 demo1 的这个 servlet,对应的类,要求全类名 --> <servlet-class>com.example.tomcat.servelet</servlet-class> <!-- 这里仅仅是给这个类配置了一个名字而已,但是还是不知道应该铜鼓欧哪个路径来访问这个类 --> </servlet> <servlet-mapping> <!-- 指定哪个 servlet --> <servlet-name>demo1</servlet-name> <!-- 指定路径名 --> <url-pattern>/demo1</url-pattern> </servlet-mapping>
3.2、执行原理
- 当服务器接受到客户端浏览器的请求后,会解析请求 URL 路径,获取访问的 Servlet 的资源路径;
- 查找 web.xml 文件,是否有对应的
<url-pattern>
标签体内容; - 如果有,则在找到对应的
<servlet-class>
全类名; - tomcat 会将字节码文件加载进内存,并且创建其对象;
- 调用其方法
3.3、Servlet 中的生命周期方法
-
被创建:执行 init 方法,只执行一次
Servlet 什么时候被创建?
-
默认情况下,第一次被访问时,Servlet 被创建
-
可以配置执行 Servlet 的创建时机
在
<servlet>
标签下配置:-
第一次被访问时,创建
<load-on-startup>
的值为负数 -
在服务器启动时,创建
<load-on-startup>
的值为 0 或正整数
-
Servlet 的 init 方法,只执行一次,说明一个 Servlet 在内存中只存在一个对象,Servlet 是单例的:
- 多个用户同时访问时,可能存在线程安全问题;
- 解决:尽量不要在 Servlet 中定义成员变量。即使定义了成员变量,也不要对修改值。
-
-
提供服务:执行 service 方法,执行多次
每次访问 Servlet 时,Service 方法都会被调用一次。
-
被销毁:执行 destroy 方法,只执行一次
- Servlet 被销毁时执行。服务器关闭时,Servlet 被销毁
- 只有服务器正常关闭时,才会执行 destroy 方法
- destroy 方法在 Servlet 被销毁之前执行,一般用于释放资源
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<!-- 配置 Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.example.tomcat.servelet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.example.tomcat.ServletDemo2</servlet-class>
<!-- 指定Servlet的创建时期
1.第一次被访问时,创建
* <load-on-startup> 值为负数
2.在服务器启动时,创建
* <load-on-startup> 值为0或正数 -->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
</web-app>
package com.example.tomcat;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo2 implements Servlet {
/**
* 初始化方法
* 特点:在Servlet被创建时执行。只会执行一次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init......");
}
/**
* 获取ServletConfig对象
* ServletConfig:Servlet配置对象
* @return
*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务方法
* 特点:每一次Servlet被访问时,被执行。执行多次。
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service......");
}
/**
* 获取Servlet的一些信息:版本,作者等等
* @return
*/
@Override
public String getServletInfo() {
return null;
}
/**
* 销毁方法
* 在Servlet被杀死时,被执行。(在服务器正常关闭时,执行)执行一次。
*/
@Override
public void destroy() {
System.out.println("destory......");
}
}
3.4、Servlet 3.0 及以上
-
好处:
支持注解配置。可以不需要 web.xml 了
-
步骤:
-
创建 JavaEE 项目,选择 Servlet 的版本 3.0 以上,可以不创建 web.xml;
-
定义一个类,实现 Servlet 接口;
-
复写方法;
-
在类上使用
@WebServlet
注解,进行配置@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface WebServlet { String name() default ""; String[] value() default {}; String[] urlPatterns() default {}; int loadOnStartup() default -1; WebInitParam[] initParams() default {}; boolean asyncSupported() default false; String smallIcon() default ""; String largeIcon() default ""; String description() default ""; String displayName() default ""; }
-
package com.example.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet(urlPatterns = "/demo3")
public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("serclet4.0来了");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
4、IDEA 与 tomcat 的相关配置
-
IDEA 会为每一个 tomcat 部署的项目单独建立一份配置文件
查看控制台的 log:
Using CATALINA_BASE:"C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\_itcast"
这些文件里所记录的内容,不需要在配置文件中修改。只需要在 IDEA 部署项目时在选项框里修改即可。
-
“工作空间项目” 和 “tomcat 部署的 web 项目”
举例:
工作空间:
G:\work\coding\java\coding_li\tomcat
tomcat 部署的 web 项目:
G:\work\coding\java\coding_li\tomcat\target\tomcat-1.0-SNAPSHOT.war
(位于该工作空间的 target 目录下)- tomcat 真正访问的是 “tomcat 部署的 web 项目”,“tomcat 部署的 web 项目” 对应着 “工作空间项目” 的
webapps
目录下的所有资源;servlet 类被编译后的.class
文件也会存放在 “tomcat 部署的 web 项目” 目录中WEB-INF
目录下的classes
目录中; WEB-INF
目录下的资源不能被浏览器直接访问。
- tomcat 真正访问的是 “tomcat 部署的 web 项目”,“tomcat 部署的 web 项目” 对应着 “工作空间项目” 的
-
断点调试:使用 “小虫子” 启动 dubug 启动