在手动写完一个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. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  2. [转]认识JWT

    本文转自:https://www.cnblogs.com/cjsblog/p/9277677.html 1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准 ...

  3. 金三银四招聘季,这些BAT以及独角兽互联网公司官方招聘网站值得关注。(个人梳理备用:附BAT以及独角兽公司官方招聘网址)

    金三银四是一年当中的招聘最旺盛的时期,即招聘高峰期,在这个期间内有非常多名企巨头公司的放出大量的岗位信息.以博主几年的工作经验来看,在这期间找到称心如意的工作的几率大大提升,对于很多程序员来说,薪水高 ...

  4. Java学习笔记之——枚举类

    枚举可以限定类的值只是有限个,例如:星期,只有星期一到星期天 语法案例:

  5. Hibernate入门(五)---------事务管理

    在Hibernate中,可以通过代码来操作管理事务,如通过“Transaction tx = session.beginTransaction()”,开启一个事务,持久化操作后,通过"tx. ...

  6. MongoDB日期类型查询

    一.前言 MongoDB 里面的日期类型是没有时区概念的,默认存储的是 ISODate("2018-04-02T13:19:16.418Z") 这种格式的零时区时间,比北京时间晚了 ...

  7. 借鉴Glide思想二次封装Fresco

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近封装了个 Fresco 的组件库:DFresco,就顺便来讲讲. 背景 Fresco 图片库很强大,我们项目中就是使用的 Fre ...

  8. es6 语法 (对象扩展)

    { //简洁表示法 let o = 1; let k = 2; let es5 = { o:o, k:k }; let es6 = { o,k }; console.log(es5,es6); //1 ...

  9. [转]JS学习总结-技巧、方法、细节

    变量转换 var myVar = "3.14159", str = ""+ myVar,// string类型 int = ~~myVar, // number ...

  10. Spring学习之旅(四)Spring工作原理再探

    上篇博文对Spring的工作原理做了个大概的介绍,想看的同学请出门左转.今天详细说几点. (一)Spring IoC容器及其实例化与使用 Spring IoC容器负责Bean的实例化.配置和组装工作有 ...