Tomcat

Web相关概念

软件架构:

  • C/S:客户端/服务器端
  • B/S:浏览器/服务器端

资源分类:

  • 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源。静态资源可以直接被浏览器解析
    • 如:html,css,js
  • 动态资源:每个用户访问相同资源后,得到的结果可能不一样,称为动态资源。动态资源被访问后,需要先转换成静态资源,再返回给浏览器
    • 如:servlet/jsp,php,asp

网络通信三要素:

  • IP:电子设备(计算机)在网络中的唯一标识
  • 端口:应用程序在计算机中的唯一标识(端口范围:0~65536)
  • 传输协议:规定了数据传输的规则。基础协议有:
    • TCP:安全协议。三次握手,速度稍慢
    • UDP:不安全协议。速度快

Tomcat:Web服务器软件

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。开源的,免费的。

接下来我们就开始Tomcat的使用

  1. 下载:官网下载地址:http://tomcat.apache.org/

    成功从官网下载tomcat

  2. 安装:解压压缩包即可。注意:安装目录建议不要有中文和空格

    解压后的tomcat目录结构

    关于tomcat目录结构的视频讲解

    tomcat目录结构

  3. 卸载:删除目录即可

  4. 启动:(关于tomcat的环境变量配置这里就不多说了)

    • 要启动tomcat,我们双击bin目录下的startup.bat即可

      tomcat运行结果

    • 访问:浏览器输入:http://ip:80 (如果是本地的话,http://localhost:80即可)

      web端访问结果

    • 端口占用问题,解决方案:

      1. 暴力(推荐):找到占用的端口号,并且找到对应进程,杀死该进程(杀死端口占用进程

        • netstat -ano 查看端口占用情况,并找到先关进程的PID

          查看端口占用情况

        • taskkill /f /t /im "进程号或进程名"

      2. 温柔:修改自身的端口号

        • 我们在conf目录下,修改server.xml文件

          修改tomcat端口号

        • 注意:一般我们将tomcat的端口号修改为80。因为80端口号是http协议的默认端口号,在访问时就不用输入端口号了

  5. 关闭

    1. 正常关闭:
      • 双击bin目录下的shutdown.bat文件
      • ctrl+c
    2. 强制关闭:
      • 关闭tomcat窗口(点击窗口的×)
  6. 配置:

    • 部署项目的方式

      1. 直接将项目放到webapps目录下即可

        将现有的hello.html文件放到webapps/test目录下

        • 浏览器访问:

          Web端访问

        • /test:项目的访问路径(虚拟路径)

        • 简化部署:将项目打成一个war包,再将war包放置到webapps目录下

      2. 配置conf/server.xml文件

        <Host>标签体中配置:

        1
        <Context docBase="D:\hello" path="/hehe" />
        • docBase:项目存放的路径
        • path:虚拟目录

        3.在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写

        1
        <Context docBase="D:\hello" />

        虚拟目录:xml文件的名称

        (这种方式不需要重启tomcat)

其中第二种和第三种的部署方式:视频讲解


Java动态项目的目录结构

静态项目和动态项目:静态项目里边只能放静态的资源,比如说html,css,JavaScript,图片、文本,音频、视频,那么动态项目里边不仅仅可以放静态资源,还可以放一些动态的资源,比如说servlet,jsp等等)

web的静态项目和动态项目目录结构上的区别

Java动态项目目录结构:

  • 项目的根目录
    • WEB-INF目录
      • web.xml:web项目的核心配置文件
      • classes目录:放置字节码文件的目录
      • lib目录:放置依赖jar包的目录

Java动态项目目录结构

Tomcat集成到IDEA

在后续学习中,我们将tomcat集成到IDEA中,并创建JavaEE的项目,部署项目

视频讲解

运行后的JavaEE项目目录为:

目录结构

浏览器中访问:

world.html

index.jsp


Servlet

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

Servlet在JavaWeb中非常重要,这里先简单提一下。后续还会继续提到

Servlet:server applet(运行在服务器的小程序)

Servlet

视频讲解

Servlet就是一个接口,定义了Java类被浏览器访问的规则(被tomcat识别):

  • 将来我们自定义一个类,实现Servlet接口,复写方法

