(Servlet)servlet生命周期

宏观地讲,Servlet是连接web服务器与服务端java程序的协议,是一种通信规范。这个规范是以一套接口的形式实现的
1.servlet声明周期
所谓servlet生命周期是指servlet对象的创建,servlet对象的初始化,servlet对象服务的执行,及最终servlet对象销毁的整个过程

(1).首先建立servlet的映射关系
在WebContent文件夹下,配置web.xml文件的映射关系

写一个servlet实现类


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 TestServlet implements Servlet {

	public TestServlet() {
		super();
		System.out.println("创建servlet");
	}

	@Override
	public void destroy() {
		System.out.println("销毁servlet");
	}

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

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

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("初始化servlet");
		
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		
		System.out.println("创建servlet服务");
	}

}

在web.xml文件中建立url和servlet的映射关系

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  
  <!-- 注册Servlet -->
  
  <!-- 第一部分,注册servlet实现类和类名之间的关系 -->
  <servlet>
  		<servlet-name>some-servlet</servlet-name>
  		<servlet-class>com.swust.servlet01.TestServlet</servlet-class>
  </servlet>
  <!-- 第二部分,注册类名和url之间的关系 -->
  <servlet-mapping>
  		<servlet-name>some-servlet</servlet-name>
  		<url-pattern>/some</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
</web-app>

Servlet特征
1.Servlet是单例多线程的

2.一个Servlet实例只会执行一次无参构造器与Init()方法,并且是在第一次访问时执行
(容器启动时就创建servlet)
注意:所以对于一些对客户响应速度有要求的重要的servlet,可以在web容器创建时就先创建好。但是一般的servlet都是在执行的时候再创建因为会节省内存
load-on-startup:优先部署的命令,数字(正数)代表优先级,0是最优先,依次递减

  <servlet>
  		<servlet-name>some-servlet</servlet-name>
  		<servlet-class>com.swust.servlet01.TestServlet</servlet-class>
  		<load-on-startup>1</load-on-startup> 
  </servlet>   

3.用户每提交一次对当前Servlet的请求,就会执行一次servlet()方法
4.一个servlet实例只会执行一次destroy()方法,在应用停止时执行
5.由于servlet时单例多线程的,所以为了保证其线程安全性,一般情况下时不为servlet类定义可修改的成员变量的。因为每个线程均可修改整个成员变量,会出现线程安全问题

对于部署在服务器上的代码的特点:
1.项目部署后启动服务器,发现并没有执行servlet无参构造器方法,说明在web容器启动时并没有创建servlet对象
2.用户提交请求后,马上可以看到无参构造器,init()方法,service()方法均执行
3.刷新页面,发现只会执行service()方法,每刷新一次,即每提交一次请求,就会执行一次servcie()方法

Servlet里的两个Map
一个map 的key值为url,value是servlet的引用
另一个mao的key值为url,value是servlet的class的包名,可以获取它通过反射机制实例化对象

Servlet里的getServletInfo()方法

Servlet里的servletconfig(接口)
1.servletconfig的作用是:在初始化servlet实例时用来给web容器传递servlet的配置信息

2.要连接源码才能看到Servlet得具体实现,是由服务器实现得,所以源码连接到Tomcat服务器得源码

3.获取servletconfig对象
一个servlet对象,对应一个servletconfig

4.servletconfig的用法
servletconfig对象是获取servlet的配置信息的,servlet的配置信息是存在web.xml文件里的,
通过servletconfig就可以获取到web.xml里对于servlet的配置信息
具体语法

