javaWeb原理与运用深入浅出,赶紧收藏,入股不亏

大家好!我是未来村村长,就是那个“请你跟我这样做,我就跟你这样做!”的村长👨‍🌾!

一、从B/S架构到WEB服务器

1、B/S架构

(1) B/S架构

​ B/S架构即浏览器和服务器架构模式,是随着Internet技术的兴起,对C/S架构的一种变化或者改进的架构。B/S架构采取浏览器请求,服务器响应的工作模式。

  • 浏览器:用户通过浏览器向WEB发送请求,接收WEB服务器的响应结果
  • WEB服务器:WEB服务器统一请求后向数据库服务器发送访问数据库的请求,接收数据库服务器返回的结果,发送给浏览器客户端
  • 数据库服务器:对SQL语句进行处理,将返回的结果发送给WEB服务器
(2)请求原理

在这里插入图片描述

​ 如上图,用户输入URL后浏览器会通过DNS解析将其解析为IP地址和对应的端口号。根据IP地址,浏览器可以从互联网中找到对应的计算机,通过端口号可以找到对应的WEB服务器,从而通过TCP三次握手与WEB服务器建立连接。

​ 建立连接后,浏览器将请求打包为HTTP协议的格式发送给WEB服务器,WEB服务器接收到请求后执行相关的处理,将响应的结果以HTTP协议的格式发送给浏览器。浏览器接收到响应结果后,进行一定的处理展示给用户。再停止访问后,浏览器会断开与WEB服务器的连接。

  • IP地址【可看作酒店】:IP地址是[IP协议]提供的一种统一的[地址格式],它为互联网上的每一个网络和每一台[主机]分配一个[逻辑地址],以此来屏蔽[物理地址]的差异。
  • 端口号【可看作门牌号】:指TCP/IP协议的端口,用来区分不同的网络服务
  • HTTP协议:超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。

2、HTTP协议

(1)定义

​ 【Hyper Text Transfer Protocol】超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。

(2) HTTP请求响应步骤
  • 客户端连接WEB服务器
  • 客户端通过TCP套接字向WEB服务器发送一个文本的请求报文(请求行、请求头部、空行、请求数据)
  • 服务器接收请求并返回HTTP响应(状态行、响应头部、空行、响应数据),WEB服务器解析请求,定位请求资源,将请求资源副本写到TCP套接字,发送自客户端。
(3)HTTP请求方法

​ GET【只读】、HEAD、POST【提交】、PUT【上传】、DELETE【删除】、TRACE【测试诊断】、OPTIONS、CONNECT

(4) 响应状态码
分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误

例:404 NOT FOUND

3、三次握手,四次挥手

(1)TCP、HTTP、HTTPS、TCP\HTTP

​ TCP全称为Transmission Control Protocol(传输控制协议),是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议

​ HTTP的责任是去定义数据在两台计算机相互传递信息时每段数据以什么形式表达才是能够被另外一台计算机理解。而TCP所要规定的是数据应该怎么传输才能稳定且高效的传递在计算机之间

​ HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

​ TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,同时是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。 TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准

(2) 原理
① 三次牵手

在这里插入图片描述

  • 1、发送数据包(SYN=1,随机seq=J)给接收端,发送端进入SYN_SENT状态,等待接收端确认,
  • 2、受到数据包,知道请求建立连接,发送数据包(SYN=1,ACK=1,ack=J+1,随机seq=K),接收端进入SYN_RCVD状态,
  • 3、发送端收到数据包,检查ack是否等于J+1,ACK是否为1,发送数据包(ACK=1,ack=K+1),接收端收到数据包,检查ack是否等于K+1,ACK是否等于1。

注意:

​ 两次握手无法保障:服务端接收的数据是否失效、服务端不知道自己是否能成功发送消息。

​ TCP协议规定第一次握手和第二次握手的报文段不能携带数据,第三次握手的报文段可以携带数据。

② 四次分手

在这里插入图片描述

  • 1、客户端设置seq和 ACK ,向服务器发送一个 FIN(终结)报文段。此时,客户端进入 FIN_WAIT_1
  • 2、服务端收到了客户端发送的 FIN 报文段,向客户端回了一个 ACK 报文段。
  • 3、服务端向客户端发送FIN 报文段,请求关闭连接,同时服务端进入 LAST_ACK 状态。
  • 4、客户端收到服务端发送的 FIN 报文段后,向服务端发送 ACK 报文段,然后客户端进入 TIME_WAIT状态。服务端收到客户端的 ACK 报文段以后,就关闭连接