Servlet快速入门

  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet接口
  3. 实现接口中的抽象方法
  4. 配置Servlet(在web.xml中配置)

例子:我们创建一个JavaEE项目,在src.srtvlet包下创建ServletDemo01类代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package servlet;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo01 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("Hello,Servlet");


}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

然后在web.xml中配置Servlet,配置内容如下:

1
2
3
4
5
6
7
8
9
10
<!--配置Servlet-->
<servlet>
<servlet-name>demo01</servlet-name>
<servlet-class>servlet.ServletDemo01</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>demo01</servlet-name>
<url-pattern>/demo01</url-pattern> <!--配置资源路径-->
</servlet-mapping>

配置完成后完整的web.xml文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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_3_1.xsd"
version="3.1">

<!--配置Servlet-->
<servlet>
<servlet-name>demo01</servlet-name>
<servlet-class>servlet.ServletDemo01</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>demo01</servlet-name>
<url-pattern>/demo01</url-pattern> <!--配置资源路径-->
</servlet-mapping>

</web-app>

运行后访问:http://localhost:8080/demo01,会发现在控制台输出了“Hello,Servlet”:

说明我们重写的service方法成功被执行

Servlet执行原理:

  1. 当服务器接收到客户端浏览器请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的<url-pattern>标签体内容
  3. 如果有,则再找到对应<servlet-class>的全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

Servlet执行原理

视频讲解

Servlet中的一些方法

视频讲解

Servlet中的生命周期方法:

  1. public void init(ServletConfig servletConfig):被创建:执行init方法,只执行一次

Servlet什么时候被创建?默认情况下,第一次被访问时,Servlet被创建

  • 可以配置执行Servlet的创建时机:在<servlet>标签下配置
    • 第一次被访问时创建:<load-on-startup>的值为负数
    • 在服务器启动时创建:<load-on-startup>的值为0或正整数
  • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
    • 多个用户同时访问时,可能存在线程安全问题。
    • 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
  1. public void service(ServletRequest servletRequest, ServletResponse servletResponse):提供服务:执行service方法,执行多次

    • 每次访问Servlet时,Service方法都会被调用一次。
  2. public void destroy():被销毁:执行destroy方法,只执行一次

  • Servlet被销毁时执行。服务器关闭时,Servlet被销毁
  • 只有服务器正常关闭时,才会执行destroy方法。
  • destroy方法在Servlet被销毁之前执行,一般用于释放资源

相关代码注释如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ServletDemo02 implements Servlet {
// 初始化方法。在Servlet被创建时执行。只会执行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");

}

// 获取ServletConfig对象(需要自行实现)
@Override
public ServletConfig getServletConfig() {
return null;
}

// 提供服务方法。执行service方法,执行多次
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service...");
}

// 获取Servlet的一些信息(版本、作者等)
@Override
public String getServletInfo() {
return null;
}

// 销毁方法。在服务器关闭时执行destroy方法,只执行一次
@Override
public void destroy() {
System.out.println("destroy...");
}
}

Servlet3.0注解配置

视频讲解

Servlet3.0:支持注解配置,可以不需要web.xml了。

步骤:

  1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  2. 定义一个类,实现Servlet接口
  3. 复写方法
  4. 在类上使用@WebServlet注解,进行配置
  • @WebServlet("资源路径")

例子:我们创建ServletDemo01,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package web.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

//@WebServlet(urlPatterns = "/demo01") // 配置路径
@WebServlet("/demo01")
public class ServletDemo01 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("Servlet3.0");
}

@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

目录结构如下:

没有web.xml的目录结构

补充:@WebServlet注解中的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package javax.servlet.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@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 "";
}

IDEA和Tomcat的相关配置

视频讲解

  1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件

    • 查看控制台的log:Using CATALINA_BASE: "C:\Users\用户名\.IntelliJIdea2017.2\system\tomcat\Tomcat_8_5_61_J2EE-2_2"
  2. 工作空间项目tomcat部署的web项目out目录下为tomcat部署的web项目

    • tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目"对应着"工作空间项目” 的web目录下的所有资源
    • WEB-INF目录下的资源不能被浏览器直接访问
  3. 断点调试:使用"小虫子"启动 dubug 启动