当前位置:   article > 正文

http&tomcat&Servlet

http&tomcat&Servlet

一.WEB开发介绍

​ WEB,在英语中web即表示网页的意思,它用于表示Internet主机(服务器)上供外界访问的资源

1.2WEB资源分类
1.2.1静态资源
  • web页面中供人们浏览的数据始终是不变 (eg: html,css,js)
    • html 静态网页 (静态资源)
    • js | css
    • 多媒体文件 : 图片 | 音频 | 视频
1.2.2动态资源
  • 指web页面中供人们浏览的数据是由程序产生的,不同的用户或者不同时间点访问web页面看到的内容各不相同。(eg: servlet,jsp,asp,php)
    • 每个人来访问得到的结果不一样,那么这种结果即可称之为动态资源。

软件架构

2.1架构类别
2.1.1 C/S架构

​ Client / Server,客户端和服务器端,用户需要安装专门客户端程序。

  • 特点:
    1. 一定要安装客户端 。
    2. 如果发布新的版本,那么客户端得更新
    3. 大部分|一部分的代码打包到了客户端里面去了,所以这部分代码直接在本地执行。
    4. 哪些软件属于C/S架构
      1. LOL | QQ | 迅雷
2.2.2 B/S架构

​ Browser / Server,浏览器和服务器端,不需要安装专门客户端程序,浏览器是操作系统内置。

  • 特点:
    • 不需要安装客户端,只要有浏览器即可。
    • 不需要更新客户端。
    • 缺点:渲染效果不如 c/s结构好。
      • 网页邮箱 | 网页微信 | 网页QQ | 4399
2.2B/S 和C/S交互模型的比较
  • 相同点

    ​ 都是基于请求-响应交互模型:即浏览器(客户端) 向 服务器发送 一个 请求。服务器 向 浏览器(客户端)回送 一个 响应 。

    ​ 必须先有请求 再有响应

    ​ 请求和响应成对出现

  • 不同点

实现C/S模型需要用户在自己的操作系统安装各种客户端软件(百度网盘、腾讯QQ等);实现B/S模型,只需要用户在操作系统中安装浏览器即可。

注:B/S模型可以理解为一种特殊C/S模型。 B 其实指的就是浏览器…

web通信

​ 基于http协议,请求响应的机制

​ 请求一次响应一次

​ 先有请求后有响应

在这里插入图片描述

二.服务器

服务器就是一个软件,任何电脑只需要安装上了服务器软件, 我们的电脑就可以当做一台服务器了.

​这个软件可以部署(运行)我们写的一些java程序。所以平常说,把网页数据(form表单)提交给服务器,其实就是提交给我们的java程序

​服务器: 硬件(电脑)+软件(mysql, tomcat,nginx)

常见web服务器

  • WebLogic

    ​ Oracle公司的产品,是目前应用比较多的Web服务器,支持J2EE规范。WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。

在这里插入图片描述

  • WebSphere

    ​ IBM公司的WebSphere,支持JavaEE规范。WebSphere 是随需应变的电子商务时代的最主要的软件平台,可用于企业开发、部署和整合新一代的电子商务应用。

在这里插入图片描述

  • Glass Fish

    ​ 最早是Sun公司的产品,后来被Oracle收购,开源免费,中型服务器。

  • JBoss

    ​ JBoss公司产品,开源,支持JavaEE规范,占用内存、硬盘小,安全性和性能高。

在这里插入图片描述

  • Tomcat

    ​ 中小型的应用系统,免费,开源,效率特别高, 适合扩展(搭集群)支持JSP和Servlet.

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

tomcat介绍,安装和使用

​ Tomcat服务器是一个免费的开放源代码的Web应用服务器。

​ Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet 和JSP规范总是能在Tomcat中得到体现。

​ 因为Tomcat技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,是目前比较流行的Web应用服务器。

2.1tomcat的下载
  1. 先去官网下载:http://tomcat.apache.org/,选择tomcat8版本(红框所示)

在这里插入图片描述

  1. 选择要下载的文件(红框所示):

在这里插入图片描述

tar.gz 文件 是linux操作系统下的安装版本

exe文件是window操作系统下的安装版本

