Servlet方法生命周期及执行原理详解
快速入门
创建javaee项目
定义一个类,实现servlet
接口
public class servletdemo1 implements servlet { /** * 初始化方法 * 在servlet被创建时,执行。只会执行一次 * @param servletconfig * @throws servletexception * */ @override public void init(servletconfig servletconfig) throws servletexception { system.out.println("init......"); } /** * 获取servletconfig对象 * servletcongig:servlet的配置对象 * @return * */ @override public servletconfig getservletconfig() { return null; } /** * 提供服务方法 * 每一次servlet被访问时,执行。可执行多次 * @param servletrequest * @param servletresponse * @throws servletexception * @throws ioexception * */ @override public void service(servletrequest servletrequest, servletresponse servletresponse) throws servletexception, ioexception { system.out.println("服务小皮皮美滋滋!"); } /** * 获取servlet的一些详细,版本,作者等等 * @return * */ @override public string getservletinfo() { return null; } /** * 销毁方法 * 在服务器正常关闭时执行。执行一次 * */ @override public void destroy() { system.out.println("服务关闭了..."); } }
实现接口中的抽象方法
配置servlet
在web.xml
中配置
<!--配置servlet --> <servlet> <servlet-name>demo1</servlet-name> <servlet-class>xppmzz.servletdemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping>
执行
点击idea中tomcat的启动按钮,在浏览器中输入http://localhost:8080/demo1
。
观察idea输出窗口输出内容。
执行原理
- 当服务器接受到客户端浏览器的请求后,会解析请求
url
路径,获取访问的servlet
的资源路径。 - 查找
web.xm
l文件,是否有对应的<url-pattern>
标签体内容。 - 如果有,则在找到对应的
<servlet-class>
全类名。 -
tomcat
会将字节码文件加载进内存,并且创建其对象。 - 调用其方法。
servlet中的生命周期方法
1.被创建:执行init方法,只执行一次
- servlet什么时候被创建?
默认情况下,第一次被访问时,servlet被创建。
- 可以配置执行servlet的创建时机。
在<servlet>
标签下配置:
第一次被访问时,创建<load-on-startup>
的值为负数。
在服务器启动时,创建<load-on-startup>
的值为0或正整数。
<servlet> <servlet-name>demo1</servlet-name> <servlet-class>xppmzz.servletdemo1</servlet-class> <load-on-startup>5</load-on-startup> </servlet>
如果为负数,则在浏览器中第一次输入http://localhost:8080/demo1
才会执行init
方法。0或者正整数会在tomcat
第一次启动时执行init
方法。
- servlet的init方法,只执行一次,说明一个servlet在内存中只存在一个对象,servlet是单例的。
因此,多个用户同时访问时,可能存在线程安全问题。
解决:尽量不要在servlet中定义成员变量。即使定义了成员变量,也不要对修改值
2.提供服务:执行service方法,执行多次
每次访问servlet时,service方法都会被调用一次。
3.被销毁:执行destroy方法,只执行一次
- servlet被销毁时执行。服务器关闭时,servlet被销毁。
- 只有服务器正常关闭时,才会执行destroy方法。
- destroy方法在servlet被销毁之前执行,一般用于释放资源。
servlet3.0
好处:支持注解配置,可以不需要web.xml
。
步骤:
创建javaee项目,选择servlet的版本3.0以上,可以不创建web.xml。
定义一个类,实现servlet接口。
复写方法。
在类上使用@webservlet
注解,进行配置。@webservlet("资源路径")
代码示例:
@target({elementtype.type}) @retention(retentionpolicy.runtime) @documented public @interface webservlet { string name() default "";//相当于<servlet-name> string[] value() default {};//代表urlpatterns()属性配置 string[] urlpatterns() default {};//相当于<url-pattern> int loadonstartup() default -1;//相当于<load-on-startup> webinitparam[] initparams() default {}; boolean asyncsupported() default false; string smallicon() default ""; string largeicon() default ""; string description() default ""; string displayname() default ""; }
servlet体系结构
servlet
– 接口
genericservlet
– 抽象类
httpservlet
– 抽象类
genericservlet
将servlet
接口中其他的方法做了默认空实现,只将service()
方法作为抽象。
将来定义servlet类时,可以继承genericservlet,实现service()方法即可
@webservlet("/demo2") public class servletdemo2 extends genericservlet { @override public void service(servletrequest servletrequest, servletresponse servletresponse) throws servletexception, ioexception { system.out.println("genericservlet...."); } }
httpservlet
对http
协议的一种封装,简化操作。
定义类继承httpservlet
。
复写doget
/dopost
方法。
@webservlet("/demo3") public class servletdemo3 extends httpservlet { @override protected void doget(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { system.out.println("doget......"); } @override protected void dopost(httpservletrequest req, httpservletresponse resp) throws servletexception, ioexception { system.out.println("dopost......"); } }
servlet相关配置
urlpartten
:servlet
访问路径。
一个servlet可以定义多个访问路径 : @webservlet({"/d4","/dd4","/ddd4"})
路径定义规则:/xxx
:路径匹配。/xxx/xxx
:多层路径,目录结构。*.do
:扩展名匹配。
以上就是servlet方法生命周期及执行原理详解的详细内容,更多关于servlet的资料请关注其它相关文章!