JavaWeb(三)Servlet基础


在这里插入图片描述
是连接Web服务端与Java程序的协议 ,是自重通信规范。
其主要功能是很具客户提交的请求,调用服务器相关Java代码,完成对请求的处理与运算。

一、Servlet生命周期

1.1.1生命周期方法执行过程

Servlet生命周期是指Servlet对象的创建,初始化,服务的执行及最终的销毁整个过程。
在这里插入图片描述
Alt+Shift+S+O 生成带参构造
Alt+/ 生成无参构造
建立SomeServlet类

package com.faith.servlets;

import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class SomeServlet implements Servlet {
	public SomeServlet() {
//		super();
		System.out.println("创建SomeServlet实例");
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("销毁SomeServlet实例");
	}

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

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

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("初始化SomeServlet实例");
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("执行SomeServlet实例的service方法");
	}

}

请请求映射为Servlet
在web.xml种写如下代码:
注册Servlet:
(1)Servlet类2的注册
(2)url映射关系注册;缺一不可
在这里插入图片描述
弄了半年,😶
destroy()在不在使用当前servlet时执行,即当服务器停止时。
停止服务器的两种方式:
在这里插入图片描述
不会出现destroy()执行
在这里插入图片描述
在这里属于正常终止,会执行destroy()方法
(1)项目部署后启动服务器,发现并没有执行Servlet的无参构造器,说明在Web容器启动时并没有创建Servlet对象。
(2)用户请求提交后,马上可以看到无参构造器,init()方法,service()方法均执行。
(3)刷新页面,只会执行

1.1.2 Servlet特征

(1)Servlet是单例多线程的。
(2)一个Servlet实例指挥执行一次无参构造器与init()方法,并且是在第一次访问时执行。
(3)用户每提交一次对当前Servlet的请求,就会执行一次service()方法。
(4)一个Servlet实例指挥执行一次destroy()方法,在应用停止时执行。
(5)由于Servlet是单例多线程的(多个浏览器页面可以同时访问),所以为了保证其线程安全性,一般情况下是不为Servlet类定义可修改的成员变量的。因为每个线程均可以修改这个成员变量,会出现线程安全问题。
(6)默认情况下,Servlet在Web容器启动时是不会实例化的。

1.1.3Web容器启动时创建Servlet实例

修改web.xml文件

<load-on-stratup>1</load-on-stratup>

类似于执行优先级

1.1.4 Web容器中的两个Map

servet实例核创建好后,会将该servdet实例的引用存放到一个 Map集合中,该Map集含的’key为URI,而value 则为 servet实例的引用,即 Map<String., servlet>。当web容器从用户请求中分离出URl后,会首先到这个Map中查找是否存在其所对应的value若存在,则直接调用其 servicel方法。若不存在,则需要创建该Servet实例。
若请求的serviet实例不存在,web容器又是根据什么创建这个Servlet实例的呢?在web容器的内存中,还存在一个Map集合。该Map集合的key为 URl,而value 0则为web.xml中配用的与之对应的 servet的全限定性类名,即-Map<string, Stringo
当web容器从用户请求中分离出URI后,到第一个Map中又没有找到其所对应的Serwlet实例,则会马上查找这第二个 Map,从中找到其所对应的英名,再根据反射机制,创建这个servlet实例。然后再将这个创建好的servlet的引用放入到第一个Map中。
在这里插入图片描述

1.1.5关于getServletInfo()方法

servlet接口中的方法getServletInfo(),是程序设定自己定义饿有关当前servlet的一些基本信息,不属于servlet生命周期中的方法。对程序的运行没有任何影响与作用。仅仅是返回一些让他人阅读的信息。

1.2 ServletConfig

1.2.1 什么是 ServletConfig?

在servlet接口的init()方法中具有唯一的一个参数ServletConfig。ServletConfig是一个接口,就是servlet配置,即在web.xml中对当前servlet类的配置信息,Servlet规范将servlet的配置信息全都封装到ServletConfig接口对象中。
在web容器调用init()方法时,web容器首先会将web.xml中当前servlet类的配置信息封装为一个对象。这个对象的类型实现了ServletConfig接口,web容器会将这个对象传递给init()方法中的ServletConfig参数。

1.2.2获取ServletConfig对象

由于ServietConfig中可以获取到Senvdet 的打始化参数,获取到 SenletContext对象,而这些参数与对象在进行业务逻辑处理时,即执行 service()方法时需要经常访问,很重要,所以servletConfig对象也就显得很重要了。
由于servletConfig对象是web容器通过init()方法传选给当前servlet类的,而init()方法只会在 servlet对象初始化时调用一次。所以,需要在init方法中将servletConfig 对象传递给servlet的servletConfig 成员变量,这样service方法即可使用SerdetConfig对象了。也就是说,我们需要在servlet中声明一个 ServdetConfig 成员变量。-

private ServletConfig config;
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		this.config = config;
		System.out.println("config = " + config);
	}

1.3<url pattern/>的设置与匹配

(1)精确路径模式
请求路径必须与<url pattern/>的值完全相同才可被当前Servlet处理
在这里插入图片描述

(2)通配符路径模式

该模式中的路径由两部分组:精确路径部分与通配符部分。请求路径中只有携带了<url pattern/>值中指定的精确路径u部分才可被当前处理。
在这里插入图片描述
(3)全路径模式
在这里插入图片描述
(4)后缀模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

释怀°Believe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值