zip文件是window操作系统下压缩版本(我们选择zip文件)
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 下载完成

在这里插入图片描述

2.3tomcat服务器软件安装
  1. 如果Tomcat能够一下子就启动起来,那么不需要做任何的设置。如果不能启动,出现一闪而过的情形,那么可以启动一个dos命令行,然后把startup.bat拖拽到黑窗口里面, 回车运行,观察出现的错误效果。跟着改即可。

  2. 直接解压当前这个tomcat压缩包:(不要有中文,不要有空格)

  3. 配置环境变量:

    tomcat运行依赖于java环境
    在这里插入图片描述

2.4tomcat的目录结构

在这里插入图片描述

bin : 
	二进制文件,启动和关闭tomcat 
	startup.bat shutdown.bat
conf:
	配置文件
lib:
	Tomcat的jar包
	
log:
	Tomcat运行的日志
	
temp:
	Tomcat运行存放的一些临时文件
	
webapps:
	存放我们想要让Tomcat托管的java web程序
	如果想要让Tomcat执行我们的代码,那么代码就应该放在
	这个文件夹里面。
	
work:	
	项目的一些文件。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
2.5启动与关闭tomcat服务器
  1. 启动tomcat服务器

在这里插入图片描述

启动效果:
在这里插入图片描述

  1. 测试访问tomcat服务器

    打开浏览器在,在浏览器的地址栏中输入:

    http://127.0.0.1:8080或者http://localhost:8080

在这里插入图片描述

  1. 关闭tomcat服务器

    查找tomcat目录下bin目录,查找其中的shutdown.bat命令,双击关闭服务器:
    在这里插入图片描述

3.常见问题

3.0安装注意点
  • 解压到一个没有中文和空格目录下
  • 使用之前, 配置java_home和path(jdk环境变量)
    • java_home 不要配到bin目录,配到jdk的安装目录
    • path 才是配到bin目录
3.1端口号冲突

​ 报如下异常: java.net.BindException: Address already in use: JVM_Bind 8080

​ 解决办法:

​ 第一种:修改Tomcat的端口号

在这里插入图片描述

​ 修改conf/server.xml , 第70行左右

在这里插入图片描述

第二种:查询出来哪一个进程把8080占用了, 结束掉占用8080端口后的程序

​ 打开命令行输入: netstat -ano

​ 找到占用了8080 端口的 进程的id

​ 去任务管理器kill掉这个id对应的程序

在这里插入图片描述

3.2java_home没有配置
  • 会出现闪退 (如果java_home配置了还是闪退 忽略它了, 后面在IDEA里面进行启动, 就没有这个问题)

运用Tomcat服务器部署WEB项目

1.目标

  • 能够运用Tomcat服务器部署WEB项目

2.讲解

2.1标准的JavaWeb应用目录结构 【不需要背,也不用记】
  WebAPP(文件夹,项目)  
   		|---静态资源: html,css,js,图片(它们可以以文件存在,也可以以文件夹存在)  
   		|---WEB-INF 固定写法。此目录下的文件不能被外部(浏览器)直接访问
   			|---lib:jar包存放的目录
   			|---web.xml:当前项目的配置文件(3.0规范之后可以省略)
   			|---classes:java类编译后生成class文件存放的路径
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2.2发布项目到tomcat
2.2.1 方式一:直接发布

​ 只要将准备好的web资源直接复制到tomcat/webapps文件夹下,就可以通过浏览器使用http协议访问获取

2.2.2方式二: 虚拟路径的方式发布项目
  1. 第一步:在tomcat/conf目录下新建一个Catalina目录(如果已经存在无需创建)

在这里插入图片描述

  1. 第二步:在Catalina目录下创建localhost目录(如果已经存在无需创建)

在这里插入图片描述

  1. 第三步:在localhost中创建xml配置文件,名称为:second(注:这个名称是浏览器访问路径)

在这里插入图片描述

  1. 第四步:添加second.xml文件的内容为: docBase就是你需要作为虚拟路径的项目的路径

    <?xml version = "1.0" encoding = "utf-8"?>
    <Context docBase="G:/myApp" />
    
    • 1
    • 2

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P8lmHWOx-1618626621309)(img/1537667265350.png)]

  2. 第五步:直接访问(通过写配置文件的路径来访问):

    http://localhost:8080/second/a.html (second就是配置文件的名字, 映射成了myApp)