③ 含义说明
  • seq 序号:seq是作为发送方而言,所发送数据的第1个字节的序号。

  • ack 确认号:ack是作为接收方而言,期望接收到的下一个报文段的第1个字节的序号。

  • SYN 同步位:SYN=1就表示这是一个请求连接或接受连接的报文。

  • ACK 确认位:仅当确认位ACK=1时确认号ack才有效,当ACK=0时ack无效。

  • FIN终止位:当FIN=1,表示此报文段的发送者的数据已经发送完毕,请求释放连接。

4、WEB服务器

(1)定义

Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。Web服务器有Apache、 Nginx 、IIS、Tomcat等。

(2)TOMCAT

实现了JSP和Servlet规范的轻量级的服务器。

其核心组件:

名称功能
Web 容器完成 Web 服务器的功能( 如 HTTP/HTTPS 请求的接受和响应 )
Servlet 容器由名称为 catalina 的脚本来处理 Servlet 代码( 如从数据库中拿取数据给与前端 )
JSP 容器用于将 JSP 动态网页翻译成 Servlet 代码( index.html index.php index.jsp )
(3)Tomcat 请求处理过程

img

图源:图中水印

(4)Servlet、JSP、Servlet容器

参考-闷骚的程序员:https://zhuanlan.zhihu.com/p/42343690(写得好,建议看看)

最开始还没有JSP时,对于java开发的网页,浏览器通过Servlet的out.println方法来进行html的拼接,同时期的PHP已经实现在html页面中嵌入相应语言来引入动态数据,后来SUN公司就开发了JSP。JSP = HTML + Java片段(各种标签本质上还是Java片段),JSP本质是一个Java类(Servlet),是在服务器混的,只不过它输出结果是HTML。

等你写完JSP,回头访问时,Tomcat就把这个JSP翻译成Servlet,原先写在JSP里的HTML代码就自动放在了out.println()里啦!相当于程序帮我做了“逐行复制HTML代码到Servlet”这一步。

  • JSP:Java Server Page,直译就是“运行在服务器端的页面”,我们可以直接在JSP文件里写HTML代码,使用上把它当做HTML文件。
  • Servlet: 平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。
  • Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于 MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(如doGet()和doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP技术 推出后,管理和运行Servlet/JSP的容器也称为Web容器。

5、规范与协议

(1)Webapp与Web Server

Webapp由程序员开发,内置于WEB服务器中提供可通过ip地址和端口号等地址信息进行访问。WEB服务器有许多种类,Webapp也有多种,这时就需要JavaEE规范中的Servlet规范来统一。Webapp要根据Servlet规范进行开发,即继承和拓展Servlet类,服务器要提供Servlet容器进行对Servlet的管理。

(2)Browser与Web Server

浏览器与服务器要实现数据的传输,并让双方都能看懂,这个规范就是Http协议。

(3)Web Server与数据库服务器

服务器与数据库要实现连接和传输的协议为JDBC。

二、Servlet工作原理

参考菜鸟教程:https://www.runoob.com/servlet

1、 Servlet相关概念

(1)定义

​ Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

​ 广义上Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

简单来说,Servlet是sun公司开发动态Web的技术,是在API中提供的接口。但其定义了web应用的名字、路径、文件内容、目录结构等规范

  • WEB-INF
    • classes:存放java编译后的字节码文件
    • lib:用于放置第三方jar包
    • web.xml:webapp的配置文件,描述了请求路径与Servlet类之间的映射关系
(2)Servlet任务
  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
(3) Servlet生命周期

​ Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

  • Servlet 初始化后调用 init () 方法。
  • Servlet 调用 service() 方法来处理客户端的请求。
  • Servlet 销毁前调用 destroy() 方法。
  • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
① init()
public void init() throws ServletException {
  // 初始化代码...
}

Servlet 创建于用户第一次调用对应于该 Servlet 的URL时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

② service()
public void service(ServletRequest request, 
                    ServletResponse response) 
      throws ServletException, IOException{
}

service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

service() 方法由容器调用,service方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

③ doGet()
public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

GET 请求来自于一个URL的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

④ doPost()
public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

⑤ destoy()
  public void destroy() {
    // 终止化代码...
  }

destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。

(4)Servlet生命周期方法示例
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {
 
  private String message;

  public void init() throws ServletException
  {
      // 执行必需的初始化
      message = "Hello World";
  }

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html");

      // 实际的逻辑是在这里
      PrintWriter out = response.getWriter();
      out.println("<h1>" + message + "</h1>");
  }
  
  public void destroy()
  {
      // 什么也不做
  }
}

