Servlet概述

为什么要学习Servlet

Java Web的演变过程大概可以分为4个阶段:

  • Servlet + jdbc + jsp
  • Spring + Struts2+ Hibernate(SSH)
  • Spring + SpringMVC + Mybatis(SSM)
  • 微服务阶段

前两个阶段基本上可以说是历史了,当今Spring家族一统天下。

现在实际开发中很少直接使用Servlet了,但是各个框架的底层还是大量使用了Servlet,学习Servlet对后续各个框架的理解和学习都很有帮助。

什么是 Servlet

Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

Servlet其实就是一个遵循Servlet开发的java类。Serlvet是由服务器调用的,运行在服务器端。

Servlet带给我们最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互

工作流程

  • Tomcat将浏览器提交的请求封装成HttpServletRequest对象,同时将输出流封装成HttpServletResponse对象

  • Tomcat把request、response作为参数,调用Servlet的相应方法,例如doGet(request, response)等

  • Servlet中主要处理业务逻辑


生命周期

在 Web 容器中,Servlet 主要经历 4 个阶段,如下图:

  1. 加载Servlet。当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
  2. 初始化。当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
  3. 处理服务。当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
  4. 销毁。当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
  5. 卸载。当Servlet调用完destroy()方法后,等待垃圾回收。

如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作

只要访问Servlet,service()就会被调用。init()只有第一次访问Servlet的时候才会被调用。

destroy()只有在Tomcat关闭的时候才会被调用。


处理请求的方法

Servlet 即实现了 Servlet 接口 的类,实现 Servlet 接口 的时候,需要实现5个方法

public interface Servlet {
void init(ServletConfig var1) throws ServletException; ServletConfig getServletConfig(); void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; String getServletInfo(); void destroy();
}

为了方便使用可以直接继承 HttpServlet 类,该类已经默认实现了 Servlet 接口中的所有方法。

在编写 Servlet 的时候,只需要重写你需要的方法就好了。

并且该类还在原有 Servlet 接口上添加了一些与 HTTP 协议处理相关的方法。

  • Servlet 处理请求的方法一共有三种:

    • 实现 service() 方法
    • 重写 doGet()
    • 重写 doPost()

HttpServletRequest 和 HttpServletResponse

对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,即 request 和 response 对象。

HttpServletRequest 常用方法

  • String getContextPath()

    获取上下文路径
  • String getHeader(String headName)

    根据指定的请求头获取对应的请求头的值.
  • String getRequestURI()

    返回当期请求的资源名称. 上下文路径/资源名
  • StringBuffer getRequestURL()

    返回浏览器地址栏的内容
  • String getRemoteAddr()

    返回请求服务器的客户端的IP

获取请求参数的方法:

  • String getParameter(String name)

    根据参数名称,获取对应参数的值.
  • String[] getParameterValues(String name)

    根据参数名称,获取该参数的多个值.
  • Enumeration getParameterNames()

    获取所有请求参数的名字
  • Map<String,String[]> getParameterMap()

    返回请求参数组成的Map集合.

HttpServletResponse 常用方法

  • OutputStream getOutputStream():

    获取字节输出流:文件下载

  • Writer getWriter()

    获取字符输出流:输出内容

  • resp.setContentType("text/html;charset=utf-8")

    设置文件输出的编码格式和内容类型

  • resp.sendRedirect()

    302重定向,临时跳转

    301要使用另外的手段

Servlet 是单例的

解释

浏览器多次对Servlet的请求,一般情况下,服务器只创建一个Servlet对象,也就是说,Servlet对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。

每次访问请求对象和响应对象都是新的

对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service()方法再根据请求方式分别调用其他方法。

线程安全问题

当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。

原则

  1. 如果一个变量需要多个用户共享,则应当在访问该变量的时候,需要加锁
  2. 如果一个变量不需要共享,直接在 doGet() 或者 doPost()定义,这样不会存在线程安全问题

通过注解配置 Servlet

在之前的开发工作中,每次编写一个Servlet都需要在web.xml文件中进行配置

<servlet>
<servlet-name>ActionServlet</servlet-name>
<servlet-class>com.web.controller.ActionServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>ActionServlet</servlet-name>
<url-pattern>/servlet/ActionServlet</url-pattern>
</servlet-mapping>

而当一个项目中存在很多 Servlet,那么配置文件就会变得很乱很大,在 Servlet 3.0 推出之后,我们可以使用注解来配置 Servlet

@WebServlet(name = "ActionServlet", urlPatterns = "/servlet/ActionServlet")

Web 组件之间的跳转方式

请求转发(forward)

又叫做直接转发方式,客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。