三.http协议

HTTP是HyperText Transfer Protocol(超文本传输协议)的简写,传输HTML文件。就是规范.
HTTP是互联网上用的最多的一个协议, 所有的www开头的都是遵循这个协议的(可能是https)

HTTP协议的作用

​ HTTP作用:

​ 其实就是定义了浏览器和服务器在进行数据传输的一套规范…说的通俗一点就是暗号。


浏览器和服务器交互过程: 浏览器请求, 服务请求响应

​ 不管是请求还是响应,都得约定里面的内容,也就是请求要携带什么数据,响应要返回什么数据,这些数据的格式该怎么放。都是由http协议规定。

​ 请求(请求行,请求头,请求体)

​ 响应(响应行,响应头,响应体)

请求部分 抓包软件 httpwatch.

在这里插入图片描述

  • get方式请求
【请求行】
GET /heima/success.html?username=aa&password=bb HTTP/1.1

【请求头】
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 41723-10011
Referer: http://localhost:8080/heima/login.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • post请求
【请求行】
POST /heima/success.html HTTP/1.1

【请求头】
Accept: text/html, application/xhtml+xml, */*
X-HttpWatch-RID: 37569-10012
Referer: http://localhost:8080/heima/login.html
Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
User-Agent: Mozilla/5.0 (MSIE 9.0; qdesk 2.4.1266.203; Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: localhost:8080
Content-Length: 23
Connection: Keep-Alive
Cache-Control: no-cache

【请求体】
username=aa&password=bb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.小结

  1. 请求行
    • 请求方式 (get/post) 【重点】
    • 请求的URI
    • 协议版本
  2. 请求头 浏览器告诉服务器的自己的配置的, 以key:value存在, 可能存在一个key多个value的情况
    • User-Agent: 浏览器告诉服务器自己是什么浏览器, 什么版本
    • Referrer: 浏览器告诉服务器之前是什么资源,从哪里来的 防盗链
    • Content-Type: 浏览器告诉服务器传输的内容的类型
  3. 请求体
    • get方式没有请求体, post方式才有
    • 是post方式的请求参数(提交的数据)

响应部分

在这里插入图片描述

  • 响应部分

    【响应行】
    HTTP/1.1 200
    
    【响应头】
    Accept-Ranges: bytes
    ETag: W/"143-1557909081579"
    Last-Modified: Wed, 15 May 2019 08:31:21 GMT
    Content-Type: text/html
    Content-Length: 143
    Date: Sun, 08 Dec 2019 02:20:04 GMT
    
    【响应体】
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        Success
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 状态码纪要
    在这里插入图片描述

3.小结

  1. 响应行

    • 协议版本
    • 响应状态码【重点】
      • 200 成功
      • 302 重定向
      • 304 读缓存
      • 404 客户端错误(一般路径写错了)
      • 500 服务器错误
  2. 响应头: 服务器告诉浏览器做什么的,指示浏览器做什么 ; 以key:value存在, 可能存在一个key多个value的情况

    • Location: 设置重定向的地址
    • Content-Type: 服务器告诉浏览器响应内容的类型
    • Refresh: 服务器告诉浏览器定时刷新
    • Content-Disposition: 服务器告诉来了去下载
  3. 响应体: 页面展示的内容

Get和Post区别

在这里插入图片描述

  1. get请求会在地址上携带数据,而post不会。
  2. post请求采用流的方式写数据给服务器,会放在请求体里面
  3. 由于是采用流的方式写数据,所以post请求的请求头里面会多出来两个字段 Content-Type 和 Content-Length
  4. get请求能够携带的数据长度有限制,而post请求能携带的数据长度无限制
  5. get请求由于数据会在地址栏上拼接,所以不够安全,一般提交数据采用:eccuce的都是post请求。

四.Servlet入门

​ Servlet 是一套规范,是一个接口,是一个API …它的作用是,能够接受浏览器提交的数据

注意的是: 它必须放在tomcat里面,由tomcat来托管|管理。必须放在tomcat里面才能接受浏览器提交的数据

Servlet作用

​ 用来处理客户端请求、响应给浏览器的动态资源。

​ 但servlet的实质就是java代码,通过java的API动态的向客户端输出内容

servlet与普通的java程序的区别
  1. 必须实现servlet接口
  2. 必须在servlet容器(服务器 tomcat)中运行
  3. servlet程序可以接收用户请求参数以及向浏览器输出数据

使用IDEA创建web工程配置tomcat

配置tomcat

我们要将idea和tomcat集成到一起,可以通过idea就控制tomcat的启动和关闭:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建JavaWeb工程
1.web工程创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DoAJpvqm-1618626621322)(img/1555838784099.png)]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.发布
  • 情况一: 已经关联成功的情况(因为我创建项目的时候, 已经选择了tomcat)

在这里插入图片描述

  • 情况二: 如果之前没有选择tomcat, 现在就需要自己关联发布

在这里插入图片描述
在这里插入图片描述

Servlet入门案例

1.需求

​ 在IDEA编写Servlet,发布到Tomcat. 在浏览器输入路径请求, 控制台打印Hello…

2.分析

2.1配置文件方式实现
  1. 创建web工程
  2. 创建一个类实现Servlet接口
  3. 在web.xml配置servlet
2.2注解方式实现
  1. 创建web工程
  2. 创建一个类实现Servlet接口
  3. 在这个类上面添加@WebServlet(“访问的路径”)

3.实现

3.1配置文件方式实现
  • 在com.itheima.web包下创建一个类实现Servlet接口
package com.itheima.servlet;

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

/*
 *  @描述:
 *  @ 思路
 *         1. 只有servlet才能处理网页的请求
 *         2. 所以这个类,必须要跟servlet扯上关系
 *         3. servlet是一个接口,是一个规范,所以这里要实现接口Servlet
 *         4. 写完之后,这个类还只是普通的java类,tomcat不理它。
 *         5. 必须得登记 | 注册这个servlet
 *              有两种做法:
 *                  1. 最简单的做法: 使用注解 @WebServlet("/xx")
 *                      最终访问路径是这样。localhost:8080/day24_servlet/xx
 *
 *                  2. 在web.xml中配置。
 *
 */

