2.javaWeb_请求和响应的处理(Request,Response)

2.请求和响应的处理

文章目录

一、动态资源和静态资源

  1. 静态资源:

    客户端发送请求到web服务器,web服务器从内存取到相应的文件,返回给客户端,客户端解析并渲染显示出来

  2. 动态资源: .jsp.asp/.aspx.php

    请求的资源先提交web服务器>>连接数据库处理,再将内容交给web服务器>>客户端

    动态资源需要在服务器端运行,响应给客户端是服务器端代码的运行结果

javax.servlet(包)

Servlet相关的接口都放在javax.servlet 包中,常用接口有:

接口 说明
Servlet 处理请求和发送响应的过程的Java技术
ServletConfig 在初始化的过程中由 Servlet容器使用
ServletContext 定义在Servlet用于获取来自其容器的信息的方法
ServletRequest 向服务器发送的请求信息
ServletResponse 客户端请求的响应
ServletInputStream 用于从客户端读取二进制数据
ServletOutputStream 用于将二进制数据发送到客户端

二、Servlet体系

1.简介

Servlet 是一个用 Java 编写的程序,此程序在服务器上运行以处理客户端请求,处理请求的过程如下:

  1. 接收客户端(浏览器)请求信息
  2. 调用业务处理
  3. 向客户端(浏览器)发送HTTP响应

2.HttpServlet

HttpServlet 类是一个抽象类,用以创建针对HTTP协议的 Servlet接口的实现类,它实现了service方法;

针对客户端不同的消息发送方式,分别调用doGet()、doPost()等方法,因此在继承HttpServlet时只需要覆盖doGet或doPost方法即可

3.Servlet生命周期

阶段 时机 调用的方法(钩子)
实例化 Servlet 容器创建 Servlet 的实例 默认构造方法
初始化 第一次向服务器发送请求或者服务器上没有servlet的时候,实例化之后 init(config)
服务 每次向服务器发送请求的时候 service()
销毁 服务停止的时候,项目重新加载的时候 destroy ()
不可用 销毁实例并标记为垃圾收集 等待GC回收

Servlet的生命周期可以归纳为以下几个阶段:

  1. 装载Servlet:这项操作一般是动态执行的。有些服务器提供了响应的管理功能,可以在启动的时候就装载Servlet并能够初始化特定的Servlet。

    只调用一次

    当web应用处于运行阶段时,特定的servlet被客户端首次请求访问。

    在web.xml文件中为servlet设置了<load-on-startup>元素

     <servlet>
     <servlet-name>servlet1</servlet-name>
     <servlet-class>servlet.servlet1</servlet-class>
     <load-on-startup>0</load-on-startup>
     </servlet>
    

    在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet。

    当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

    当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。正数的值越小,启动该servlet的优先级越高。

    当web应用被重新启动时,web应用中的所有servlet会在特定的时间被重新初始化。

  2. 创建一个Servlet实例。

  3. 调用Servlet的init()方法。

  4. 一个客户端的请求到达服务器。

  5. 创建一个请求对象。

  6. 创建一个响应对象。

  7. 激活Servlet的Service()方法,并传递请求和响应对象。

    多次调用执行

    在这个阶段servlet可以随时响应客户端的请求。当servlet容器接到访问特定的servlet请求时,servlet容器会创建针对与这个请求的servletRequest和servletResponse对象,然后调用service()方法,并把这两个对象当做参数传递给service()方法。Service()方法通过servletRequest对象获得请求信息,并处理该请求,再通过servletResponse对象生成响应结果。

    不管是post还是get方法提交,都会在service中处理,然后,由service来交由相应的doPost或doGet方法处理,如果你重写了service方法,就不会再处理doPost或doGet了,如果重写sevice()方法,可以自己转向doPost()或doGet()方法

    当servlet容器把servlet生成的响应结果发送给客户后,servlet容器会销毁servletRequest和sevletResponse对象。

  8. Service()方法获得关于请求对象的信息、处理请求、访问其它资源、获得需要的信息。

  9. Service()方法使用响应对象的方法,将响应传回服务器,最终到达客户端。

  10. 对于更多的客户端请求,服务器创建新的请求和响应对象,仍然激活此Servlet的Service()方法,将两个对象作为参数传递给它。

  11. 当服务器不再需要Servlet或当服务器关闭时,服务器将会调用Servlet的destroy()方法来销毁Servlet。

    只执行一次

    当Web应用被终止时,servlet容器会先调用web应用中所有的servlet对象的destroy()方法,然后在销毁servlet对象。此外容器还会销毁与servlet对象关联的servletConfig对象。

    在destroy()方法的实现中,可以释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。

三、Request对象

Request对象封装了客户端对服务器的请求信息

实现javax.servlet.http.HttpServletRequest接口

使用 HTTP 协议处理客户端的请求

