首页 > 其他分享 >Day06-Tomcat服务器&Servlet入门

Day06-Tomcat服务器&Servlet入门

时间:2023-03-11 17:46:13浏览次数:30  
标签:web Tomcat Servlet Day06 服务器 import servlet javax

今日目标

1. web知识概述
2. tomcat【重点】
3. 创建servlet
	xml
	anno(注解)	
4. servlet执行原理
5. servlet生命周期
6. servlet体系结构 

1.web相关知识概述【了解】

1.WEB简介

学习目标

  • 了解什么是web

内容讲解

Web(World Wide Web)即全球广域网,也称为万维网。它是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统。是建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级链接将Internet上的信息节点组织成一个互为关联的网状结构。

简而言之就是我们平时上网浏览的网页,玩的网页游戏,上网下载资源。对于程序员而言就是前端知识、web服务器知识和数据库知识的结合就是web.

web发展阶段介绍:

【1】web1.0

1994年在中国第一个web网站是中国黄页,由马云。属于静态网页。只能看,不能交互。发布租赁信息

【2】web2.0

动态网站。网站数据是时时更新的。数据来自于数据库的。登录网站显示用户名,天气预报,微博头条。

可以实现前后台数据的交互。

注意:

网站:前端知识、web服务器知识和数据库知识
网页:前端页面html页面

2.软件架构模式(掌握)

学习目标

  • 说出软件架构模式分类

内容讲解

有两种:

1.BS:browser server 浏览器服务器。

​ 优点:

​ 1)只需要服务器,用户下载浏览器,维护方便

​ 2)减少用户的磁盘空间

​ 缺点:

​ 1)给服务器造成压力

​ 2)用户观看体验不友好

例如: 天猫、京东、知乎网站

image-20210201151559739

2.CS:client server 客户端 服务器

​ 优点:

​ 1)具有客户端和服务器端,减轻服务器的压力

​ 2)用户观看体验友好

​ 缺点:

​ 1)维护成本大

​ 2)版本升级麻烦,占用户磁盘空间

例如: QQ,绝地求生,LOL

内容小结

1.软件架构模式有两种

BS:browser server 浏览器服务器

CS:client server 客户端 服务器

2.bs其实是一种特殊的cs。

3.B/S和C/S通信模式特点(很重要)

学习目标

  • 掌握B/S和C/S通信模式特点

内容讲解

image-20201116143537312

内容小结

B/S和C/S通信模式特点

1.先有请求

2.后有响应

3.请求和响应是成对出现的

4.WEB资源(理解)

学习目标

  • 理解web资源的分类和特点

内容讲解

【1】资源:计算机中数据文件

【2】分类:

分为两种:

1.静态资源:html css js。只能书写静态网站。静态网站的数据永远不会发生改变。

2.动态资源:使用一些语言可以实现数据的变化,例如java语言。JAVAEE

5.URL请求路径(理解)

学习目标

  • 说出URL请求路径作用和组成
  • 能够说出通过url请求路径如何找到目标服务器

内容讲解

【1】作用:通过资源路径可以访问到具体的服务器。

【2】介绍:

URL (Uniform Resource Locator) ,统一资源定位符是对互联网上资源位置的一种表示,互联网上的每个文件都有一个唯一的URL。

【3】格式:

协议://服务器的ip地址:服务器的端口号/项目名/资源路径

说明:
	1)协议:是一种规范。类似于我们之前讲解的TCP UDP(传输层),这里讲解的是应用层(http https协议)
	2)服务器的ip地址:就是访问的服务器的地址。同一个网段中服务器ip地址是唯一的。
		说明:如果我们在自己电脑上进行练习,ip地址书写127.0.0.1或者localhost
	3)服务器的端口号:访问服务器端的进程号,属于唯一标识。
	4)/项目名/资源路径

【4】浏览器通过url访问服务器的过程

https://www.baidu.com/s?ie=UTF-8&wd=java

image-20201116145744535

内容小结

1.URL请求路径作用

​ 通过资源路径可以访问到具体的服务器

2.URL请求路径的组成

协议://服务器的ip地址:服务器的端口号/项目名/资源路径

2.服务器(掌握)

1.服务器介绍 了解

学习目标

  • 了解什么是服务器
  • 说出服务器分类和常见的服务器

内容讲解

【1】服务器

服务器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

【2】服务器分类

分为两类:

1.硬件服务器:服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。

2.软件服务器: 服务器软件本质上是一个应用程序(由代码编写而成),运行在服务器设备上。能够接收请求并根据请求给客户端响应数据,发布资源(静态和动态)。数据库服务器、邮件服务器(易邮)、网页服务器(tomcat nginx发布网页)等

【3】常见的Web服务器

image-20210201162253095

* Tomcat: Apache软件基金开源免费的web服务器,支持JavaEE规范(Servlet/Jsp).

* Jetty:Apache组织开源免费的小型web服务器,支持JavaEE规范.
* JBoss: RedHat红帽公司的开源免费的web服务器,支持JavaEE规范.
* Glass Fish:Sun公司开源免费的web服务器,支持JavaEE规范.