//localhost:8080/day24_servlet/aa
public class HelloServlet02 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("HelloServlet02收到请求了~~");
        
    }

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

    @Override
    public void destroy() {

    }
}

  • 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
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • web.xml配置(该文件在web/WEB-INF 文件夹下):
<?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_2_5.xsd"
           version="2.5">

     
    <servlet>
        <servlet-name>hello02</servlet-name>
        <servlet-class>com.itheima.servlet.HelloServlet02</servlet-class>
    </servlet>


    <!--以后只要有一个请求,请求的地址是aa 那么就把这个请求交给hello02去处理
    其实就是交给HelloServlet02 处理-->
    <servlet-mapping>
        <servlet-name>hello02</servlet-name>
        <url-pattern>/aa</url-pattern>
    </servlet-mapping>

</web-app>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
3.2注解方式实现
  • 在com.itheima.web包下创建一个类实现Servlet接口, 添加注解
package com.itheima.servlet;

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

/*
 *  @创建时间:  2020/7/27 15:06
 *  @描述:
 *  @ 思路
 *         1. 只有servlet才能处理网页的请求
 *         2. 所以这个类,必须要跟servlet扯上关系
 *         3. servlet是一个接口,是一个规范,所以这里要实现接口Servlet
 *         4. 写完之后,这个类还只是普通的java类,tomcat不理它。
 *         5. 必须得登记 | 注册这个servlet
 *              有两种做法:
 *                  1. 最简单的做法: 使用注解 @WebServlet("/xx")
 *                      最终访问路径是这样。localhost:8080/day24_servlet/xx
 *
 *                  2. 在web.xml中配置。
 *
 */

//localhost:8080/day24_servlet/aa
@WebServlet("/aa")
public class HelloServlet 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("收到请求了~~~");
    }

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

    @Override
    public void destroy() {

    }
}


  • 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
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

配置tomcat服务器启动测试

浏览器地址栏输入:http://localhost:8080/day24_servlet/aa

4.小结