1.ServletRequest

ServletRequest接口封装了客户端请求的细节。它与协议无关,并指定一个HTTP的子接口。

1)ServletRequest主要功能有:
  • 找出客户端的主机名和IP地址
  • 检索请求参数
  • 取得和设置属性
  • 取得输入、输出流
2)ServletRequest类的常用方法:
  • getAttribute(String name): 返回具有指定名称的请求属性,如果不存在则返回null。属性可由Servlet引擎设置或使用
  • setAttribute()显式加入。
  • getAttributeName(): 返回请求中所有属性名的枚举。如果不存在属性,则返回一个空的枚举。
  • getCharacteEncoding(): 返回请求所用的字符编码。
  • getInputStream()throws IOException: 返回与请求相关的(二进制)输入流。可以调用getInputStream()或getReader()方法。
  • getParameter(String name): 返回指定输入参数,如果不存在,返回null。
  • getParameterName(): 返回请求中所有参数名的一个可能为空的枚举。
  • getParameterValues(String name): 返回指定输入参数名的取值数组,如果取值不存在则返回null。

2.HttpServletRequest处理请求

HttpServletRequest类型的对象代表的是请求对象,父接口:ServletRequest

所在包为:javax.servlet.http

常用方法

  • getParameter: 得到客户端的请求参数信息
  • getMethod: 得到客户端的请求方式,返回GET或者POST
  • getRequestDispatcher: 得到请求转发器
  • setAtrribute(): 给请求范围中设置数据
  • getAttribute(): 取出请求范围的数据

四、Response对象

服务器端生成响应并发送给客户端

1.ServletResponse

ServletResponse将一个Servlet生成的结果传送到发出请求的客户端。ServletResponse操作主要是作为输出流及其内容类型和长度的包容器,它由Servlet引擎创建。

1)常用方法:
  • getCharacterEncoding(): 返回响应程序使用字符解码的名字。除非显式设置,否则为ISO-8859-1。
  • getOutputStream()throws IOException: 返回用于将返回的二进制输出写入客户端的流,此方法和getWrite()方法二者只能调用其一。
  • getWriter()throws IOException: 返回用于将返回的文本输出写入客户端的一个字符写入器,此方法和getOutputStream()二者只能调用其一。
  • setContentType(String type): 设置内容类型。在HTTPServlet中设置Content-Type头标。

2.HttpServletResponse处理响应

HttpServletResponse类型的对象代表的是响应对象,父接口ServletResponse;

HttpServletResponse代表了对客户端的Http的响应。它提供了表示状态码、状态信息和响应头标的方法,同时还负责对URL中写入一个Web页面的HTTP会话ID进行解码。JSP中的内建对象response是一个HttpServletResponse实例。

所在包为:javax.servlet.http

1)常用方法:
  • addCookie(Cookie cookie): 将一个Set-Cookie头标加入到响应。
  • setHeader(String name,String value): 设置具有指定名字和取值的一个响应头标。
  • encodeRedirectURL(String url): 如果客户端不知道接受cookie,则向URL加入会话ID。第一种形式只对在sendRedirect()中使用的URL进行调用。其它被编码的URL应被传递到encodeURL()中。
  • encodeURL(String url): 使用URL和一个SessionID重写这个URL。
  • sendRedirect(String location): 把响应发送到另一页面或者Servlet进行处理。
  • getWriter(): 该方法取得PrintWriter对象,来输出字符数据。
  • getOutputStream(): 该方法获得ServletOutputStream输出流。
  • setContentType(): 该方法设置响应的MIME类型。
    dRedirect(String location): 把响应发送到另一页面或者Servlet进行处理。
  • getWriter(): 该方法取得PrintWriter对象,来输出字符数据。
  • getOutputStream(): 该方法获得ServletOutputStream输出流。
  • setContentType(): 该方法设置响应的MIME类型。
  • setCharacterEncoding(String charset): 设置响应的字符编码类型。
相关推荐
转世成为计算机大神21 分钟前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_3273427342 分钟前
Java实现离线身份证号码OCR识别
java·开发语言
阿龟在奔跑2 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list
飞滕人生TYF2 小时前
m个数 生成n个数的所有组合 详解
java·递归
代码小鑫2 小时前
A043-基于Spring Boot的秒杀系统设计与实现
java·开发语言·数据库·spring boot·后端·spring·毕业设计
真心喜欢你吖2 小时前
SpringBoot与MongoDB深度整合及应用案例
java·spring boot·后端·mongodb·spring
激流丶2 小时前
【Kafka 实战】Kafka 如何保证消息的顺序性?
java·后端·kafka
周全全3 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
uzong3 小时前
一个 IDEA 老鸟的 DEBUG 私货之多线程调试
java·后端
AiFlutter3 小时前
Java实现简单的搜索引擎
java·搜索引擎·mybatis