---------------------------------------------------------------------

* WebLogic: Oracle公司收费的web服务器,支持JavaEE规范.
* WebSphere:IBM公司收费的web服务器,支持JavaEE规范.

内容小结

1.什么是服务器

服务器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

2.服务器分类:硬件 软件

2.下载安装tomcat服务器 掌握

学习目标

  • 能够下载和安装tomcat服务器
  • 理解tomcat安装目录

内容讲解

【1】下载tomcat

tomcat服务器属于网页服务器,用来发布动态和静态网页的,由Apache公司开发的开源免费的。

官网:

https://tomcat.apache.org

image-20201116151953008

image-20201116152047678

各位同学,使用我下发的资料中的tomcat版本:

image-20201116152144031

【2】安装

将下载的tomcat放到没有中文和特殊符号的目录,然后进行解压即可。

image-20201116152351376

【3】目录结构介绍

image-20201116152701115

内容小结

1.安装:将下载的tomcat服务解压到没有中文和特殊符号的路径

2.目录结构:

bin:脚本目录 *****
	启动脚本(启动服务器):startup.bat
	停止脚本(停止服务器):shutdown.bat

conf:配置文件目录 (config /configuration) *****
	核心配置文件:server.xml
	用户权限配置文件:tomcat-users.xml
	所有web项目默认配置文件:web.xml

lib:依赖库,tomcat和web项目中需要使用的jar包  *****

logs:日志文件.
	localhost_access_log.txt tomcat记录用户访问信息,..表示时间。
	例如:localhost_access_log.2017-04-28.txt
	
temp:临时文件目录,文件夹内内容可以任意删除。

webapps:默认情况下发布WEB项目所存放的目录。  *****

work:tomcat处理JSP的工作目录。 

3.启动并使用浏览器访问tomcat服务器掌握

学习目标

  • 能够启动访问tomcat
  • 能够独立解决启动tomcat失败常见的问题

内容讲解

【1】tomcat启动和访问

  • 启动

    直接点击bin目录下面的startup.bat文件

    image-20201116152936723

  • 访问

    在浏览器地址栏上输入访问地址:

    http://localhost:8080
    

    image-20201116153129401

说明:出现tomcat猫,说明访问成功。

  • 停止tomcat

    1)双击bin目录下的shutdown.bat

image-20201116153244387

​ 2)直接关闭dos窗口

​ 3)在dos窗口上按快捷键:ctrl+c

【2】 tomcat启动失败常见原因

1.端口号冲突

1)查看端口号

image-20201116153931863

2)打开任务管理器找到PID是5220的进程直接关闭该进程

image-20201116154044051

2.没有配置环境变量JAVA_HOME

3.就是之前有的同学电脑上安装过tomcat,并且在环境变量path中配置了环境变量,导致启动不成功。需要将之前配置的删除即可

内容小结

1.启动tomcat

双击startup.bat

2.关闭tomcat

双击shutdown.bat

3.解决启动tomcat失败常见问题

​ 1)端口号冲突,使用netstat -nao在命令行查看端口号冲突的软件进行关闭

​ 2)配置环境变量path

4.使用tomcat服务器发布web项目 掌握

1.在tomcat的安装目录webapps下发布web项目

学习目标

  • 掌握在在tomcat的安装目录webapps下发布web项目

内容讲解

1)在webapps文件夹下创建heima文件夹

2)并创建index.html页面

image-20201116154709335

3)使用记事本打开html页面输入如下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    itcast
</body>
</html>

4)启动tomcat

5) 访问:必须加项目名heima

image-20201116154857818

内容小结

1.在浏览器url地址栏访问页面注意:

浏览器访问页面的时候必须加上文件夹名即heima

2.使用开发工具idea创建web项目 课下多创建几次 掌握

学习目标

  • 掌握如何在idea中创建web项目

内容讲解

  • idea创建maven的web项目_骨架(了解)

    注意:需要连网

    【1】

image-20211130224124147

​ 【2】

image-20211130224324016

​ 【3】

image-20211130224625322

【4】

image-20211130224852373

【5】删除pom.xml中多余的内容,留下如下内容

image-20211130225107762

【6】补齐缺失的目录结构

image-20211130225223762

image-20211130225302541

【7】创建好之后

image-20211130225430468

  • idea创建maven的web项目_不使用骨架(建议使用)

【1】

image-20211130224124147

【2】

image-20211130230546927

【3】

image-20211130230652509

【4】删除pom.xml中多余的内容,留下如下内容

image-20211130225107762

image-20220430105100986

3.使用开发工具idea发布web项目

  • 使用maven骨架创建的项目

​ 【1】

image-20211130231123295

​ 【2】

image-20211130231215495

【3】

image-20211130231337736

【4】

image-20211130231400293

【5】

image-20211130231433392

  • 不使用骨架

说明:在创建工程的时候已经指定了tomcat服务器,不用再指定

  • 启动tomcat并在浏览器访问

image-20211130231728004

image-20211130231818548

4.使用开发工具idea发布web项目的注意事项

学习目标

  • 掌握使用开发工具idea发布web项目的注意事项