public class SomeServlet implements Servlet {
	private ServletConfig config;  //定义一个ServletConfig 接口
	@Override
	public void init(ServletConfig config) throws ServletException {
		this.config = config;  //获取到ServletConfig对象
		
	}

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

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		//获取servlet名称
		String servletName = config.getServletName();//通过ServletConfig 来获取的,因为servlet的名字是放在配置文件里的
		System.out.println("the servletname is :"+servletName);

		
		//获取所有的初始化对象
		//在配置文件(web.xml)有配置一些初始化信息,也是通过ServletConfig读出来
		Enumeration<String> names = config.getInitParameterNames();
	
		
		//遍历枚举
		while(names.hasMoreElements()) {
			//获取当前枚举的遍历值
			String name = names.nextElement();
			//获取指定参数的值
			String value = config.getInitParameter(name);
			
			System.out.println(name+"="+value);
			
		}
		
	}

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

	@Override
	public void destroy() {
	

	}

}

servletContext对象 通过servletconfig 获取servletcontext对象
1.一个应用只有一个servletContext,也有一个别名叫application 代表整个应用
2.在servletContext里初始化的内容,在应用中的所有servlet均可调用
(1)web.xml 里面配置的内容

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

	<!-- 定义整个应用的初始化参数 -->
	<!-- servlet初始化的内容 -->
	<context-param>
		<param-name>id</param-name>
		<param-value>工号</param-value>
	</context-param>



  <servlet>
  	<servlet-name>some-servlet</servlet-name>
  	<servlet-class>com.swust.servlet.SomeServlet</servlet-class>
  </servlet>
  	<servlet-mapping>
  	<servlet-name>some-servlet</servlet-name>
  	<url-pattern>/some</url-pattern>
  	</servlet-mapping>


 <servlet>
  	<servlet-name>other-servlet</servlet-name>
  	<servlet-class>com.swust.servlet.OtherServlet</servlet-class>
  </servlet>
  	<servlet-mapping>
  	<servlet-name>other-servlet</servlet-name>
  	<url-pattern>/other</url-pattern>
  	</servlet-mapping>
</web-app>

域属性具有全局性,一个servlet改变了它,他在全局就已经改变了
(2)域属性的设置,一个servlet设置了servlet的域属性,其他servlet都可以修改和删除
servletContext.setAttribute(String name ,String value); 设置域属性
servletContext.getAttribute(); 获取域属性
servletContext.removeAttribute(); 删除域属性

3.contextPath的使用,获取的是当前应用的名称

4.获取当前应用目录下文件,在电脑中真实存在的路径

代码://realPath的用法,获取images的真实路径 
		String path = sc.getRealPath("/images"); //整个images是在webcontext下新建的,程序里直接通过相对路径访问它
		
		System.out.println("images real path:"+path);

输出结果:images real path:D:\eclispe\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\03-servletcontext\images

设置web欢迎页面

在webContext---->WEB-INF下新加一个html后缀的文件
欢迎页面的顺序,是由上倒下的查找

在tomcat会 默认查找三个文件 index.html index.htm index.jsp 如果文件目录下有这三个的任意一个。那么不用定义欢迎页面也可以默认读出

URL路径

1.一个servlet可以对应多个url-pattern
精路径

  <servlet>
  	<servlet-name>some-servlet</servlet-name>
  	<servlet-class>com.swust.servlet.SomeServlet</servlet-class>
  </servlet>
  	<servlet-mapping>
  	<servlet-name>some-servlet</servlet-name>
  	<url-pattern>/some</url-pattern>
  	<url-pattern>/some/sd</url-pattern>
  	<url-pattern>/so</url-pattern>    //可以有多个url-patttern
  	</servlet-mapping>

2.通配符匹配

<url-pattern>/some/*<url-pattern>    ’*‘  代表后面写啥都行

2.全路径匹配

<url-pattern>/*</url-pattern>     代表所有的请求都被改servley拦截,并执行servlet服务
<url-pattern>/</url-pattern> 
“/*”   “/”   都是全路径模式,但他们有不同
“/*”  拦截所有请求
“/”  只拦截静态请求  ,不拦截动态请求(如jsp)

3.后缀名模式

<url-pattern>*.do</url-pattern>    拦截后缀为.do的文件,任意给什么uri,只有是后缀为.do 则拦截

匹配原则:
路径优先匹配原则

精确路径匹配原则

长路径优先匹配原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值