Java三十四篇: 回顾Servlet
什么是Servlet?
Servlet 是 JavaWeb 的三大组件之一,它属于动态资源,Servlet 的作用是处理请求,服务器会把接收到的请求给 Servlet 处理,在 Servlet 中需要
接收请求数据
处理请求
完成响应
每个 Servlet 是唯一的,它们处理的请求时不同的。
二、Servlet接口介绍
概念:javaweb程序开发,项目就是一个java应用程序,用sun公司提供的接口Servlet,只要实现里面的一些接口,并按照规则把接口中的代码写完,就是一个javaweb项目。
如果要完成一个javaweb项目的开发
编写一个Java类,让这个java类实现Servlet接口。
将编写好的javaweb项目放置到web服务器中
实现Servlet的方式
实现 Servlet 有三种方式:
实现 java.servlet.Servlet 接口
继承 javax.servlet.GenericServlet 类
继承 javax.servletHttpServlet 类
查看源码

spring家族底层都是封装了大量的servlet
package com.zhsj;
import javax.servlet.*;
import java.io.IOException;
/**
* @program: test
* @description: Servlet 中的方法大多由 Tomcat 调用,Servlet 的对象也是有 Tomcat 生成
* 导入了依赖:tomcat-embed-core:9.0.56
* @author: liulq
*
*/
publicclass Test2 implements Servlet {
/**
* 它是生命周期方法
* 它会在 Servlet 对象创建之后马上执行,并执行一次(出生之后)
* */
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init");
}
/**
* 可以获取 Servlet 的配置信息
* */
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
returnnull;
}
/**
* 它是声明周期方法
* 它会被调用多次,每次请求都是调用这个方法
* */
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service");
}
/**
* 获取 Servlet 的信息
* */
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return"Hello World";
}
/**
* 它是声明周期方法
* 它会在 Servlet 被销毁之前调用,并且只会调用一次
* */
@Override
public void destroy() {
System.out.println("destroy");
}
}
说明:
编写一个Servlet实现类必须去实现Servlet的实现
Servlet接口,根据Servlet的API知道,Servlet存在3个生命周期的方法
init():用于初始化的方法,没有特殊代码处理的时候,发送请求的时候执行该方法
service():用于处理请求和响应的方法,程序员编写代码的部分。
destroy():销毁的方法,如果没有特殊代码处理,关闭服务器的时候销毁。
Servlet接口中,也提供了获取Servlet初始化信息的方法
getServletConfig();重点,该方法主要能够得到一个ServletConfig对象。
getServletInfo():只能获取Servlet版本号等信息。一般不用。
Servlet的API中,提到了在程序员编写Servlet的时候,实际上不需要实现Servlet接口,可以选择继承genericServlet或者HttpServlet
说明:虽然这两个类都是可以实现一个Servlet程序开发的,但是从API上可以看到,实际HttpServlet是GenericServlet的子类,因此,推荐使用HttpServlet
例子:
1、创建一个javaweb 的项目
目录结构:


2、编程servlet代码
package com.woniuxy.demo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
/**
* @program: test
* @description:
* @author: liulq
* @create:
*/
publicclass ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
/*
*
* <p>Title: doPost</p>
* <p>Description: </p>
* @param request 请求对象 获取浏览器向服务器发送的数据
* @param response 响应对象 将服务器的数据发送给浏览器
* @throws ServletException
* @throws IOException
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求成功");
//由服务器给浏览器写出数据
OutputStream out = response.getOutputStream();
out.write("abc".getBytes());
//关闭资源
out.close();
}
}
3、编写web.xml映射的代码
<!-- 配置ServletDemo2的映射 -->
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>com.woniuxy.demo.ServletDemo2</servlet-class>
</servlet>
<!-- 映射配置 -->
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
4、启动tomcat,测试请求demo

Servlet流程及原理
浏览器请求之后解析的步骤:
浏览器发出请求,链接服务器
发送http请求:http://localhost:8080/WebDemo2/demo2;
解析出来IP地址
解析出来端口号
解析出来web应用程序
解析出来请求访问的资源文件
创建Servlet对象,并用init初始化Servlet对象
调用Service方法或者别拆分出来的doxxx()方法。
关闭服务器的时候,销毁Servlet对象,调用destroy方法
Servlet对象的生命周期
实现Servlet接口或者继承HttpServlet,该类所在的工程为一个web应用程序,该程序需要放到服务器里面,当服务器一旦开启,那么服务器会自动的在容器中创建一个Servlet对象。
当发送第一条请求的时候,会调用init方法进行初始化Servlet对象。后续请求将不再初始化
每一次调用service方法或者doGet方法或者doPost方法之前,都需要使用Servlet对象创建独立的HttpServletRequest对象和HttpServletResponse对象。
调用service方法或者对应的doXXX()方法处理请求响应。
当服务器关闭的时候,销毁Servlet对象。
web中的其他重要的对象
ServletConfig对象
作用:获取配置文件(web.xml)中的参数,一些数据可以先配置在web.xml文件中,由ServletConfig对象进行获取,在servlet接口中提供了有参的init方法,参数为ServletConfig对象,在初始化Servlet对象的时候,会调用init方法,在这个时候,web服务器会自动将web.xml里面的参数加载到ServletConfig对象。并且同时将ServletConfig对象交给Servlet对象。
ServletContext对象
一个web容器里面,只有一个ServletContext对象,获取ServletContext对象有两种方式
方式1:通过ServletConfig对象中的getServeltContext()方法来获取ServletContext对象
ServletContext context = this.getServletConfig().getServletContext();
方式2:可以直接通过Servlet对象中的getServletContext()方法来获取ServletConext对象,推荐方式。
ServletContext context = this.getServletContext();
Servlet的第一个作用:实现各个Servlet类中的数据共享
获取全局的配置文件值
读取配置文件
Response对象(相应)
当服务器接收到了请求之后,会执行doPost或者doGet方法,执行完之后会给浏览器反馈数据,完成反馈数据的对象就是response,该对象不需要程序员自己创建。
Request对象 (请求)
当浏览器向服务器发送请求之后,服务器会接受到来自浏览器的数据(用户填写的数据、请求头数据和请求的数据),request是完成前端数据交给服务器的对象
总结:
1.servlet是Javaweb 的三大组件之一,是很多框架的底层,如果需要知道底层怎么实现的那必须知道servlet
2.实现 Servlet 有三种方式:
实现 java.servlet.Servlet 接口
继承 javax.servlet.GenericServlet 类
继承 javax.servletHttpServlet 类
3.servletContext对象、ServletCofig对象、Reponse对象、Request对象还是很重要的,要有一定的认识