4.1 如果出现实现Servlet报错
  • 检查当前的工程是否依赖了Tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KNP3kA8D-1618626621334)(img/1555904633352.png)]

  • 如果没有依赖, 依赖tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8EPhe8TM-1618626621335)(img/1555905478996.png)]

在这里插入图片描述

4.2配置文件方式与注解方式比较

​ 注解方式简化的javaweb代码开发,可以省略web.xml配置文件.

​ 但是配置文件方式必须掌握的(后面在框架或者大项目里面会使用到的)

入门案例原理和路径

在地址栏上,敲了一个地址,怎么就执行了我们的servlet代码? 他们的背后是如何关联的?

1.目标

  • 掌握Servlet执行原理和Servlet路径的配置url-pattern

2.讲解

2.1Servlet执行原理

在这里插入图片描述

通过上述流程图我们重点需要掌握如下几个点:

  • Servlet对象是由服务器创建(反射)
  • request与response对象也是由tomcat服务器创建
  • service()方法也是服务器调用的
2.3Servlet路径的配置url-pattern

url-pattern配置方式共有三种:

  • 完全路径匹配: 以 / 开始. 注: 访问的路径不能多一个字母也不能少一个
例如: 配置了/demo01  请求的时候必须是: /demo01 

<!--1. 完全路径匹配: 以 / 打头,以定义的路径结尾-->
   <servlet-mapping>
        <servlet-name>hello02</servlet-name>
        <url-pattern>/hello02</url-pattern>
    </servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 目录匹配"以 / 开始需要以 * 结束. 注: Servlet里面用的 不多, 但是过滤器里面通常就使用目录匹配
例如:  配置/* 访问/a, /aa, /aaa; 配置 /aa/*  访问 /aa/b , /aa/cc

 <!-- 2. 目录匹配: 以/ 打头, 以*结尾 *表示后面的内容可以有,也可以没有-->
 <servlet-mapping>
        <servlet-name>hello02</servlet-name>
        <url-pattern>/hello02/*</url-pattern>
    </servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 扩展名匹配不能以 / 开始, 以 * 开始的 .
例如:  *.action;  访问: aa.action, bb.action, c.action;   错误写法: /*.do, 不可以写*.jsp,*.html

<!--3. 后缀名匹配的方式 : 以*打头, 以后缀名结尾-->
    <servlet-mapping>
        <servlet-name>hello02</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意的地方:

  • 一个路径只能对应一个servlet, 但是一个servlet可以有多个路径

  • tomcat获得匹配路径时,优先级顺序:完全路径匹配> 目录匹配 > 扩展名匹配

3.小结

  1. 讲Servlet原理目的让大家对Servlet执行有一个深入认识, 只需要能懂就可以. 具体操作是服务器(创建servlet,执行service), 你【重点】要做的就是写出Servlet
  2. 路径有多种方式, 一般用完全路径匹配

五.Servlet进阶

1.Servlet生命周期方法

​ servlet从创建到销毁的过程

​ 出生:(初始化)用户第一次访问时执行。

​ 活着:(服务)应用活着。每次访问都会执行。

​ 死亡:(销毁)应用卸载。

​ serrvlet生命周期方法:

init(ServletConfig config)

service(ServletRequest req, ServletResponse res)

destroy()

package com.itheima.servlet;

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

/*
 *  @创建时间:  2020/7/27 16:08
 *  @描述:    servlet的生命周期
 *  
 *  @思路:
 *      1. init:
 *          调用时机:第一次访问servlet的时候调用
 *          作用: 用于初始化.. 准备工作(创建流对象 | 准备数据库连接..)
 *      2. service:
 *          调用时机:每来一次请求就会执行一次
 *          作用:接收请求,响应请求。
 * 
 *      3. destroy:
 *          调用时机:1.正常关闭服务器,2.从服务器里面移除托管的项目
 *          作用:用于处理收尾的工作。 关流 |  释放连接
 * 
 */
public class ServletLifeCycle03 implements Servlet {


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


  • 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
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
2.Servlet生命周期描述
  1. 常规

    ​ 默认情况下, 来了第一次请求, 会调用init()方法进行初始化【调用一次】