内容讲解

注意啦:WEB-INF下面的内容我们无法通过浏览器访问。

【1】web项目的目录结构说明

image-20211130232111052

注意:静态页面(html,css js)不能放到WEB-INF下面,浏览器无法访问

【2】将虚拟路径的项目删除,只保留/

image-20211130232938049

image-20211130233047186

【3】再次点击启动按钮弹出框

image-20201116164234149

【4】去掉自动打开浏览器功能(了解)

image-20201116165023709

image-20201116165050827

【5】浏览器输入url地址访问tomcat服务器的疑惑

image-20210201221025386

【6】idea中启动tomcat服务器会自动访问web目录下面的三个页面:index.html index.htm index.jsp

如果没有这三个资源就会报404

注意:自动访问上述三个资源的原因是:

在tomcat的配置文件web.xml中存在如下友好访问页面的配置:

<welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

【7】pom.xml 添加 Tomcat插件(了解)

<plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>80</port>
                    <path>/</path>
                </configuration>
</plugin>

3.Servlet概述(掌握)

学习目标

  • 掌握什么是Servlet以及作用

内容讲解

【1】Servlet介绍

image-20201116165756052

1.Servlet是一个接口,即规范

2.定义的实现类必须实现接口中的所有的抽象方法

3.Servlet全称Server Applet 服务器端的程序。是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。其实servlet的实质就是java代码,通过java的API动态的向客户端输出内容,并且从客户端接收数据。

4.一个类要想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口

【2】Servlet作用

1)接收客户端的请求
2)处理业务逻辑
3)响应给浏览器客户端

image-20210202091950983

内容小结

1.什么是Servlet?

Servlet全称Server Applet 服务器端的程序。是sun公司提供一套规范,用来处理客户端请求、响应给浏览器的动态web资源。其实servlet的实质就是java代码,通过java的API动态的向客户端输出内容,并且从客户端接收数据

2.Servlet的作用?

1)接收客户端的请求
2)处理业务逻辑
3)响应给浏览器客户端

4.Servlet快速入门(重点)

学习目标

  • 在浏览器地址栏上直接访问java类

内容讲解

【1】步骤

1.创建web项目

2.导入servlet依赖

	<!--导入依赖-->
    <dependencies>
        <!--导入servlet依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>

3.在创建的web项目中自定义类实现Servlet接口

4.在自定义类中实现Servlet接口中的所有的抽象方法

5.在实现Servlet接口的service方法体中书写代码处理业务逻辑

void service(ServletRequest req, ServletResponse res)  

6.在web项目的核心配置文件web.xml中配置访问servlet的路径。

​ 说明:这样配置是告知tomcat有具体的Servlet类需要被访问。

7.启动tomcat

8.在浏览器中访问servlet类

【2】实现

1.创建maven的web项目

2.导入servlet的依赖

 		<!--servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <!--编译 测试需要,运行时不需要-->
            <scope>provided</scope>
        </dependency>

2.在创建的web项目中自定义类实现Servlet接口

3.在自定义类中实现Servlet接口中的所有的抽象方法

4.在实现Servlet接口的service方法体中书写代码处理业务逻辑

package com.itheima.sh.a_demo_01;

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

/*
    2.在创建的web项目中自定义类实现Servlet接口
 */
public class HelloWorldServlet implements Servlet{
    //3.在自定义类中实现Servlet接口中的所有的抽象方法

    //4.在实现Servlet接口的service方法体中书写代码处理业务逻辑
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service....");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }



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

    @Override
    public void destroy() {

    }

}

5.在web项目的核心配置文件web.xml中配置访问servlet的路径。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1">
    <!--
       5.在web项目的核心配置文件web.xml中配置访问servlet的路径。
​	    说明:这样配置是告知tomcat有具体的Servlet类需要被访问。
    -->
    <!--
        1.<servlet> 表示将当前Servlet类注册到tomcat中,告知tomcat有一个类要被访问
    -->
    <servlet>
        <!--
            表示当前要被访问类的标识,在当前web.xml中要唯一,helloWorldServlet属于标识符
        -->
        <servlet-name>helloWorldServlet</servlet-name>
        <!--
            配置要访问 的servlet类,必须是类的全路径:包名.类名。
            说明:tomcat底层通过获取这里的类全路径使用反射技术调用当前类的无参构造方法创建对象
        -->
        <servlet-class>com.itheima.sh.a_demo_01.HelloWorldServlet</servlet-class>
    </servlet>
    <!--
        配置要访问的servlet类的映射路径
    -->
    <servlet-mapping>
        <!--这里要和上面的servlet-name文本值一致,这里找到上面的servlet-name-->
        <servlet-name>helloWorldServlet</servlet-name>
        <!--浏览器上地址栏上输入的映射路径及访问路径,这里必须加/-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

6.启动tomcat

image-20210202093429856

7.在浏览器中访问servlet类

image-20210202093553474

内容小结

1.使用浏览器访问java的类需要使用该类实现Servlet接口

5.Servlet的执行原理(掌握)

学习目标

  • 明确访问servlet的执行流程
  • 掌握servlet的原理

