Servlet概念
Servlet是javaWeb的三大组件之一,其他的两种分别是Filter(拦截器),Listener(观察者模式)。我们的一个web项目需要部署在web服务器(例如tomcat)上,才能够接收浏览器等客户端的请求。服务器接收到请求之后,实际上是由Servlet组件来进行具体的业务逻辑处理,然后再对客户端进行响应。一个web项目中通常会有多个Servlet组件来处理不同的请求。例如在开发一个管理系统时,用户在进行登录的时候,服务器上将调用登录的Servlet来进行登录逻辑处理:
那么Servet有什么作用呢?它的主要功能在于交互式地浏览和修改数据,生成动态Web内容。JavaEE为我们提供了Servlet接口标准,实现了该接口的类都可以称为一个Servlet:
package com.rl.servlet;
public class ServletDemo1 implements Servlet{
}
Servlet的主要接口
Servlet接口中有5个方法,实现该接口的类,都可以称为一个Servlet:
package com.rl.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo1 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 {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
- init()方法的执行时机:当前实例被创建的时候被调用,做一些初始时的工作,这个方法平时用的不多。它的参数
ServletConfig
在初始化的时候可以进行配置,这个晚点说。 - service()方法是Servlet的核心方法。它的执行时机是当一个请求来请求当前的Servlet的时候被调用,进行具体的逻辑处理并响应请求。
- destroy()方法的执行时机是当前对象被销毁的时候,用于执行一些收尾工作。
- getServletInfo()用于获得当前Servlet的一些信息
- ServletConfig ()用于获得当前Servlet的配置信息
先不关注getServletInfo
、ServletConfig
这两个方法。实现其他三个方法如下所示:
package com.rl.servlet;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("excute ServletDemo1 init()");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("excute ServletDemo1 service()");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("excute ServletDemo1 destory()");
}
}
写好了Servlet之后,还需要在web.xml
进行配置才能访问到ServletDemo1
:
<servlet>
与<servlet-mappint>
总是需要成对出现的。<servlet-name>
为servlet起了个别名,<servlet-class>
指定了别名关联的真正处理请求的java类是哪个,<url-pattern>
指定在浏览器访问该Servlet时的访问名称。
假设你已经配置好了本地的tomcat服务器,启动服务器之后访问"http://localhost:8080/hello" 即可以访问到ServletDemo1
:
Tomcat服务器在本地启动并加载了本项目后,便可以接收来自浏览器的请求。当它收到"http://localhost:8080/hello" 请求时,Tomcat会找到web.xml文件,通过<url-pattern>/hello<url-pattern>
发现该配置与请求路径匹配。这说明存在一个可以处理该请求的Serverlet,于是通过上述的<servlet-name>
<servlet-class>
最终找到了ServletDemo1.
再回过头来看,其实Servlet是实现了javax.servlet接口的类。它被部署在web服务器上,通过配置文件来定义其请求路径。而浏览器依据该路径,来访问到具体的Servlet进行业务逻辑的处理。
Servlet的生命周期
生命周期指的是Servlet的实例从创建到销毁的整个过程,该过程与我们上面提到的三个方法有关:
- init():在Servlet的生命周期中,仅执行一次init()方法,负责在服务器装入Servlet时初始化Servlet对象。可以通过
web.xml
来配置服务器,用于控制在启动服务器时或是首次访问Servlet时装入Servlet。服务器装入Servlet对象后,无论有多少客户端请求Servlet,都不会再调用init()方法。
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.rl.servlet.ServletDemo1</servlet-class>
<!--用于配置在启动Tomcat服务器时装入ServletDemo1服务器-->
<load-on-startup>1</load-on-startup>
</servlet>
- service():每当一个客户端请求一个Servlet对象时该方法被调用。服务器将客户端的请求包装成
ServletRequest
对象作为“请求”参数,同时传递一个ServletResponse
对象作为“响应”参数来调用service()方法。 - destory():在服务器停止、卸载Servlet时,该方法被调用,且仅执行一次,这标记着一个Servlet退出了它的生命周期,该方法负责释放占用的资源。
(完)