    任何一次请求 都会调用service()方法处理这个请求

    ​ 服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】

  2. 扩展

    ​ servlet是单例多线程的, 尽量不要在servlet里面使用全局(成员)变量,可能会导致线程不安全

    ​ 单例: 只有一个对象(init()调用一次, 创建一次)

    ​ 多线程: 服务器会针对每次请求, 开启一个线程调用service()方法处理这个请求

3.ServletConfig

​ Servlet的配置对象, 可以使用ServletConfig来获得Servlet的初始化参数, 在SpringMVC里面会遇到

  • 在web.xml中配置servlet
<!--这里配置_04_ServletConfig的 servlet-->
    <servlet>
        <servlet-name>config</servlet-name>
        <servlet-class>com.itheima.servlet._04_ServletConfig</servlet-class>

        <init-param>
            <param-name>username</param-name>
            <param-value>zhangsan</param-value>
        </init-param>

        <!--设置servlet,在加载项目的时候,就初始化,不用等到访问的时候初始化-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>config</servlet-name>
        <url-pattern>/config</url-pattern>
    </servlet-mapping>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 在代码中获取servlet的配置信息
package com.itheima.servlet;

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

/*
 *  @创建时间:  2020/7/27 16:33
 *  @描述:    ServletConfig对象
 *
 *          1. 可以获取servlet在注册的写名字
 *          2. 可以拿到servlet配置一些初始化参数
 *
 *  3. servlet默认是第一次访问的时候才会进行初始化,能否让这个初始化的时机提前呢?
 *      可以,提前到部署的时候,就执行。这样子的话,以后再来请求|第一次来请求,就不用初始化了。
 *      那么程序的响应速度就很快。
 */
public class _04_ServletConfig implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

        //1. 得到这个servlet在web.xml中配置的名称 | 别名
        String name = servletConfig.getServletName();
        System.out.println("name=" + name);

        //2. 可以获取servlet的初始化参数。
        String username = servletConfig.getInitParameter("username");
        System.out.println("username=" + username);
    }

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

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    }

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

    @Override
    public void destroy() {

    }
}


  • 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
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
启动项

​ Servlet默认情况下什么是创建? 默认情况下是第一次请求的时候.

​ 如果我想让Servlet提前创建(服务器器的时候), 这个时候就可以使用启动项 在SpringMVC里面会遇到

在这里插入图片描述

六.Servlet体系结构

  • 掌握Servlet的继承关系,能够使用IDEA直接创建Servlet

在这里插入图片描述

  • Servlet接口

    ​ 前面我们已经学会创建一个类实现sevlet接口的方式开发Servlet程序,实现Servlet接口的时候,我们必须实现接口的所有方法。但是,在servlet中,真正执行程序逻辑的是service,对于servlet的初始化和销毁,由服务器调用执行,开发者本身不需要关心。因此,有没有一种更加简洁的方式来开发servlet程序呢?

我们先来查阅API回顾Servlet接口:
在这里插入图片描述

​ 由上图可知在servlet接口规范下,官方推荐使用继承的方式,继承GenericServlet 或者HttpServlet来实现接口,那么我们接下来再去查看一下这两个类的API:

  • GenericServlet 类

在这里插入图片描述

​阅读上图API可知,GenericServlet 是一个类,它简化了servlet的开发,已经提供好了一些servlet接口所需的方法,我们开发者只需要重写service方法即可

我们来使用GenericServlet 创建servlet:

  1. 创建一个类
  2. 继承GenericServlet
  3. 重写service方法
package cn.itcast.web;

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

@WebServlet(name = "GenericDemoServlet",urlPatterns = "/generic")
public class GenericDemoServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("GenericDemoServlet执行.......");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

​虽然,GenericServlet已经简化了servlet开发,但是我们平时开发程序需要按照一种互联网传输数据的协议来开发程序——http协议,因此,sun公司又专门提供了HttpServlet,来适配这种协议下的开发。

  • HttpServlet
    在这里插入图片描述

阅读上图的API可知,继承HttpServlet,我们需要重写doGet、doPost等方法中一个即可,根据Http不同的请求,我们需要实现相应的方法