内容讲解

【1】执行流程:

image-20201116172003219

【2】原理

说明:

1.当我们点击run运行的时候,tomcat之所以会启动,是因为程序入口(main方法)在tomcat中

2.tomcat开始运行,会加载web项目里面的配置文件web.xml(xml解析,读取数据)

​ 主要是根据url-pattern 找到对应的servlet-class

3.然后tomcat进入等待状态(永不停止,除非手动关闭)

4.当用户在浏览器中输入地址:http://localhost:8080/hello就会定位到tomcat的访问的项目下面的某个servlet中

5.tomcat会根据 /hello 的servlet的虚拟路径 找到HelloServlet的全限定名

6.tomcat底层通过反射创建HelloServlet的对象,并调用HelloServlet的service方法:

Class clazz = Class.forName("全限定名");
Servlet servlet = clazz.newInstance();//实际上HelloServlet对象,向上转型
servlet.service();

内容小结

1.servlet的原理

tomcat根据servlet的虚拟路径找到对应的Servlet类,然后使用反射技术创建Servlet类的对象,最后使用对象调用service方法处理业务逻辑。

6.Servlet生命周期(掌握)

学习目标

  • 掌握Servlet生命周期的api执行时机和作用

内容讲解

【1】生命周期:

​ 指的是一个对象从生(创建)到死(销毁)的一个过程

【2】生命周期的api:

// 1. servlet对象创建完毕,使用对象调用此方法,初始化方法,只有在第一次访问的时候执行一次
public void init(ServletConfig servletConfig);
// 2. 用户访问servlet时,调用此方法 (每次访问都会调用一次)
public void service(ServletRequest servletRequest, ServletResponse servletResponse);
// 3. servlet对象销毁时,调用此方法
public void destroy();

【3】Servlet生命周期的api执行时机图解

image-20210202100630990

* 创建
	1)默认情况下
		用户第一次访问时,创建servlet,执行init方法
	
* 运行(提供服务)
		用户每次访问时,都执行service方法

* 销毁
		服务器正常关闭时,销毁servlet,执行destroy方法

【4】代码实现

package com.itheima.sh.a_servlet_01;

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

public class Life01Servlet implements Servlet {
    /*
        反射调用无参构造方法创建对象
     */

    public Life01Servlet() {
        System.out.println("无参构造。。。。");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init。。。。");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service。。。。");
    }

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

    @Override
    public void destroy() {
        System.out.println("destroy。。。。");
    }
}

【5】结果:

image-20201117095339226

内容小结

1.何时创建servlet?

第一次访问servlet的时候创建

2.谁创建的?

tomcat服务器创建的

3.创建对象时做了什么?

调用无参构造方法创建对象,然后立刻调用init初始化方法

4.每次访问servlet执行哪个方法

service方法

5.何时销毁servlet?

关闭tomcat服务器,调用destroy方法

7.服务器启动,立刻加载Servlet对象 (理解)

学习目标

  • 能够在web.xml中进行配置让服务器启动,立刻创建Servlet对象

内容讲解

【1】问题: 发现 init 默认第一次被访问的时候才调用,适合用来初始化项目数据

​ 如果项目数据很多, 加载就需要一定的时间,这样就会给用户的体验不好,因为要等比较久的时间

【2】 解决: 服务器一启动,就执行init方法

【3】实现:在web.xml核心配置文件中对应的servlet标签中按照如下配置:

注意:

1.使用标签进行配置,表示标记容器是否应该在启动的时候加载这个servlet,(实例化并调用其init()方法)

2.它的文本值必须是一个整数,表示servlet应该被载入的顺序

3.如果文本值是负数:默认值是-1 【用户第一次访问时,创建】

4.当值大于等于0时,表示容器在应用启动时就加载并初始化这个servlet;

5.正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

6.当值相同时,容器就会自己选择顺序来加载

 <servlet>
        <servlet-name>life01Servlet</servlet-name>
        <servlet-class>com.itheima.sh.a_servlet_01.Life01Servlet</servlet-class>
        <!--
            load-on-startup 标签可以让tomcat服务器启动就创建对应的servlet。标签文本值必须是整数:
            数字越小,创建servlet的优先级越高
        -->
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>life01Servlet</servlet-name>
        <url-pattern>/life01</url-pattern>
    </servlet-mapping>

内容小结

  1. load-on-startup 标签可以让tomcat服务器启动就创建对应的servlet。标签文本值必须是整数:
    数字越小,创建servlet的优先级越高,建议是大于等于0的整数

     <load-on-startup>2</load-on-startup>
    

​ 2.配置load-on-startup标签后servlet生命周期如下:

image-20210202105454480

8.Servlet实现方式(重点)

一共有三种:

快捷键:
	1. ctrl + alt + u : 查看一个类的继承结构图
	2. ctrl + h : 这个类的简化版继承结构 

image-20210202110304869

1.实现Servlet方式二_自定义类继承GenericServlet

学习目标

  • 编写Servlet实现类,只要重写service方法

内容讲解