2、Servlet应用

​ 狭义上讲,servlet是servlet是java语言实现的一个类,Servlet的应用就是根据这个类进行相应的扩展开发:

  • 编写一个java类,继承HttpServlet类
  • 重写HttpServlet类的doGet方法和doPost方法
  • 配置web.xml文件,或者使用注解对servlet进行配置
(1)一个基本的Servlet实现
① 复习Servlet规范

​ Webapp根目录下必须有文件夹WEB-INF,它的文件目录如下:

  • classes:存放java编译后的字节码文件

  • lib:用于放置第三方jar包

  • web.xml:webapp的配置文件,描述了请求路径与Servlet类之间的映射关系

    使用集成开发环境进行Servlet开发时,集成开发环境会自动将我们编写的文件以规范的形式放到Tomcat中。

② 编写一个Servlet应用

​ 我们给一个普通的javaSE项目添加一个Web application的框架支持,然后再src目录下新建包:com.plord.javaweb.servlet,然后新建一个类,去实现Servlet类Project Structure中的Moudles添加相关jar,然后再service()方法中编写业务代码,此处我们进行JDBC业务代码的编写,随便回顾JDBC的连接。

​ 此处记得在WEB-INF中新建lib目录,将mysql-connecter的jar复制到该处(规范!)。

package com.plord.javaweb.servlet;

import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

public class DbServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {

        //设置响应内容
        servletResponse.setContentType("text/html");
        PrintWriter out = servletResponse.getWriter();

