一、servlet是什么?
是用java编写的应用在服务端的程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和修改数据,生成动态Web内容,例如页面等等。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
二、工作原理、流程
1、工作原理
Servlet容器(Tomcat)将Servlet类载入内存,并产生Servlet实例和调用它具体的方法。但是要注意的是,在一个应用程序中,每种Servlet类型只能有一个实例。
用户请求致使Servlet容器调用Servlet的Service()方法,并传入一个ServletRequest对象和一个ServletResponse对象。ServletRequest对象和ServletResponse对象都是由Servlet容器(例如TomCat)封装好的,并不需要程序员去实现,程序员可以直接使用这两个对象。
ServletRequest中封装了当前的Http请求,因此,开发人员不必解析和操作原始的Http数据。
ServletResponse表示当前用户的Http响应,程序员只需直接操作ServletResponse对象就能把响应轻松的发回给用户。
对于每一个应用程序或系统,Servlet容器还会创建一个ServletContext对象。这个对象中封装了上下文(应用程序)的环境详情。每个应用程序只有一个ServletContext。每个Servlet对象也都有一个封装Servlet配置的ServletConfig对象。
2、工作模式
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
3、servlet接口
public interface Servlet { void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy(); }
1、生命周期方法:
init():很明显,servlet的初始化方法,依赖于servletConfig对象初始化。当Servlet第一次被请求时,Servlet容器就会开始调用这个方法来初始化一个Servlet对象出来,在后续请求中不会再被Servlet容器调用。
service():每当请求Servlet时,Servlet容器就会调用这个方法。第一次请求时,Servlet容器会先调用init()方法初始化一个Servlet对象出来,然后会调用它的service()方法进行工作,但在后续的请求中,Servlet容器只会调用service方法了。
destroy():卸载应用程序或者关闭Servlet容器时,Servlet容器就会调用这个方法销毁Servlet。
2、其他方法:
getServletConfig():返回由Servlet容器传给init()方法的ServletConfig对象。
getServletInfo():返回Servlet的一段描述,可以返回一段字符串。
3、生命周期:
init( )->service( )->destroy( )是Servlet生命周期的方法。代表了Servlet从“出生”到“工作”再到“死亡 ”的过程。
举例:
web.xml:
<!--配置和映射servlet--> <servlet> <!--配置servlet的注册名--> <servlet-name>helloServlet2</servlet-name> <!--配置servlet的全类名--> <servlet-class>com.servlet.sc.HelloServlet2</servlet-class> <init-param> <!--初始化该servlet的配置参数--> <param-name>name</param-name> <param-value>lzg</param-value> </init-param> <!--初始化的顺序,0或正数直接加载,越小优先级越高,负数代表调用的时候才初始化--> <load-on-startup>-1</load-on-startup> </servlet> <!--配置servlet的映射--> <servlet-mapping> <!-- 需要和要映射的 servlet 节点的 serlvet-name 子节点的文本内容一致 --> <servlet-name>helloServlet2</servlet-name> <!--映射具体的访问路径,/代表该web应用的根路径--> <!--/*代表任何请求都会触发,/do代表以/do结尾的请求才会触发--> <url-pattern>/do</url-pattern> </servlet-mapping>
实体类:
import javax.servlet.*; import java.io.IOException; import java.util.Date; public class HelloServlet2 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init-2"); } @Override public ServletConfig getServletConfig() { return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("-2当前时间是:"+new Date()); } @Override public String getServletInfo() { return null; } @Override public void destroy() { System.out.println("destroy-2"); } }
效果:
参考博客:https://blog.csdn.net/qq_19782019/article/details/80292110