【1】描述问题:

    Servlet中使用频率最高,最重要的方法是service方法(大部分场景)
	但是我们每次编写Servlet实现类,都是直接实现Servlet接口,重写5个抽象方法(太冗余了)

【2】解决问题:

我们可以自定义类继承GenericServlet抽象类,只在子类中重写service即可。不用重写所有的抽象方法。

【3】步骤:

1.自定义类继承GenericServlet类

2.在子类中重写service方法,处理业务逻辑

3.在web.xml中进行映射路径的配置

4.在浏览器客户端访问servlet类

【4】代码实现:

package com.itheima.sh.a_servlet_01;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

/*
1.自定义类继承GenericServlet类
 */
public class Demo01Servlet extends GenericServlet {


    //    2.在子类中重写service方法,处理业务逻辑
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service....");
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
		  http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1">

    <!--3.在web.xml中进行映射路径的配置-->
    <servlet>
        <servlet-name>demo01Servlet</servlet-name>
        <servlet-class>com.itheima.sh.a_servlet_01.Demo01Servlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo01Servlet</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>


</web-app>

内容小结

1.方式二的好处是只需要重写service方法,在方法体内部处理业务逻辑即可。

2.实现Servlet方式三_自定义类继承HttpServlet(掌握)

学习目标

  • 根据页面不同的请求方式执行具体的请求方法

内容讲解

【1】问题:

	  我们在前端的form表单中,method属性, 学习过有两种常用的请求方式(get/post)
	  我们现在的service方法是这样的: 用户发送请求,无论是什么请求方式,都会统一的执行service方法, 我们无法很好的区别是哪一种请       求方式

【2】解决问题:我们可以自定义类继承HttpServlet就可以根据不同的请求做不同的处理:get post

image-20210202112700034

【3】步骤:

1.自定义类继承HttpServlet
2.在子类中根据不同的请求方式重写请求方式的方法:
	get请求---重写doGet方法
	post请求---重写doPost方法
3.在方法体中书写处理业务逻辑的代码
4.在web.xml中进行配置
5.浏览器客户端访问servlet

【4】实现

package com.itheima.sh.a_servlet_01;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    1.自定义类继承HttpServlet
 */
public class Demo02Servlet extends HttpServlet {
    /*
        	2.在子类中根据不同的请求方式重写请求方式的方法:
​			get请求---重写doGet方法
​			post请求---重写doPost方法
     */
    //	3.在方法体中书写处理业务逻辑的代码
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post....");
    }
}
	<!--4.在web.xml中进行配置-->
    <servlet>
        <servlet-name>demo02Servlet</servlet-name>
        <servlet-class>com.itheima.sh.a_servlet_01.Demo02Servlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>demo02Servlet</servlet-name>
        <url-pattern>/demo02</url-pattern>
    </servlet-mapping>

内容小结

1.实现servlet方式三的好处:

​ 1)可以根据不同的请求执行对应的方法

​ 2)可以处理满足http协议的请求和响应

2.对ServletRequest和HttpServletRequest接口的说明:

​ 这个对象封装了浏览器发送的所有请求数据,兼容大部分协议。HttpServletRequest是子接口,可以匹配http协议下的所有请求。

3.实现servlet方式三_继承HttpServlet的执行流程

学习目标

  • 能够说出继承HttpServlet方式的执行流程

内容讲解

疑问:就是正常浏览器访问tomcat服务器需要访问servlet接口中的service方法,但是方式三在子类中没有重写servlet中的service方法,只重写了doGet和doPost方法,那么底层是如何执行的呢?

image-20201117092810087

内容小结

当我们访问自定义类的servlet的时候先访问HttpServlet类实现Servlet接口中的service方法,在service方法体中调用了重载的service方法,在该方法体内部获取请求方式,根据不同的请求方式来执行对应的方法。

get请求----doGet()方法
post请求---doPost()方法

注意:查看某个类的成员结构快捷键:alt+7

4.实现servlet的三种方式的总结

1.自定义类实现Servlet接口,重写所有的抽象方法,不能处理满足http协议的请求和响应
2.自定义类继承GenericServlet抽象类,该抽象类是Servlet接口的子类,这种方式只重写service方法即可,但是不能处理满足http协议的请求和响应,同时不能根据具体的请求方式执行具体的方法   
3.自定义类继承HttpServlet抽象类,该抽象类是GenericServlet的子类,根据不同的请求方式执行对应方法:掌握
    	get----doGet
    	post---doPost
  可以处理满足http协议的请求和响应

image-20210202114406499

9.编写servlet常见问题

学习目标

  • 能够解决在编写servlet时常见的几个问题

内容讲解

1.遇到500错误

表示服务器内部异常。

image-20201117093813088

2.遇到404错误

浏览器客户端访问服务器的资源不存在。

image-20201117093857167

3.遇到405错误

服务器servlet没有重写doGet或者doPost方法。

image-20201117094035652

内容小结

1.500错误

​ 服务器异常

2.404错误

​ 找不到资源

3.405错误

​ 如果我们不重写doGet/doPost方法, 那么父类的doGet/doPost方法会执行(继承),给浏览器响应一个错误: 状态码405 (http1.1)。