        //连接数据库
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            //注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //获取连接
            String url = "jdbc:mysql://localhost:3306/database";
            String user="root";
            String password="123456";
            conn = DriverManager.getConnection(url,user,password);
            //获取预编译的数据库操作对象
            String sql = "select id,name from powerhuman";
            ps = conn.prepareStatement(sql);
            //执行sql
            rs = ps.executeQuery();
            //处理结果集
            while(rs.next()){
                String id = rs.getString("id");
                String name = rs.getString("name");
                out.print("id" +id+ ":"+name+"<br>");
            }
        }catch(SQLException | ClassNotFoundException e){
            e.printStackTrace();
        }finally{
            if(rs != null){
                try {
                    rs.close();
                    ps.close();
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
③ 在web.xml中完成Servlet的注册

​ 注册目的:将请求路径与Servlet对应起来。

​ 我们需要注册servlet和其映射路径servlet-mapping,具体注册内容如下:

  • servlet-name:要注册的servlet类的名字
  • servlet-class:要注册类所在的文件路径
  • url-pattern:通过url访问的路径
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>DbServlet</servlet-name>
        <servlet-class>com.plord.javaweb.servlet.DbServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>DbServlet</servlet-name>
        <url-pattern>/select/powerhuman</url-pattern>
    </servlet-mapping>
    
</web-app>
④ 写一个简单的前端页面

​ html页面,不能放在WEB-INF目录中,只能放到与其同级目录下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SelectHuman</title>
</head>
<body>
<a href="/servlet/powerbuman">powerhuman list</a>
</body>
</html>
⑥ 将webapp应用放置到tomcat中

​ 通过IDEA的Add Configeration关联Tomcat服务器,左上角+号选择Tomcat。

  • Application server:已下载的Tomcat
  • URL:访问地址

在这里插入图片描述

​ 在Deployment中进行webapp的部署。

  • Application context:应用访问根路径

在这里插入图片描述

⑥ 启动,访问URL

​ 访问URL即可得到我们输出的页面信息。

(2)Servlet应用实现步骤总结
① 一些关于Servlet的分析

​ 我们可以看到,虽然上面只是一个Servlet的简单实现,却还原了浏览器-服务器-数据库服务器的三方交互访问,在我们书写的代码中,只有对Servlet接口的实现,并没有new一个对象并执行其方法。可见,我们只需要按照Servlet规范去编写相关文件,Tomcat容器会帮我们管理Servlet的生命周期。Spring中的容器也会起到这样一个作用,会大大简化我们的开发流程。注意的是,我们new的Servlet对象是不受容器管理的,WEB容器创建的Servlet会放到HashMap集合中。

​ 在未被访问时,Servlet对象不会被创建。若想要在tomcat启动时就创建对应的Servlet对象,需要在servlet标签中加load-on-startup标签,并赋值,值的大小代表Servlet创建的优先级,数字越小优先级越高。

<servlet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
<load-on-startup>0</load-on-startup>    
</servlet>
② 生命周期回顾
  • 用户发送第一次请求:Tomcat创建对应的Servlet对象,立即执行init()方法,随后执行service()方法
  • 用户后续发送请求:Servlet不再重新创建,重复调用service()方法。
  • 服务器(这里就是指WEB服务器)关闭时,Tomcat会调用destroy方法对Servlet进行内存销毁,Servlet对象的内存是再destory执行后被释放。浏览器关闭,并不会执行destroy()方法。
③ 编写Webapp一般流程
  • 创建webapp项目,创建lib文件夹,若使用第三方库将该jar复制到lib中

  • 修改环境配置文件:web.xml

  • 创建类继承抽象类HttpServlet,重写doget和dopost方法

  • 在web.xml中注册servlet和其映射路径

  • 更改tomcat中的Deployment,添加当前项目的Artifact(.war)进行访问

3、Servlet相关类

​ 由上,我们可以看见我们编写有一个Servlet需要实现Servlet接口需要重写很多方法,但我们只需要用到Service即可。所以就有了一个适配器GenericServlet类实现了Servlet和ServletConfig接口。HttpServlet类是专门为Http协议准备的,所以比GenericServlet类更适合Http协议下的开发。

​ 参照-刘扬俊:https://blog.csdn.net/qq_19782019/article/details/80292110

(1) ServletRequest与ServletResponse

​ 当服务器收到请求时,会创建一个ServletRequest对象,并创建一个ServletResponse对象,把它们作为参数传给Service( )方法。即使用Request来处理收到的请求信息,用Response来返回响应的信息。

  • ServletRequest:处理请求信息(请求行、请求头、请求正文)
  • ServletResponse:处理响应信息(响应行、响应头、响应正文)
(2) ServletConfig接口与ServletContext对象

在 Servlet 接口的 init()方法中有一个参数 ServletConfig,这个参数类型是个接口,里面是一些 在 web.xml 中对当前 Servlet类的配置信息。Servlet 规范将Servlet 的配置信息全部封装到了 ServletConfig 接口对象中。

​ 在tomcat调用 init()方法时,首先会将 web.xml中当前 Servlet 类的配置信息封装为一个对象。这个对象的类型实现了ServletConfig接口,Web容器会将这个对象传递给init()方法中的 ServletConfig参数,该对象有以下方法:

  • getInitParameter(): 获取指定名称的初始化参数值。
  • getInitParameterNames():获取当前 Servlet 所有的初始化参数名称。
  • getServletName():获取当前 Servlet 的中指定的 Servlet名称。
  • getServletContext():获取到当前 Servlet 的上下文对象 ServletContext

当Servlet容器初始化Servlet时,Servlet容器会给Servlet的init( )方式传入一个ServletConfig对象。 ServletContext对象表示Servlet应用程序。每个Web应用程序都只有一个ServletContext对象。通过在ServletConfig中调用getServletContext方法,也可以获得ServletContext对象。

因为一个Web应用中的所有Servlet共享一个ServletContext对象,因此ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。其中可以用setAttribute(String var1, Object var2);方法设置属性值,然后在另外一个servlet中使用getAttribute(String var1)获得属性值。

(3) GenericServlet

​ GenericServlet实现了Servlet和ServletConfig接口

(4) HttpServlet

​ HttpServlet是由GenericServlet抽象类扩展而来的,HttpServlet抽象类覆盖了GenericServlet抽象类中的Service( )方法,并且添加了一个自己独有的Service(HttpServletRequest,HttpServletResponse)方法。但是其并没有重写init方法,而是继续使用GenericServlet类的init方法。

​ HttpServlet重写的Service方法,会在每一次用户发起请求时被执行,该方法主要完成了ServletRequest和ServletResponse向下转型为HttpServletRequest和HttpServletResponse

​ HttpServlet中的service方法把接收到的ServletRequsest类型的对象转换成了HttpServletRequest类型的对象,把ServletResponse类型的对象转换成了HttpServletResponse类型的对象。

​ service方法中还是没有任何的服务逻辑,但是却在解析HttpServletRequest中的方法参数,并调用以下方法之一:doGet,doPost,doHead,doPut,doTrace,doOptions和doDelete。这7种方法中,每一种方法都表示一个Http方法。doGet和doPost是最常用的。

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
(5) HttpServletRequest与HttpServletResponse

​ HttpServletRequest与HttpServletResponse是ServletRequest和ServletResponse的接口继承,同样用于处理请求信息和响应信息,该类中封装了一些常用的方法。

​ 菜鸟教程列举了相关方法:https://www.runoob.com/servlet/servlet-server-response.html。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来村村长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值