Servlet的生命周期

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/46446961

       虽然在大学的jsp专业课里“听说”过Servlet,但当时对Servlet的认识,的的确确停只是留在“听说”的阶段。还记得刚到公司实习那时,报了个Servlet的错,师傅问我Servlet配置对了吗?我来了一句:“什么配置?”,原来前几天在做DRP的过程中,渐渐加深了对Servlet的认识。下面谈一下对Servlet的理解。

       (文章中用登陆的业务逻辑来说明。)

       起初,java web 开发中,Client与Server的工作方式是客户端向Servlet提交请求(如提交用户名、密码),Servlet处理(如调用业务逻辑),将处理结果拼接成HTML格式返回到客户端:

            Client:login.html

<html>
    <head>Servlet Test</head>
    <body>
        <form method="post" action="/servlet/LoginServlet">
            <input type="input" name="userName"/>
            <input type="input" name="password"/>
            <input type="submit" name="submit"/>
        </form>
    </body>
</html>

          Servlet:LoginServlet.java

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;

/**
 * 登陆
 * @author Danny
 */
public class LoginServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		super.doGet(request, response);
		
response.setContentType("text/html;chartset=utf-8");
		String userName=request.getParameter("userName");
		String password=request.getParameter("password");
		boolean isLoginSuccessful=Manager.Login(userName,password);
		if(isLoginSuccessful){
		response.getWriter().print("登陆成功!");
		}else{
		response.getWriter().print("登陆失败!");
		}	
	}
}

          Manager代码省略~~

          除此之外还要在web.xml中配置Servlet:

  <servlet>
  	<servlet-name>LoginServlet</servlet-name> <!--Servlet的名字,可以任意命名-->
  	<servlet-class>com.danny.servlet.LoginServlet</servlet-class> <!--Servlet所在的真实路径-->
  </servlet>
  <servlet-mapping>
  	<servlet-name>ClientIdValidateServlet</servlet-name> <!--Servlet名字,必须与上面Servlet的名字一致-->
  	<url-pattern>/servlet/LoginServlet</url-pattern><!--Servlet虚拟路径,可以任意命名,form的action的属性值就是它-->
  </servlet-mapping>

(web.xml配置文件中每个标签的含义可以看后面的注释)

        每个Servlet都是一个java类,都要继承javax.servlet包下的GenerateServlet类。其生命周期如下:

⑴ 客户端发送请求之后,Servlet容器(如Tomcat)读取配置文件,将Servlet加载到内存并实例化(一个Servlet只实例化一次)。

         Servlet有两种实例化的方式:

         ①在Tomcat启动时实例化,在配置文件<servlet></servlet>标签中加入<load-on-startup>1</load-on-startup>。Servlet容器按属性值由小到大进行实例化,也就是<load-on-startup>属性值越小越先被实例化,值为0的Servlet最后被实例化。因为Servlet实例化需要较长的时间,所以这种方法的好处是用户等待时间较少。

         ②调用Servlet时进行实例化,<load-on-startup>属性值小于0时,Tomcat启动时不对Servlet进行实例化,<load-on-startup>属性值默认小于0。

⑵ 实例化时,调用init()方法(此方法继承自GenerateServlet类)进行初始化。

⑶ 创建HttpResponse、HttpRequest对象,执行Service(HttpServletRequest req,HttpServletResponse res)方法,根据客户端请求的类型(post/get)来判断是接下来是调用doPost()方法还是调用doGet()方法。(HttpServletRequest负责接收页面传过来的数据,HttpServletResponse负责向页面写数据)

⑷ 服务器停止时,调用destory()方法,销毁Servlet实例。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java Web文件下载功能实现

但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。

4642
来自专栏别先生

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Wi

1、window操作系统的eclipse运行wordcount程序出现如下所示的错误: Exception in thread "main" java.lang...

5159
来自专栏海说

开发一个Servlet示例

Servlet响应请求步骤: Servlet是一个基于Java技术的Web组件,运行在服务器端,用户利用Servlet可以很轻松地扩展Web服务器的功能,使其满...

1870
来自专栏数据之美

Spark 伪分布式 & 全分布式 安装指南

0、前言 3月31日是 Spark 五周年纪念日,从第一个公开发布的版本开始,Spark走过了不平凡的5年:从刚开始的默默无闻,到13年的鹊起,14年的大爆发...

5775
来自专栏尚国

S2-057远程代码执行漏洞复现过程

https://github.com/vulhub/vulhub/tree/master/struts2/s2-048

3773
来自专栏pydata

hadoop 2.4.1 上安装spark 1.1.0

进入到http://localhost:port访问Ipython Notebook

1202
来自专栏Golang语言社区

Go 标准库 http.FileServer 实现静态文件服务

访问 http://127.0.0.1:8080,即可看到类似 Nginx 中 autoindex 目录浏览功能。

1421
来自专栏web编程技术分享

JavaScript : 浅讲ajax1.ajax入门案例

2235
来自专栏java学习

servlet实现文件下载功能

第一步:首先在你的项目新建一个文件夹存放一些可以下载的文件(本教程一一张图片为例子) ? ---- 第二步:写servlet(DownloadServlet....

3396
来自专栏三流程序员的挣扎

Android 优化——内存优化

在 GC 的过程中,其它在工作的线程会暂停,包括负责绘制的 UI 线程,并且在不同区域的内存释放速度也有一定的差异,但不管在哪个区域,都要到这次 GC 内存回收...

2911

扫码关注云+社区

领取腾讯云代金券