10.Servlet映射路径 理解

学习目标

  • 能够配置一个Servlet映射单个和多个url

内容讲解

【1】一个Servlet映射单个url

image-20210202145025089

【2】一个Servlet映射多个url

image-20210202145130159

注解版本:

image-20211211162134309

11. Servlet映射路径配置规范(理解)

学习目标

  • 能够使用Servlet映射路径配置规范

内容讲解

servlet映射路径一共有四种:

1.完全路径匹配:就是访问什么在web.xml中配置什么路径。/hello /user 掌握

 package com.itheima.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathOneServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathOneServlet....");
     }
 }
 
  <servlet>
         <servlet-name>pathOneServlet</servlet-name>
         <servlet-class>com.itheima.sh.a_servlet_01.PathOneServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathOneServlet</servlet-name>
         <!--完全路径匹配-->
         <url-pattern>/user/one</url-pattern>
     </servlet-mapping>

2.目录匹配:/user/* 只要访问以/user开始的的路径都可以访问

 package com.itheima.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathTwoServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathTwoServlet....");
     }
 }
 
 <servlet>
         <servlet-name>pathTwoServlet</servlet-name>
         <servlet-class>com.itheima.sh.a_servlet_01.PathTwoServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathTwoServlet</servlet-name>
         <!--目录匹配-->
         <url-pattern>/user/*</url-pattern>
     </servlet-mapping>

3.后缀名匹配:*.do *.action 注意这里不能书写/ 访问以.do或者.action结尾的资源路径,后缀名都属于标识 符

 package com.itheima.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathThrServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathThrServlet....");
     }
 }
 
  <servlet>
         <servlet-name>pathThrServlet</servlet-name>
         <servlet-class>com.itheima.sh.a_servlet_01.PathThrServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathThrServlet</servlet-name>
         <!--后缀名匹配,前面不能加/-->
         <url-pattern>*.do</url-pattern>
     </servlet-mapping>

4.缺省路径:/ 如果上述三种路径都不满足就访问缺省路径。

 package com.itheima.sh.a_servlet_01;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
 
 public class PathFourServlet extends GenericServlet {
     @Override
     public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
         System.out.println("PathFourServlet....");
     }
 }
 
  <servlet>
         <servlet-name>pathFourServlet</servlet-name>
         <servlet-class>com.itheima.sh.a_servlet_01.PathFourServlet</servlet-class>
     </servlet>
 
     <servlet-mapping>
         <servlet-name>pathFourServlet</servlet-name>
         <!--缺省路径匹配-->
         <url-pattern>/</url-pattern>
     </servlet-mapping>

内容小结

上述访问路径的优先级: 完全路径匹配 > 目录匹配 > 后缀名匹配 > 缺省路径

12.绝对路径(掌握)

学习目标

  • 能够在代码中使用绝对路径

内容讲解

【1】绝对路径有两种写法:

 1.带网络三要素:
    http://ip地址:端口号/资源路径
 2.不带网络三要素:
    /资源路径   这里的/不能省略 ,要求访问的资源必须在同一个服务器上

【2】代码实现

html:

<a href="http://127.0.0.1:8080/pathAbso">带网络三要素的绝对路径</a><br>
<a href="/pathAbso">不带网络三要素的绝对路径</a><br>

Servlet:

package com.itheima.sh.b_servlet_02;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class PathAbso01Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post....");
    }
}

web.xml

 	<servlet>
        <servlet-name>pathAbso01Servlet</servlet-name>
        <servlet-class>com.itheima.sh.a_servlet_01.PathAbso01Servlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>pathAbso01Servlet</servlet-name>
        <url-pattern>/pathAbso</url-pattern>
    </servlet-mapping>

内容小结

绝对路径的写法:

 1.带网络三要素:
    http://ip地址:端口号/资源路径
 2.不带网络三要素:
    /资源路径   这里的/不能省略 ,要求访问的资源必须在同一个服务器上

13.相对路径(理解)

学习目标

  • 能够理解什么是相对路径

内容讲解

【1】 相对路径:不是相对当前项目,而是针对当前浏览器地址栏上的url而言的。

【2】案例一:

 #假设我们在浏览器地址栏访问的页面路径: http://localhost:8080/demo01.html
 #而在demo01.html页面想使用相对路径访问servlet: http://localhost:8080/pathAbso
 	 说明:
        如果在http://localhost:8080/demo01.html 页面中访问 http://localhost:8080/pathAbso 该servlet,我们通过url		  观察发现只有最后一级目录不一样,所以在demo01.html页面中相对的路径的写法是:./pathAbso  这里的./表示当前路径 可以省         略不写即直接写 pathAbso
 	

demo01.html

	<a href="./pathAbso">相对路径</a><br>
    <a href="pathAbso">相对路径</a><br>

image-20201117105342938

【3】案例二:

  # 如果在http://localhost:8080/aaa/demo02.html 页面中访问 http://localhost:8080/pathAbso 该servlet
    我们通过url观察发现在demo02.html也面中书写访问的servlet即pathAbso和当前页面的父目录aaa是同等目录,所以我这里先找该页面     的父目录,然后在找该servlet即pathAbso
    ../pathAbso    ../表示上一级目录或者父目录,找到父目录之后再找servlet即pathAbso

demo02.html

<a href="../pathAbso">相对路径</a><br>

image-20201117105410173

内容小结

1.相对路径是不是相对当前项目,而是相对于当前浏览器地址栏上的url而言的

2.在相对路径写法中:

​ ./表示当前路径 可以省略不写

​ ../表示上一级目录或者父目录,不能省略

14.Servlet3.0注解开发 (掌握)

学习目标

  • 掌握在idea中使用注解开发servlet

内容讲解

【1】问题

说明:之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端:web.xml中具有非常多个配置信息,显得非常臃肿并且容易出错。

【2】解决问题

使用web.xml配置映射路径的方式属于servlet2.5的技术。从servlet3.0开始引入注解配置访问servlet取代了web.xml配置。

【3】配置步骤:

1.在包上右键---new---servlet(create new Servlet)
2.输入类名
3.在方法体内输入逻辑代码
4.在浏览器地址栏中输入访问的路径

【4】实现

1.在包上右键---new---servlet(create new Servlet)

image-20201117111109419

2.输入类名

image-20201117111144906

3.在方法体内输入逻辑代码

package com.itheima.sh.c_servlet_anno_03;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/annoDemo01Servlet")
public class AnnoDemo01Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("注解开发");
    }
}

4.在浏览器地址栏中输入访问的路径

image-20201117111324919

15.修改idea创建注解的servlet模板

学习目标

  • 能够在idea中修改创建Servlet的模板代码

内容讲解

1.File----Settings

image-20201117111738324

2.找到servlet的模板,按照如下修改

image-20201117112020488

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebServlet("/${Entity_Name}")
public class ${Class_Name} extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
            doGet(request,response);
}

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {

}
}

内容小结

1.在Servlet的模板代码中修改在doPost方法体中调用doGet方法

2.在Servlet的模板代码中修改WebServlet注解的属性值为:"/${Entity_Name}"

16.关于servlet3.0注解开发的疑问_配置路径省略了属性urlPatterns

学习目标

  • 能够理解servlet3.0注解开发配置路径的含义

内容讲解

正常我们在WebServlet注解中配置的路径赋值给属性urlPatterns,但是urlPatterns不能省略的,在一个注解中,如果含有多个属性,并且每个属性都有默认值,此时给value赋值可以省略value属性。

image-20201117112332250

注意啦:在WebServlet注解中value等同于urlPatterns属性。

image-20201117112652806

内容小结

1.在WebServlet注解中value等同于urlPatterns属性,实际开发中我们实际上省略的是value属性

package com.itheima.sh.c_servlet_anno_03;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
    1.从servlet3.0开始使用注解@WebServlet取代了在web.xml配置servlet开发
    2.@WebServlet注解常见属性:
        1) String name() default ""; name = "demo01AnnoServlet" 相当于web.xml中的标签:
            <servlet-name>demo01AnnoServlet</servlet-name>
            在注解开发中可以不书写该属性name
        2) String[] urlPatterns() default {};urlPatterns = "/demo01AnnoServlet"相当于web.xml中的标签:
            <url-pattern>/demo01AnnoServlet</url-pattern>
        3)在注解@WebServlet中属性value等同于属性urlPatterns,定义value属性的原因是我们在使用servlet注解开发的时候可以省略value属性,
            @WebServlet("/demo01AnnoServlet") 省略了value
 */
