1 Servlet概述
1.1什么是Servlet
Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
-
接收请求数据;
-
处理请求;
-
完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
1.2 实现Servlet的方式(由我们自己来写)
实现Servlet有三种方式:
-
实现javax.servlet.Servlet接口;
-
继承javax.servlet.GenericServlet类;
-
继承javax.servlet.http.HttpServlet类;
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。
-
JavaEE 这些类不在jdk中, 在Servlet-api的jar中
-
Servlet的类对象由Web服务器创建(Tomcat), Servlet的方法大部分由Tomcat来调用
init(),service(),destory()都是Tomcat调用,如果程序员调用,没有处理请求的能力
getServletConfig().getServletInfo() 给程序员调用
1.3编写Servlet
创建一个类实现Servlet接口
在项目目录/web/WEB-INF/web.xml文件中配置Servlet
Servlet: 动态资源
资源怎么被访问: url
2 Servlet接口
2.1 Servlet的生命周期
所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:
-
void init(ServletConfig);
-
void service(ServletRequest,ServletResponse);
-
void destroy();
描述Servlet从生到死的过程:
-
Servlet默认创建是在第一次请求的时候创建( 第一次惩罚: 耗时多一点: 多了创建Servlet对象的过程)
-
调用init() 方法, 做初始化
-
每请求一次, Servlet的service() 执行一次, 处理用户请求
-
当服务器关闭时候, 先销毁该tomcat创建所有的Servlet, 销毁Servlet对象之前, 调用destroy()方法
2.2 Servlet接口相关类型
在Servlet接口中还存在三个我们不熟悉的类型:
-
ServletRequest:service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
-
ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;
-
ServletConfig:init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的
<servlet>
元素。 -
ServletConfig 对应Servlet的配置
<servlet> <!--Servlet名称: 自定义, 推荐类名 --> <servlet-name>AServlet</servlet-name> <!--对应的Servlet类: 全限定名(包.类名)--> <servlet-class>com.fs.web.AServlet</servlet-class> </servlet> <!--绑定url Servlet类与url的映射 --> <servlet-mapping> <servlet-name>AServlet</servlet-name> <!--绑定的url 自定义 推荐使用 /类名 后面还有通配符 * 写法 --> <url-pattern>/AServlet</url-pattern> </servlet-mapping>
2.2.1 ServletRequest和ServletResponse
-
ServletRequest 请求对象, 当用户发起请求时, Tomcat会为这次请求创建一个请求, 请求对象包含很多信息(客户端的信息ip,端口, 请求url,请求参数), tomcat服务器处理请求时,创建一个线程来处理, 服务器这边是多线程服务
-
ServletResponse: 响应对象, 当用户发起请求, tomcat除了创建请求对象,还会创建响应对象, 由服务器给客户端数据通过响应对象传递的
3 GenericServlet
3.1 GenericServlet概述
GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。
3.2 GenericServlet的init()方法
在GenericServlet中,定义了一个ServletConfig config实例变量,并在init(ServletConfig)方法中把参数ServletConfig赋给了实例变量。然后在该类的很多方法中使用了实例变量config。
如果子类覆盖了GenericServlet的init(StringConfig)方法,那么this.config=config这一条语句就会被覆盖了,也就是说GenericServlet的实例变量config的值为null,那么所有依赖config的方法都不能使用了。如果真的希望完成一些初始化操作,那么去覆盖GenericServlet提供的init()方法,它是没有参数的init()方法,它会在init(ServletConfig)方法中被调用。
3.3 实现了ServletConfig接口
GenericServlet还实现了ServletConfig接口,所以可以直接调用getInitParameter()、getServletContext()等ServletConfig的方法。