在手动写完一个Servlet小例子后,是不是有很多疑问,接下来会为大家详细介绍Servlet的知识。

1、什么是Servlet

是在服务器上运行的小程序。一个servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问驻留在服务器内存里的servlet程序。

2、为什么要用Servlet

web服务器只能处理静态资源的请求,需要事先将静态页面写好,不能处理动态资源请求(动态资源请求主要是一些需要计算或数据操作而生产的页面),在早期为了解决这一问题,使用了CGI程序(Common Gateway Interface通用网关接口)来扩展web服务器的功能,但是其性能较差,可移植性差,慢慢被弃用。

Servlet的出现很好的解决使用CGI出现的问题。第一,Servlet可移植性强,Servlet是用Java语言实现的,具备一处编写处处运行的特点。第二,Servlet可扩展性强,可使用Java的所有类库,并且可以通过sockets和RMI机制(Remote Method Invocation远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法,这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。)与数据库或其他软件进行交互。第三,Servlet性能更好,Servlet只需web服务器加载一次,而且可以在不同请求之间保持服务;相反,每一次对CGI脚本的请求,都会使Web服务器加载并执行该脚本。一旦这个CGI脚本运行结束,它就会被从内存中清除,然后将结果返回到客户端。CGI脚本的每一次使用都会造成程序初始化过程的重复执行。

3、编写Servlet的步骤

A.编写一个Java类,继承HttpServlet,重写doGet()方法和doPost()方法。

B.配置web.xml文件。

C.编写jsp页面。

D.启动容器,访问servlet,在浏览器验证。

4、Servlet的执行流程

5、Servlet的生命周期

Servlet的生命周期是指Servlet容器如何创建Servlet对象,如何对其进行初始化,如何调用Servlet对象处理请求,如何销毁Servlet对象的整个过程。

主要分为四个阶段:(1)实例化;(2)初始化;(3)调用;(4)销毁。

A.实例化阶段。Servlet实例会在以下两种情况下创建:一是在Servlet容器收到request请求后创建;二是在Servlet容器启动时创建,需要在web.xml中配置<load-on-startup>1</load-on-startup>标签,中间的值是一个大于0的整数,值越小优先级越高。

B.初始化阶段。Servlet实例化后,会调用init(ServletConfig config)方法,其中ServletConfig对象是一个成员变量,是Servlet容器传递进来的,init方法只会执行一次。

C.调用阶段。servlet容器收到请求后,调用servlet对象的service()方法,再将处理结果返回给浏览器。

D.销毁阶段。对server执行stop操作或将服务关闭时,调用servlet对象的destroy方法,且只会执行一次。

6、实操验证

新建一个Maven web项目,写好servlet,配置好web.xml,写一个简单的jsp页面,可以来实际验证刚才的分析。

A.新建两个Java类,继承HttpServlet

/**
* servlet的生命周期
* @author 小川94
* @date 2018年6月4日
*/
public class LifeServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LifeServlet() {
System.out.println("LifeServlet:执行构造方法...");
} @Override
public void init() throws ServletException {
System.out.println("LifeServlet:执行init方法...");
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 打印日志
System.out.println("LifeServlet:处理Get请求...");
// 设置服务器返回的数据类型
response.setContentType("text/html");
// 获取一个输出流
PrintWriter out = response.getWriter();
// 输出数据,将数据发送到浏览器
out.println("<h1>Hello Servlet!</h1>");
// 关闭流
out.close();
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 打印日志
System.out.println("LifeServlet:处理Post请求...");
// 对从浏览器获取的数据设置编码格式
request.setCharacterEncoding("UTF-8");
// 获取页面传入的数据
String name = request.getParameter("name");
System.out.println(name);
// 设置服务器返回的数据类型
response.setContentType("text/html;charset=UTF-8");
// 获取一个输出流
PrintWriter out = response.getWriter();
// 输出数据,将数据发送到浏览器
out.println("<h1>Hello "+name+"!</h1>");
// 关闭流
out.close();
} @Override
public void destroy() {
System.out.println("LifeServlet:执行destroy方法...");
} }
public class LifeServlet2 extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public LifeServlet2() {
System.out.println("LifeServlet2:执行构造方法...");
} @Override
public void init() throws ServletException {
System.out.println("LifeServlet2:执行init方法...");
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 打印日志
System.out.println("LifeServlet2:处理Get请求...");
// 设置服务器返回的数据类型
response.setContentType("text/html");
// 获取一个输出流
PrintWriter out = response.getWriter();
// 输出数据,将数据发送到浏览器
out.println("<h1>Hello Servlet!</h1>");
// 关闭流
out.close();
} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 打印日志
System.out.println("LifeServlet2:处理Post请求...");
// 对从浏览器获取的数据设置编码格式
request.setCharacterEncoding("UTF-8");
// 获取页面传入的数据
String name = request.getParameter("name");
System.out.println(name);
// 设置服务器返回的数据类型
response.setContentType("text/html;charset=UTF-8");
// 获取一个输出流
PrintWriter out = response.getWriter();
// 输出数据,将数据发送到浏览器
out.println("<h1>Hello "+name+"!</h1>");
// 关闭流
out.close();
} @Override
public void destroy() {
System.out.println("LifeServlet2:执行destroy方法...");
}
}

B.配置web.xml文件

<servlet>
<servlet-name>LifeServlet2</servlet-name>
<servlet-class>servlet.LifeServlet2</servlet-class>
<!-- 设置装载优先级 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet2</servlet-name>
<url-pattern>/LifeServlet2</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>servlet.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/LifeServlet</url-pattern>
</servlet-mapping>