//@WebServlet(value = "/demo01AnnoServlet",name = "demo01AnnoServlet")
//@WebServlet(urlPatterns = "/demo01AnnoServlet")
//@WebServlet(value = "/demo01AnnoServlet")
@WebServlet("/demo01AnnoServlet")
public class Demo01AnnoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("注解开发servlet,是不是很爽");
    }
}

17.HTTP协议(掌握)

1.HTTP协议介绍

学习目标

  • 掌握http协议概念和分类以及特点

内容讲解

【1】概念

全称:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

简而言之:浏览器和服务器数据交换固定的格式。

【2】版本

HTTP协议版本如下:

​ 1). http1.0 (1996) : 每次请求都有一个新的连接(开销大,比较慢)
​ 2). http1.1 (1999) : 长连接,多个请求共用一个连接(开销小一些,比较快)
​ 传输的数据都是文本(比较慢)

【3】分类

分为两类:

​ 1)请求报文协议(浏览器发送给服务器的数据 ):1)请求行 2)请求头 3)请求体

​ 2)响应报文协议(服务器发送给浏览器的数据):1)响应行 2)响应头 3)响应体

【4】特点

​ 1.先有请求

​ 2.再有响应

​ 3.一个请求对应一个响应

内容小结

1.HTTP协议称为超文本传输协议,是浏览器和服务器数据交换固定的格式。

2.HTTP协议分为两类:

​ 1)请求报文协议:浏览器给服务器传输数据遵守的规范

​ 2)响应报文协议:服务器给浏览器传输数据遵守的规范