我们来使用HttpServlet创建servlet:

  1. 创建一个类
  2. 继承HttpServlet
  3. 重写doGet方法
package cn.itcast.web;

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(name = "HttpDemoServlet",urlPatterns = "/http")
public class HttpDemoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpDemoServlet执行.......");
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

​通过以上两个API阅读,同学们注意一个细节HttpServlet是GenericServlet的子类,它增强了GenericServlet一些功能,因此,在后期使用的时候,我们都是选择继承HttpServlet来开发servlet程序。

  1. 继承关系

在这里插入图片描述

  1. 我们可以直接创建一个类继承HttpServlet, 直接在IDEA里面new Servlet

在这里插入图片描述

扩展(Servlet体系源码)

  1. 看HttpServlet的service()方法

在这里插入图片描述

六.ServletContext

1.servletContext概述

​ ServletContext: 它是一个对象,有且只有一个。一个servlet项目里面,有且只有一个ServletContext对象。

2.ServletContext作用
  1. 可以存放数据和获取数据 【使用最多】,可以给servlet共享数据
  2. 可以获取文件的MIME
  3. 获取读取文件资源
  4. 获取全局的配置参数。

3.小结

  1. ServletContext是一个全局对象, 服务器会给每一个项目(工程)都创建一个ServletContext对象, 属于整个项目的, 不局限于某个Servlet
  2. 作用
    • 作为域对象存取数据,让Servlet共享
    • 获得文件mime类型(文件上传和下载)
    • 获得全局初始化参数
    • 获取web资源路径

ServletContext的功能

1.作为域对象存取值

在这里插入图片描述

  1. API

    • getAttribute(String name) ;向ServletContext对象的map取数据
    • setAttribute(String name, Object object) ;从ServletContext对象的map中添加数据
    • removeAttribute(String name) ;根据name去移除数据
  2. 代码

    • ServletDemo05

      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //存
      //1.获得ServletContext
      ServletContext servletContext = getServletContext();
      //2.调用存的方法
      servletContext.setAttribute("akey","aaa");
      
      response.getWriter().print("ServletDemo03");
      
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • ServletDemo06

      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //取
      //1.获得ServletContext
      ServletContext servletContext = getServletContext();
      //2.调用取的方法
      String value  = (String) servletContext.getAttribute("akey");
      
      response.getWriter().print("ServletDemo04..."+value);
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
2.获得文件mime类型
  1. API
    • getMimeType(String file)
  2. 代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据文件名获得文件的mini类型
//1.获得ServletContext
//2.调用getMimeType()方法
String file01 = "a.mp3";
String file02 = "b.png";
String mimeType01 = getServletContext().getMimeType(file01);
String mimeType02 = getServletContext().getMimeType(file02);

String value = getServletContext().getInitParameter("bkey");

response.getWriter().print("ServletDemo05..."+mimeType01+":"+mimeType02+":"+value);

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
3.获得全局初始化参数
  • String getInitParameter(String name) ; //根据配置文件中的key得到value;

在web.xml配置

在这里插入图片描述

通过ServletContext来获得

在这里插入图片描述

4.获取web资源路径
  1. API
    • String getRealPath(String path);根据资源名称得到资源的绝对路径.
    • getResourceAsStream(String path) ;返回制定路径文件的流

注意: filepath:直接从项目的根目录开始写

  1. 代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1.获得文件的绝对路径 getRealPath()这个方法的路径已经在项目下了, 已经到了web目录下了
    String realPath = getServletContext().getRealPath("a.txt");
    System.out.println("realPath="+realPath);

    //2.获得文件的输入流  getResourceAsStream(String path);这个方法的路径已经在项目下了, 已经到了web目录下了
    //new FileInputStream(realPath);
    InputStream is = getServletContext().getResourceAsStream("a.txt");
    System.out.println(is);

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

统计网站被访问的总次数

1.需求

在这里插入图片描述

  • 在页面中显示您是第x位访问的用户.

2.思路分析

在这里插入图片描述

  • 在CountServlet的init方法里面,存储登录次数(0次)
  • 在CountServlet的doGet()方法里面,取出值+1,再存储
  • 在ShowServlet里面取出值展示
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/204167
推荐阅读
相关标签
  

闽ICP备14008679号