比如:从 AServlet 请求转发到 BServlet

  • 语法:
request.getRequestDispatcher(path).forward(request, response);

参数:path,要跳转到的资源路径:上下文路径 / 资源路径

  • 特点:

    • 地址栏中的地址不变
    • 只有一个请求
    • 资源是共享的
    • 可以访问 WEB-INF 中的资源
    • 请求转发不能跨域访问

URl 重定向(redirect)

又叫做间接转发方式(Redirect)实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。

比如:从AServlet重定向到BServlet

  • 语法:
response.sendRedirect(String location);

参数:location,转发到的资源路径

  • 特点:

    • 地址栏中的地址【会】发生改变
    • 有两个请求
    • 在两个 Servlet 中不可以共享请求中的数据
    • 最终的响应由BServlet来决定,和 AServlet 没有关系
    • 不可以访问 WEB-INF 中的资源
    • 请求转发可以跨域访问

参考

Java-Servlet知识总结的更多相关文章

  1. Java Servlet完全教程

    Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servle ...

  2. Java Servlet 技术简介

    Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...

  3. 【Java】Java Servlet 技术简介

    Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么,它们是如何工作的,如何使用它们来创 ...

  4. JavaWeb之Java Servlet完全教程(转)

    Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servle ...

  5. Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  6. Java开发知识之Java入门

    Java开发知识之Java入门 一丶了解JAVA的版本 JAVA 有三个版本 JAVA SE: 标准版,开发桌面跟商务应用程序 JAVA SE 包括了Java的核心类库,集合,IO 数据库连接 以及网 ...

  7. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  8. Java面试知识1

    JAVA面试题集 基础知识: 1.C++或Java中的异常处理机制的简单原理和应用.     当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常.违反语义规则包括2 ...

  9. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  10. 黑马毕向东Java基础知识总结

    Java基础知识总结(超级经典) 转自:百度文库 黑马毕向东JAVA基础总结笔记    侵删! 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部 ...

随机推荐

  1. tomcat中配置jndi数据库源

    tomcat添加依赖 lib目录下添加依赖mysql-connector-java-8.0.16 配置数据源 介绍两种方法:tomcat中配置或web应用中配置 tomcat/conf/context ...

  2. wpa_supplicant 检测错误密码

    选好了 wifi ssid,填了密码,生成新配置文件,重启了wpa_supplicant,怎么知道输入的密码对不对,如果不对有什么体现? wpa_supplicant 前台运行时,打印信息中会有: W ...

  3. uwsgi 的app变量名称必须为application

    from myproject import app as application if __name__ == "__main__": application.run() 否则会提 ...

  4. git 上传 + 分支

    Git   上传 创建本地文件夹,更改为项目仓库(test) (1) 新建文件夹   test (2) 打开文件夹   git init 把项目添加到仓库内(test) (1) 复制项目到文件夹内 ( ...

  5. Feign String 参数 传递null 以及 空字符串问题

    笔记链接:https://app.yinxiang.com/fx/c82f6d74-3432-4703-83c8-5175f5986f97 备注 因为笔记在印象笔记上进行编辑,而且为Markdown格 ...

  6. Spark-2-性能监控方式

    1 Spark Web UI Spark提供了一些基本的Web监控页面,对于日常监控十分有用. 通过http://master:4040(默认端口是4040,可以通过spark.ui.port修改)我 ...

  7. Web服务器-服务器开发-返回固定页面的HTTP服务器(3.3.1)

    @ 目录 1.注意 2.代码 关于作者 1.注意 浏览器解析的时候偶\r\n才算一个换行符 发送的str要编码,这里使用的是utf8 其他的都和上一篇没有什么区别 这里主要返回的是固定的网址 2.代码 ...

  8. 手写算法-python代码实现KNN

    原理解析 KNN-全称K-Nearest Neighbor,最近邻算法,可以做分类任务,也可以做回归任务,KNN是一种简单的机器学习方法,它没有传统意义上训练和学习过程,实现流程如下: 1.在训练数据 ...

  9. 李宏毅机器学习课程笔记-2.5线性回归Python实战

    本文为作者学习李宏毅机器学习课程时参照样例完成homework1的记录. 任务描述(Task Description) 现在有某地空气质量的观测数据,请使用线性回归拟合数据,预测PM2.5. 数据集描 ...

  10. 10天,从.Net转Java,并找到月薪2W的工作(三)

    放弃Offer之后,压力一天比一天打 好点的公司,除了技术追根问底,还对你平时代码实践问的很多.比如问你,redis缓存一般设置多大.问你项目内容的细节,业务流程. 集合.锁.Jvm.多线程高并发.微 ...