JavaEE基础(01):Servlet实现方式,生命周期执行过程
本文源码:github·点这里 || gitee·点这里
一、servlet简介
java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态web内容。使用servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
二、实现方式
1、继承httpservlet
- api简介
继承自 genericservlet. 遵守 http协议实现,以设计模式的角度看,httpservlet担任抽象模板角色,模板方法:由service()方法担任。基本方法:由dopost()、doget()等方法担任。service()方法流程,省略了部分判断逻辑。该方法调用七个do方法中的一个或几个,完成对客户端请求的响应。这些do方法需要由httpservlet的具体子类提供,这种api封装是典型的模板方法模式。
- 代码案例
public class servletoneimpl extends httpservlet { @override protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { response.setcontenttype("text/html;charset=utf-8"); response.getwriter().print("执行:doget"); } @override protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { response.setcontenttype("text/html;charset=utf-8"); response.getwriter().print("执行:dopost"); } }
2、继承genericservlet
- api 简介
servlet 接口和 servletconfig 接口的实现类. 一个抽象类. 其中的 service 方法为抽象方法。
- 代码案例
public class servlettwoimpl extends genericservlet { @override public void service(servletrequest servletrequest, servletresponse servletresponse) throws servletexception, ioexception { httpservletresponse response = (httpservletresponse)servletresponse ; response.setcontenttype("text/html;charset=utf-8"); response.getwriter().print("执行:service"); } }
3、实现servlet接口
- api 简介
servlet是一个接口,其中包含init、getservletconfig、service、getservletinfo、destroy几个核心方法。
- 代码案例
public class servletthreeimpl implements servlet { @override public void init(servletconfig servletconfig) throws servletexception { servletconfig.getservletname(); system.out.println("init 被调用..."); } @override public void service(servletrequest servletrequest, servletresponse servletresponse) throws servletexception, ioexception { system.out.println("threadid:"+thread.currentthread().getid()); system.out.println("service 被调用..."); httpservletresponse response = (httpservletresponse)servletresponse ; response.getwriter().print("servlet.life"); } @override public void destroy() { system.out.println("destroy 被调用..."); } @override public servletconfig getservletconfig() { system.out.println("getservletconfig 被调用..."); return null; } @override public string getservletinfo() { system.out.println("getservletinfo 被调用..."); return null; } }
三、生命周期
- 加载和实例化
当servlet容器启动或客户端发送请求时,servlet容器会查找是否存在该servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个servlet实例(属于单例设计模式)。load-on-startup 可以配置创建时序。
- 初始化:init()
实例化后,servlet容器将调用init方法一次,初始化当前 servlet。
- 服务:service()
初始化后,servlet处于响应请求的就绪状态。当接收到客户端请求时,调用service()的方法处理客户端请求,httpservlet的service()方法会根据不同的请求 调用不同的模板方法。
- 销毁:destroy()
当servlet容器关闭时,servlet实例也随时销毁。关闭 tomcat 服务时可以通过日志打印看到该方法的执行。
四、运行配置
1、web.xml配置
<servlet> <servlet-name>servletoneimpl</servlet-name> <servlet-class>com.node01.servlet.impl.servletoneimpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletoneimpl</servlet-name> <url-pattern>/servletoneimpl</url-pattern> </servlet-mapping> <servlet> <servlet-name>servlettwoimpl</servlet-name> <servlet-class>com.node01.servlet.impl.servlettwoimpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>servlettwoimpl</servlet-name> <url-pattern>/servlettwoimpl</url-pattern> </servlet-mapping> <servlet> <servlet-name>servletthreeimpl</servlet-name> <servlet-class>com.node01.servlet.impl.servletthreeimpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>servletthreeimpl</servlet-name> <url-pattern>/servletthreeimpl</url-pattern> </servlet-mapping>
请求:http://localhost:6003/servletoneimpl
测试。
- servlet-name:servlet 注册名称。
- servlet-class:servlet 全路径类名。
- serlvet-mapping:同一个servlet可以被映射到多个url上。
- url-pattern:servlet 访问的映射路径。
2、线程池运行
观察上述第三种servlet实现方式的日志打印:thread.currentthread().getid());
。
threadid:32 threadid:33 threadid:32 threadid:31 threadid:32
这里不难发现,servlet以线程池的方式执行的。
五、源代码地址
github·地址 https://github.com/cicadasmile/java-base-parent gitee·地址 https://gitee.com/cicadasmile/java-base-parent