3.Http协议特点:

1.先有请求
2.再有响应
3.一个请求对应一个响应

2.浏览器抓包观察请求报文协议

学习目标

  • 能够使用谷歌浏览器抓包并查看请求报文协议

内容讲解

【1】步骤

1.创建html页面
2.在html页面书写html代码
3.创建servlet
4.在servlet中书写java代码
5.启动服务器
6.打开浏览器,在浏览器访问页面,然后按f12 点击网络 network
7.抓包结果分析

【2】实现

1.创建html页面
2.在html页面书写html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h2>GET请求</h2>
<form action="/getServlet" method="get">
    用户名:<input type="text" name="username" value="zhangsan" /><br>
    密码:<input type="text" name="pwd" value="123" /><br>
    <input type="submit" value="提交"/>
</form>


<h2>POST请求</h2>
<form action="/postServlet" method="post">
    用户名:<input type="text" name="username" value="zhangsan"/><br>
    密码:<input type="text" name="pwd" value="123"/><br>
    <input type="submit" value="提交"/>
</form>

</body>
</html>

3.创建servlet
4.在servlet中书写java代码

package com.itheima.sh.d_http_04;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/getServlet")
public class GetServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get....");
    }
}



package com.itheima.sh.d_http_04;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/postServlet")
public class PostServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post....");
    }
}

5.启动服务器
6.打开浏览器,在浏览器访问页面,然后按f12 点击网络

image-20201117140642675

7.抓包结果分析

image-20201117142042923

内容小结

1.打开浏览器抓包工具快捷键:f12

2.请求报文协议的get请求和post请求区别:

1. GET请求:
	1)请求行直接传递请求参数.将请求参数追加在URL后面,不安全。例如:form.html?username=jack&username=1234
    补充:但是get请求可以作为商品的分享。
	2)URL长度限制(不同浏览器限制大小不一致),GET请求方式的数据大小,不可以传输数据量较大或者非文本数据。例如图片或者视频。
	3)请求体里面没有内容。

2.  POST请求:
	1)请求参数以请求体形式发送给服务器,数据传输安全。
	2)请求数据可以为非文本数据,可以传输数据量较大的数据。
	3)只有表单设置为method=”post”才是post请求.或者axios.post()也属于post请求
    其他的都是get请求。常见GET请求:地址栏直接访问、<a href=””>、<img src=””> location.href="" 、axios.get()等

标签:web,Tomcat,Servlet,Day06,服务器,import,servlet,javax
From: https://www.cnblogs.com/-turing/p/17206563.html

相关文章

  • Day06-maven的web工程
    maven的web工程创建步骤:1.创建普通的maven工程​ 参考:略2.打成war包​ 说明:普通工程打成jar包。web工程打war包。在pom.xml中书写如下内容:3.在普通的maven工程上生......
  • 同一个操作系统下,tomcat使用不同版本jdk部署项目
    在使用不同的jdk的tomcat、bin目录下,找到setclasspath.sh文件,把所需要的jdk文件放到tomcat/bin目录下找到setclasspath.sh文件进行修改新增JAVA_HOME新增JRE_HOM......
  • 4_Tomcat常见配置
    ​ Tomcat配置文件介绍Tomcat的配置文件由4个xml组成,分别是context.xml、web.xml、server.xml、tomcat-users.xml。每个文件都有自己的功能与配置方法。context.xml......
  • 4_Tomcat常见配置
    ​ Tomcat配置文件介绍Tomcat的配置文件由4个xml组成,分别是context.xml、web.xml、server.xml、tomcat-users.xml。每个文件都有自己的功能与配置方法。context.xml......
  • HttpServletRequestWrapper,HandlerMethodArgumentResolver,ResponseBodyAdvice,WebMvcCo
    HttpServletRequestWrapperpackagecom.example.springboot.core;importcom.alibaba.fastjson.JSON;importlombok.extern.slf4j.Slf4j;importorg.spring......
  • 一文快速回顾 Servlet、Filter、Listener
    什么是Servlet?前置知识:Web服务器:可以指硬件上的,也可以指软件上的。从硬件的角度来说,Web服务器指的就是一台存储了网络服务软件的计算机;从软件的角度来说,Web服务器指......
  • maven 遇到Cannot resolve javax.servlet:servlet-api:3.1
    报错Cannotresolvejavax.servlet:servlet-api:3.1原因<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>......
  • Tomcat 版本升级
    参考文档:https://blog.csdn.net/xiaohuochaiwh/article/details/88578965https://blog.csdn.net/a403071690/article/details/50442786https://blog.csdn.net/xiaohuoch......
  • ServletConfig接口介绍
    前言:Servlet容器初始化Servlet时,会为这个Servlet创建一个ServletConfig对象,并将ServletConfig对象作为参数传递给Servlet。通过ServletConfig对象即......
  • Tomcat 中的 NIO 源码分析
    转自:https://javadoop.com/post/tomcat-nio之前写了两篇关于NIO的文章,第一篇介绍了NIO的Channel、Buffer、Selector使用,第二篇介绍了非阻塞IO和异步IO,并展示了简......