C.编写jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>第一个servlet例子</title>
</head>
<body style="margin:50px;"> <!-- 演示get请求 -->
<a href="LifeServlet">Get请求</a> <!-- 演示post请求 -->
<form action="LifeServlet" method="post">
<label>姓名</label>
<input type="text" name="name"/>
<br/>
<input type="submit" value="提交"/>
</form> <br/>
<br/> <!-- 演示get请求 -->
<a href="LifeServlet2">Get请求</a> <!-- 演示post请求 -->
<form action="LifeServlet2" method="post">
<label>姓名</label>
<input type="text" name="name"/>
<br/>
<input type="submit" value="提交"/>
</form> </body>
</html>

我们进行了两次实验,一次是没有在web.xml文件里添加<load-on-startup>1</load-on-startup>,处理页面请求时,是调用哪个servlet才会去装载哪个servlet,然后进行一系列的操作。

第二次是为LifeServlet2添加了<load-on-startup>1</load-on-startup>标签,在Tomcat启动的时候,Servlet容器就装载了LifeServlet2并初始化,然后根据浏览器的请求来执行对应的方法,最后再销毁。

文章首发于我的个人公众号:悦乐书。喜欢分享一路上听过的歌,看过的电影,读过的书,敲过的代码,深夜的沉思。期待你的关注!

公众号后台输入关键字“Java学习电子书”,即可获得12本Java学习相关的电子书资源,如果经济能力允许,还请支持图书作者的纸质正版书籍,创作不易。

Servlet(二):初识Servlet的更多相关文章

  1. Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)

    该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用s ...

  2. 编写Servlet步骤以及Servlet生命周期是怎样的

    一.编写Servlet步骤 1.继承HttpServlet,HttpServlet在javax-servlet-api依赖下 2.重写doGet()或者doPost()方法 3.在web.xml中注册 ...

  3. Servlet基础(二) Servlet的生命周期

    Servlet基础(二) Servlet的生命周期 Servlet的生命周期可以分为三个阶段: 1.初始化阶段 2.响应客户请求阶段 3.终止阶段 Servlet的初始化阶段 在下列时刻Servlet ...

  4. javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)

    一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录, ...

  5. JavaWeb 后端 <二> 之 Servlet 学习笔记

    一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public v ...

  6. Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用

    Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019 ...

  7. 二:Servlet

    一:servlet开端 1.servlet是什么? a.就是一个java类 b.服务器端的小程序 c.处理用户请求 2.servlet的实现: a.实现Servlet接口 b.继承GenericSer ...

  8. web开发之Servlet 二

    在上一篇文章中,我们演示也证明了Servlet 是一种动态web资源开发的技术,即我可以在浏览器中输入URL,然后就可以在浏览器中看到我们编写的Servlet资源. 那当我们在浏览器上一起一个HTTP ...

  9. JavaWeb学习总结(二) Servlet

    本文目录 一.Servlet概述 二.Servlet接口 三.GenericServlet 四.HttpServlet 五.Servlet细节 六.ServletContext 回到顶部 一.Serv ...

随机推荐

  1. 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page1-6

    前言 大家好.这是开通本号的第一篇文章.从事IT行业已经20年了,从使用PowerBuilder做企业信息系统开始,做了七八年开发,然后转型Java不是很成功,从07年之后,我转做产品经理,机缘巧合, ...

  2. MAC 地址(单播、组播、广播地址分类)

    简介 一个制造商在生产制造网卡之前,必须先向 IEEE 注册,以获取到一个长度为 24bit 的厂商代码,也称为 OUI(Organizationally-Unique Identifier).制造商 ...

  3. HTML学习感悟

    HTML是一个超文本语言,原本并不打算做网站的我发现学习信息根本离不开web前端的掌握,因此需要对HTML进行一定程度的学习.对了,它可以说是网页的一个标志,打开任何网页我们看到的都是HTML的文本, ...

  4. eclipse使用svn

    主干(trunk).分支(branch ).标记(tag) 用法示例 + 图解   以svn为例,git的master相当于trunk,dev分支相当于branches --------------- ...

  5. Codeforces Round #309 (Div. 2)

    A. Kyoya and Photobooks Kyoya Ootori is selling photobooks of the Ouran High School Host Club. He ha ...

  6. springboot之单元测试

    springboot在写完之后,肯定都需要进行单元测试,如下给出一些样例 工程层次结构如图 代码如下: controller: package com.rookie.bigdata.controlle ...

  7. Android实现图片的压缩、旋转工具类

    import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matri ...

  8. VMWAR-workstatuon : 安装win10、server 2008 r2、server 2012 r2

    最新版的VMWAR 不是很文档,建议大家还是下载稳定版,截止当前最新版的为15,用了,有点问题. 换成14~ 可以了.(15创建虚拟机安装vmware tools 怎么都安装不了). 关于创建虚拟机, ...

  9. Vue2+VueRouter2+webpack 构建项目实战(二):目录以及文件结构

    通过上一篇博文<Vue2+VueRouter2+webpack 构建项目实战(一):准备工作>,我们已经新建好了一个基于vue+webpack的项目.本篇文章详细介绍下项目的结构. 项目目 ...

  10. 2018-08-11 中文代码示例之Spring Boot 2.0.3问好

    上次试用Spring Boot还是两年前: 中文代码示例之Spring Boot 1.3.3演示. 打算用在一个讨论组内小项目上, 于是从官网Building an Application with ...