JavaWeb-03三大组件之Servle程序

1.Servlet概念

[!tip]

Servlet 是 Java 语言编写的服务器端程序,用于扩展服务器功能的一种技术。它是基于 Java 的动态网页技术,能够处理客户端的请求并生成动态的网页内容。Servlet 运行在支持 Java Servlet 规范的 Web 服务器上,例如 Apache Tomcat、Jetty 等。

Servlet 主要用于处理 HTTP 请求和响应,可以动态生成 HTML、XML 或其他格式的数据。Servlet 技术提供了一种有效的方式来生成动态内容,与静态 HTML 文件不同,它可以根据用户请求的不同生成不同的响应。

Servlet 的生命周期由服务器管理,它包括初始化、服务和销毁等阶段。通过继承 HttpServlet 类并重写其中的方法,开发人员可以创建自己的 Servlet 类来处理特定的请求。

Servlet 技术通常与 JavaServer Pages (JSP) 结合使用,通过 JSP 可以方便地将 Java 代码嵌入到 HTML 页面中,实现更灵活和动态的内容生成。

2.web.xml

[!note]

在 Java Web 应用中,web.xml 文件是一个部署描述符(Deployment Descriptor),它用于配置 Web 应用的各种参数、Servlet、Filter、Listener 等组件,以及它们的映射关系。下面是常见的一些在 web.xml 文件中使用的标签以及它们的作用:

<?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>
        <servlet-name>MyServlet</servlet-name> <!-- Servlet 名称 -->
        <servlet-class>com.example.MyServlet</servlet-class> <!-- Servlet 类的全限定名 -->
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name> <!-- 对应的 Servlet 名称 -->
        <url-pattern>/myservlet/*</url-pattern> <!-- URL 映射路径 -->
    </servlet-mapping>

    <!-- Filter 配置 -->
    <filter>
        <filter-name>MyFilter</filter-name> <!-- Filter 名称 -->
        <filter-class>com.example.MyFilter</filter-class> <!-- Filter 类的全限定名 -->
    </filter>

    <filter-mapping>
        <filter-name>MyFilter</filter-name> <!-- 对应的 Filter 名称 -->
        <url-pattern>/myfilter/*</url-pattern> <!-- URL 映射路径 -->
    </filter-mapping>

    <!-- Listener 配置 -->
    <listener>
        <listener-class>com.example.MyListener</listener-class> <!-- Listener 类的全限定名 -->
    </listener>

    <!-- 初始化参数配置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name> <!-- 参数名称 -->
        <param-value>/WEB-INF/applicationContext.xml</param-value> <!-- 参数值 -->
    </context-param>

    <!-- 错误页面配置 -->
    <error-page>
        <error-code>404</error-code> <!-- 错误码 -->
        <location>/error.jsp</location> <!-- 错误页面路径 -->
    </error-page>

</web-app>

注释:

  • servlet: 定义一个 Servlet 组件。
  • servlet-name: Servlet 的名称。
  • servlet-class: Servlet 类的全限定名。
  • servlet-mapping: Servlet 映射到 URL 的路径配置。
  • url-pattern: URL 映射路径。
  • filter: 定义一个 Filter 组件。
  • filter-name: Filter 的名称。
  • filter-class: Filter 类的全限定名。
  • filter-mapping: Filter 映射到 URL 的路径配置。
  • listener: 定义一个 Listener 组件。
  • listener-class: Listener 类的全限定名。
  • context-param: 应用程序的上下文参数配置。
  • param-name: 参数名称。
  • param-value: 参数值。
  • error-page: 错误页面的配置。
  • error-code: 错误码。
  • location: 错误页面的路径。

3.Servlet中url如何定位到Servlet程序

在 Servlet 中,URL 如何定位到 Servlet 程序取决于 Servlet 容器的 URL 映射规则。Servlet 容器(如 Tomcat、Jetty 等)负责接收客户端的 HTTP 请求并将其路由到正确的 Servlet。

通常情况下,Servlet 容器通过以下方式将 URL 映射到 Servlet 程序:

  1. 基于 URL 路径的映射: Servlet 容器会根据请求的 URL 路径来查找对应的 Servlet。例如,如果某个 Servlet 的 URL 映射路径是 /example,那么当请求的 URL 是 http://example.com/example 时,Servlet 容器会将请求路由到对应的 Servlet 程序。

  2. 基于 URL 模式的映射: Servlet 容器支持使用 URL 模式来匹配 URL。URL 模式可以使用通配符,例如 /**.do。当请求的 URL 符合某个 URL 模式时,Servlet 容器会将请求路由到对应的 Servlet 程序。

这些 URL 映射规则可以通过以下两种方式配置:

  • web.xml 文件配置:web.xml 文件中使用 <servlet><servlet-mapping> 标签来配置 Servlet 的名称、类以及 URL 映射路径。
<servlet>
    <servlet-name>MyServlet</servlet-name> <!-- Servlet 名称 -->
    <servlet-class>com.example.MyServlet</servlet-class> <!-- Servlet 类的全限定名 -->
</servlet>

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name> <!-- 对应的 Servlet 名称 -->
    <url-pattern>/example</url-pattern> <!-- URL 映射路径 -->
</servlet-mapping>
  • 注解配置: 在 Servlet 类上使用 @WebServlet 注解来配置 Servlet 的 URL 映射路径。
@WebServlet("/example")
public class MyServlet extends HttpServlet {
    // Servlet 的实现代码
}

无论是通过 web.xml 配置还是通过注解配置,Servlet 容器都会根据请求的 URL 路径找到相应的 Servlet 程序进行处理。

4.Servlet生命周期

Servlet 生命周期方法是指在 Servlet 实例被创建、初始化、接收请求、销毁等过程中由 Servlet 容器调用的一系列方法。常见的 Servlet 生命周期方法包括:

  1. 执行构造器:

    • 第一次访问执行
  2. init() 方法:

    • 当 Servlet 容器第一次加载 Servlet 时调用。
    • 用于初始化 Servlet,通常用来执行一些初始化操作,例如读取配置文件、建立数据库连接等。
    • init() 方法只在 Servlet 实例创建时调用一次。
  3. service() 方法:

    • 每次接收到请求时都会被调用。
    • 用于处理客户端的请求,并生成响应。
    • Servlet 容器会调用 service() 方法并将请求和响应对象传递给它。
  4. doGet()、doPost()、doPut()、doDelete() 等 HTTP 方法:

    • service() 方法会根据请求的 HTTP 方法(GET、POST、PUT、DELETE 等)分发到对应的 doXxx() 方法。
    • 开发者可以根据实际需求重写这些方法来处理不同类型的请求。
  5. destroy() 方法:

    • 当 Servlet 实例被销毁时调用。
    • 用于释放 Servlet 占用的资源,例如关闭数据库连接、清理内存等。
    • destroy() 方法只在 Servlet 实例销毁时调用一次。

这些生命周期方法在 Servlet 的整个生命周期中起着重要作用,开发者可以根据实际需求重写这些方法来实现自定义的初始化、请求处理和资源释放逻辑。

[!important]

第1,2步是第一次访问的时候执行

5.Servlet请求分发

当你在浏览器中键入一个URL,比如 http://example.com/myapp/myservlet 时,这个请求首先到达Web服务器。Web服务器会查找与该URL匹配的应用程序,然后将请求传递给该应用程序。在Java Web应用程序中,这个应用程序通常就是Servlet容器,比如Tomcat。

在Servlet容器中,Servlet请求分发的工作开始了。以下是一个更详细的解释:

  1. 接收请求
    当用户在浏览器中输入URL并按下回车后,HTTP请求被发送到服务器。这个请求中包含了很多信息,比如请求的URL、请求方法(GET、POST等)、请求参数等。

  2. 匹配URL
    Servlet容器会检查请求的URL,以确定应该由哪个Servlet来处理。这个URL通常与在Servlet的映射中配置的URL模式进行匹配。例如,如果你的Servlet映射配置为 /myservlet/*,那么所有以 /myservlet/ 开头的URL都会被匹配到这个Servlet。

  3. 加载Servlet
    一旦确定了要处理请求的Servlet,Servlet容器会加载该Servlet的实例。如果该Servlet实例还没有被创建,容器会先创建一个实例。

  4. 调用Servlet的service方法
    一旦Servlet实例被加载,容器会调用该Servlet的 service() 方法,并传递HTTP请求对象(HttpServletRequest)和HTTP响应对象(HttpServletResponse)作为参数。在 service() 方法中,Servlet可以根据请求的方法(GET、POST等)和其他请求信息来执行相应的操作,比如读取请求参数、处理业务逻辑、生成响应等。

  5. 处理请求
    Servlet可以根据请求中的信息执行不同的操作。例如,如果是GET请求,Servlet可以读取查询参数并根据这些参数执行相应的操作;如果是POST请求,Servlet可以读取请求体中的数据并进行处理。

  6. 请求分发
    在某些情况下,Servlet可能需要将请求转发给其他Servlet或处理程序来处理。这可以通过RequestDispatcher来实现。例如,如果一个Servlet负责处理所有用户登录的请求,当用户登录成功后,可能需要将请求转发给另一个Servlet来显示用户的个人资料页面。

  7. 生成响应
    一旦Servlet完成了请求的处理,它会生成一个HTTP响应并将其发送回客户端。这个响应包含了HTTP状态码、响应头和响应体等信息,以及最终呈现给用户的内容。

这就是Servlet请求分发的基本流程。通过这种机制,Servlet容器能够根据不同的URL将请求路由到不同的Servlet,并实现灵活的请求处理逻辑。

6.创建Servlet三种方式

在Java中创建Servlet程序有三种主要的方式:

  1. 直接实现javax.servlet.Servlet接口

    • 创建一个Java类,实现javax.servlet.Servlet接口。
    • 实现接口中的方法,包括init()、service()和destroy()等。
    • 编译并将编译后的.class文件放置在Web应用程序的WEB-INF/classes目录下,或打包成.jar文件并放置在WEB-INF/lib目录下。
    • 在部署描述符(如web.xml)中配置Servlet的名称、URL映射等信息。
  2. 继承javax.servlet.GenericServlet抽象类

    • 创建一个Java类,继承javax.servlet.GenericServlet抽象类。
    • 重写父类中的方法,通常会重写service()方法来处理请求。
    • 编译并将编译后的.class文件放置在WEB-INF/classes目录下,或打包成.jar文件并放置在WEB-INF/lib目录下。
    • 在部署描述符中配置Servlet的名称、URL映射等信息。
  3. 继承javax.servlet.http.HttpServlet抽象类

    • 创建一个Java类,继承javax.servlet.http.HttpServlet抽象类。
    • 重写父类中的方法,通常会重写doGet()和doPost()等方法来处理不同类型的HTTP请求。
    • 编译并将编译后的.class文件放置在WEB-INF/classes目录下,或打包成.jar文件并放置在WEB-INF/lib目录下。
    • 在部署描述符中配置Servlet的名称、URL映射等信息。

以上三种方式都是创建Servlet程序的常用方式,开发者可以根据自己的需求和习惯选择其中一种方式来实现Servlet。

7.IDEA中快速创建Servlet

包名—>右键,新建—>Servlet

8.Servlet继承体系

  1. Servlet接口:这是所有Servlet类必须实现的接口。它定义了Servlet的基本行为和生命周期方法。主要方法包括:

    • init(ServletConfig config): 当Servlet被初始化时调用。在此方法中,Servlet可以执行一些初始化的操作。
    • service(ServletRequest req, ServletResponse res): 当Servlet接收到请求时,容器会调用此方法来处理请求。开发者需要在此方法中编写处理请求的逻辑。
    • destroy(): 当Servlet被销毁时调用。在此方法中,Servlet可以执行一些清理资源的操作。
  2. GenericServlet抽象类:这是Servlet接口的抽象实现类,它提供了Servlet接口的通用实现,可以被继承来创建自定义的Servlet。除了实现了Servlet接口中的方法外,GenericServlet还提供了以下方法:

    • init()destroy():这些方法提供了一个空的默认实现,可以在子类中覆盖以实现自定义的初始化和销毁逻辑。
    • getServletConfig(): 返回一个ServletConfig对象,该对象包含Servlet的配置信息。
    • getServletContext(): 返回一个ServletContext对象,该对象代表Servlet的上下文信息。
  3. HttpServlet抽象类:这是GenericServlet的子类,专门用于处理HTTP请求和响应。它提供了处理HTTP GET、POST、PUT、DELETE等请求的方法,如doGet()、doPost()等。HttpServlet类中的方法包括:

    • doGet(HttpServletRequest req, HttpServletResponse res):处理HTTP GET请求。
    • doPost(HttpServletRequest req, HttpServletResponse res):处理HTTP POST请求。
    • 其他HTTP方法对应的doXxx()方法:如doPut()、doDelete()等,用于处理相应的HTTP请求方法。

通过这个继承体系,开发人员可以根据需要来选择继承哪个类来实现自己的Servlet。

  • 如果需要处理HTTP请求和响应,就继承自HttpServlet;
  • 如果需要实现一般性的Servlet,可以继承自GenericServlet;
  • 如果需要完全自定义Servlet的行为,可以直接实现Servlet接口。

9.ServletConfig类

ServletConfig类是Servlet容器提供的一个接口,用于传递Servlet的配置信息给Servlet。它包含了Servlet的初始化参数以及与Servlet上下文相关的信息。主要功能包括:

  1. 获取初始化参数:通过ServletConfig可以获取在部署描述符(如web.xml)中配置的初始化参数。这些参数可以在Servlet的初始化阶段被访问到,以便Servlet在启动时进行必要的配置。常用方法包括:

    • String getInitParameter(String name): 根据参数名获取对应的参数值。
    • Enumeration<String> getInitParameterNames(): 获取所有初始化参数的参数名的枚举。
  2. 获取Servlet的名称:可以通过ServletConfig获取当前Servlet的名称,这个名称通常在部署描述符中配置。常用方法包括:

    • String getServletName(): 获取当前Servlet的名称。
  3. 获取ServletContext对象:ServletConfig还提供了获取ServletContext对象的方法,通过这个对象,Servlet可以获取与Servlet上下文相关的信息。常用方法包括:

    • ServletContext getServletContext(): 获取ServletContext对象。

ServletConfig对象在Servlet的初始化阶段被传递给Servlet的init()方法,开发者可以在init()方法中获取ServletConfig对象,并通过它获取初始化参数或ServletContext对象来进行必要的配置和操作。

总之,ServletConfig类提供了一种在Servlet初始化阶段获取Servlet配置信息的方式,使得开发者可以在Servlet启动时对其进行必要的配置。

10.ServletContext接口

ServletContext是Java Servlet规范中的一个重要接口,代表着Servlet容器与Web应用程序之间的通信管道。它提供了访问Web应用程序环境的方法,包括配置参数、资源、会话管理等。以下是ServletContext的详细介绍:

  1. 作用范围

    • ServletContext对象是在整个Web应用程序生命周期中有效的,每个Web应用程序都有一个对应的ServletContext实例。
    • 它是Servlet容器为每个部署的Web应用程序创建的,可以通过ServletContext来访问与该应用程序相关的各种信息和资源。
  2. 功能特性

    • 配置参数访问:可以使用ServletContext对象获取部署描述符(如web.xml)中配置的初始化参数。
    • 资源访问:可以获取Web应用程序中的各种资源,如文件、图片等。
    • 会话管理:可以创建和管理会话对象,跟踪用户的状态。
    • 请求调度器:可以将请求转发到其他Servlet或JSP页面。
    • 上下文信息:提供了关于Web应用程序的一般信息,如应用程序名称、服务器信息等。
    • 日志记录器:可以使用ServletContext对象记录日志信息。
  3. 获取ServletContext对象

    • 在Servlet中可以通过getServletContext()方法获取ServletContext对象。
    • 在监听器、过滤器等Web组件中也可以通过ServletContextEvent事件对象获取ServletContext对象。
  4. 部署描述符中的ServletContext配置

    • 可以在部署描述符中配置ServletContext的初始化参数,以及其他与Web应用程序相关的配置信息。
    • 这些配置信息可以在ServletContext对象中被访问到,以供应用程序在运行时使用。

ServletContext是Servlet开发中非常重要的一部分,它为开发者提供了与Web应用程序环境交互的接口,使得开发者能够更好地管理和控制应用程序的行为。

ServletContext对象是一个域对象,它是Servlet规范中定义的一种用于在Web应用程序中共享信息的机制。在Java Servlet中,域对象可以存储和检索数据,并且在特定的范围内共享这些数据。

ServletContext对象是在整个Web应用程序中共享的,因此存储在其中的数据可以在整个应用程序中被访问到。这使得ServletContext成为了一种在不同Servlet、监听器、过滤器等组件之间共享信息的重要方式。

在ServletContext中存储的数据可以通过以下方法来访问:

  • setAttribute(String name, Object value): 将对象存储在ServletContext中,以指定的名称标识。
  • getAttribute(String name): 根据名称检索存储在ServletContext中的对象。
  • removeAttribute(String name): 根据名称移除存储在ServletContext中的对象。

ServletContext对象提供了一种在整个Web应用程序中共享数据的机制,使得不同组件之间能够进行数据交换和共享,从而实现更灵活和高效的应用程序开发。

作用:

ServletContext对象是Java Servlet中的一个重要接口,主要用于在整个Web应用程序中共享信息。它的作用包括:

  1. 共享数据:允许在不同的Servlet、过滤器、监听器等组件之间共享数据。

  2. 获取应用程序级别的配置信息:提供访问部署描述符中的初始化参数和动态设置的属性的方式。

  3. 访问Web应用程序资源:允许访问Web应用程序中的资源,如HTML文件、JSP文件、图片等。

  4. 会话管理:可以创建和管理会话,跟踪用户的会话状态,并在需要时共享会话数据。

  5. 请求调度和重定向:允许将请求调度到其他Servlet或JSP页面,进行重定向操作,实现请求的处理流程控制和页面的跳转。

  6. 提供应用程序级别的日志记录:提供日志记录器,用于记录应用程序级别的日志信息。

总的来说,ServletContext对象提供了一个全局的环境,使得不同组件能够共享信息、访问资源、管理会话等,从而实现了Web应用程序的功能和交互。

11.HTTP协议

1.什么是http协议

HTTP(超文本传输协议)是一种用于传输超媒体文档(例如HTML)的应用层协议。它是互联网上数据传输的基础之一,通常用于在客户端和服务器之间传输网页、图像、音频、视频等资源。

HTTP使用客户端-服务器模型,客户端发送HTTP请求,服务器则发送HTTP响应。请求由请求行(包括请求方法、请求URI和HTTP版本)、请求头部(包含关于客户端和请求的其他信息)和可选的消息体(例如表单数据或上传的文件)组成。响应由状态行(包括HTTP版本、状态码和状态消息)、响应头部(包含关于响应的其他信息)和可选的消息体(例如HTML文档或图片)组成。

HTTP的版本包括HTTP/1.0、HTTP/1.1和HTTP/2。HTTP/1.1是当前广泛使用的版本,它引入了持久连接(HTTP Keep-Alive)以减少连接建立的开销,还支持管道化请求以提高性能。HTTP/2则进一步改进了性能,引入了多路复用、头部压缩等功能。

HTTP是一个无状态协议,这意味着每个请求都是独立的,服务器不会在请求之间保留任何状态信息。为了实现状态管理,通常使用Cookie或Session来跟踪客户端的会话信息。

除了常见的GET和POST请求方法,HTTP还支持其他方法,如PUT(用于上传资源)、DELETE(用于删除资源)、HEAD(类似于GET,但只返回响应头部而不返回实体主体)等。

总的来说,HTTP是网络通信的基础,它使得网页、图像、视频等资源可以在全球范围内快速、高效地传输和访问。

2.GET请求

请求行

请求行内容说明
请求方法GET
请求URI资源的路径
HTTP版本HTTP/1.1 或 HTTP/2

请求头部

key:value

请求头说明示例值
Accept指示客户端可以处理的媒体类型及其优先级text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Charset指示客户端可以处理的字符集及其优先级UTF-8, ISO-8859-1
Accept-Encoding指示客户端可以处理的内容编码及其优先级gzip, deflate, br
Accept-Language指示客户端可以处理的自然语言及其优先级en-US, en;q=0.9, zh-CN;q=0.8
Connection控制是否保持连接和用什么方式保持连接keep-alive, close
Cookie客户端的Cookiesessionid=abc123; user_id=123
Host请求的服务器主机名www.example.com
User-Agent发送请求的用户代理(浏览器)信息Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36

请求体

在GET请求中,通常不存在请求体。GET请求主要用于从服务器获取资源,而不是向服务器发送数据。因此,大多数情况下,请求体为空。

(在这里写请求体内容,如果有的话)

GET请求通常不包含请求体。

3.POST请求

请求行

请求行内容说明
请求方法POST
请求URI资源的路径
HTTP版本HTTP/1.1 或 HTTP/2

请求头部

请求头说明示例值
Accept指示客户端可以处理的媒体类型及其优先级text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Charset指示客户端可以处理的字符集及其优先级UTF-8, ISO-8859-1
Accept-Encoding指示客户端可以处理的内容编码及其优先级gzip, deflate, br
Accept-Language指示客户端可以处理的自然语言及其优先级en-US, en;q=0.9, zh-CN;q=0.8
Connection控制是否保持连接和用什么方式保持连接keep-alive, close
Content-Length请求体的长度(以字节为单位)348
Content-Type请求体的MIME类型application/x-www-form-urlencoded
Cookie客户端的Cookiesessionid=abc123; user_id=123
Host请求的服务器主机名www.example.com
User-Agent发送请求的用户代理(浏览器)信息Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36

请求体

在POST请求中,请求体通常包含向服务器提交的数据,常见的数据格式有表单数据、JSON数据等。

(在这里写请求体内容,如果有的话)

POST请求的请求体内容可以是表单数据、JSON数据等,具体内容根据实际情况而定。

常用请求头

请求头说明示例值
Accept指示客户端能够处理的媒体类型及其优先级text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Charset指示客户端能够处理的字符集及其优先级UTF-8, ISO-8859-1
Accept-Encoding指示客户端能够处理的内容编码及其优先级gzip, deflate, br
Accept-Language指示客户端能够处理的自然语言及其优先级en-US, en;q=0.9, zh-CN;q=0.8
Connection控制是否保持连接和用什么方式保持连接keep-alive, close
Content-Length请求体的长度(以字节为单位)348
Content-Type请求体的MIME类型application/x-www-form-urlencoded
Cookie客户端的Cookiesessionid=abc123; user_id=123
Host请求的服务器主机名www.example.com
User-Agent发送请求的用户代理(浏览器)信息Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36

这些请求头用于指示客户端的能力和偏好,以及向服务器传递与请求相关的其他信息。

请求分类

GET请求:

  1. 浏览器地址栏输入地址并回车:用户在浏览器地址栏中输入网址并按下回车键,浏览器会发送一个GET请求给服务器以获取相应的资源。

  2. 超链接点击:当用户点击页面上的超链接时,浏览器会发送一个GET请求以获取链接指向的资源。

  3. 表单的method属性为GET:当表单的提交方法为GET时,表单中的数据会被附加到URL的查询字符串中,并以GET请求发送到服务器。

  4. Ajax请求:虽然Ajax请求可以使用任何HTTP方法,但GET请求在某些情况下也很常见,例如在不需要向服务器提交数据而只需要获取数据时。

  5. 图片、样式表、脚本等资源请求:当页面中包含外部资源(如图片、CSS文件、JavaScript文件)时,浏览器会使用GET请求来获取这些资源。

  6. 页面预加载:一些现代浏览器在页面加载过程中可能会发送预加载请求(例如使用),这些请求通常是GET请求。

  7. 资源获取请求:例如,某些Web框架或应用程序可能会使用GET请求来获取特定的资源,如获取用户信息、文章内容等。

POST请求:

  1. 表单提交:当用户在网页上填写表单并点击提交按钮时,通常会触发一个POST请求,将表单中的数据提交给服务器进行处理。
  2. Ajax请求:在Web应用中,通过JavaScript发起的异步请求通常使用POST方法,以将数据发送给服务器并获取响应。
  3. 文件上传:当用户选择文件并上传时,通常会使用POST请求将文件数据发送给服务器进行处理。
  4. API调用:在RESTful API中,POST请求通常用于创建新资源或执行某些操作,如创建新用户、发布文章等。

响应格式

响应行

响应行内容说明
HTTP版本HTTP/1.1 或 HTTP/2
状态码表示请求处理的结果
状态消息对状态码的简要描述

响应头部

响应头说明示例值
Content-Type响应体的MIME类型text/html; charset=UTF-8
Content-Length响应体的长度(以字节为单位)348
Content-Encoding响应体的编码方式gzip, deflate
Content-Language响应体的自然语言en-US, en
Cache-Control控制缓存的行为max-age=3600
Expires响应的过期时间Thu, 01 Dec 2022 16:00:00 GMT
Last-Modified资源的最后修改时间Tue, 01 Dec 2022 16:00:00 GMT
Location重定向URLhttps://www.example.com/new-location
Set-Cookie服务器发送的Cookiesessionid=abc123; Expires=Wed, 09 Jun 2023 10:18:14 GMT; HttpOnly; Secure
Server服务器软件信息Apache/2.4.29 (Ubuntu)
Date响应的日期和时间Tue, 01 Dec 2022 16:00:00 GMT

响应体

在HTTP响应中,响应体包含了服务器返回的实际数据,例如HTML文档、JSON数据、图片等内容。

(在这里写响应体内容,如果有的话)

这些部分构成了一个完整的HTTP响应,其中响应行包含了HTTP版本、状态码和状态消息,响应头部包含了与响应相关的其他信息,而响应体则包含了实际的响应数据。

响应状态码

HTTP响应状态码是服务器对客户端请求的处理结果进行回应的一种标识,以下是一些常见的HTTP响应状态码及其含义:

状态码含义说明
200OK请求成功,服务器已成功处理请求。
201Created已创建。通常在POST请求成功创建了新资源时返回此状态码。
204No Content无内容。服务器成功处理请求,但未返回任何内容。通常用于DELETE请求成功删除资源的情况。
301Moved Permanently永久重定向。请求的资源已被分配了新的URL,客户端应该使用新的URL进行后续的请求。
302Found临时重定向。请求的资源已被分配了新的URL,但这种重定向是临时的。
304Not Modified未修改。客户端缓存的资源仍有效,服务器返回此状态码表示资源未被修改,可以继续使用缓存。
400Bad Request请求错误。客户端发送的请求有错误,服务器无法处理。
401Unauthorized未授权。请求需要身份验证。
403Forbidden禁止访问。服务器拒绝请求。
404Not Found未找到。服务器无法找到请求的资源。
405Method Not Allowed方法不被允许。请求中指定的方法不被服务器允许。
500Internal Server Error服务器内部错误。服务器遇到了意料不到的情况,无法完成请求。
501Not Implemented未实现。服务器不支持客户端请求的功能。
503Service Unavailable服务不可用。服务器当前无法处理请求,通常是因为服务器过载或维护。

MIME类型说明

MIME(Multipurpose Internet Mail Extensions)类型是一种标识Internet上媒体类型的方法。它在HTTP协议中被广泛使用,用于指示传输的数据的类型。以下是一些常见的MIME类型及其说明:

MIME类型说明示例文件扩展名
text/htmlHTML文档.html, .htm
text/plain普通文本.txt
text/css层叠样式表(CSS).css
application/javascriptJavaScript文件.js
application/jsonJSON数据.json
application/xmlXML数据.xml
image/jpegJPEG图像.jpeg, .jpg
image/pngPNG图像.png
image/gifGIF图像.gif
image/svg+xmlSVG图像.svg
audio/mpegMPEG音频.mp3
audio/oggOgg音频.ogg
video/mp4MPEG-4视频.mp4
video/webmWebM视频.webm
application/pdfPDF文档.pdf
application/vnd.ms-excelMicrosoft Excel文档.xls, .xlsx
application/mswordMicrosoft Word文档.doc, .docx
application/vnd.openxmlformats-officedocument.wordprocessingml.documentMicrosoft Word(OpenXML格式)文档.docx
application/zipZIP归档文件.zip
application/octet-stream二进制流数据,通常用于下载未知文件类型的情况

这些MIME类型用于标识不同类型的文件或数据,使得客户端和服务器能够正确地解析和处理数据。

12.HttpServletRequest类

请求

方法说明
getParameter(String name)获取请求参数的值。如果存在多个同名参数,只返回第一个值。
getParameterValues(String name)获取请求参数的所有值,如果存在多个同名参数。
getParameterMap()获取所有请求参数的Map集合,参数名作为键,参数值作为值。
getHeader(String name)获取指定请求头的值。
getHeaders(String name)获取指定请求头的所有值。
getHeaderNames()获取所有请求头的名称。
getMethod()获取请求的HTTP方法(GET、POST等)。
getRequestURL()获取请求的URL(不包括查询参数)。
getRequestURI()获取请求的URI(相对于Servlet容器)。
getRemoteAddr()获取客户端的IP地址。
getRemoteHost()获取客户端的主机名。
getSession(boolean create)获取与请求关联的会话对象,如果不存在会话则根据参数决定是否创建新会话。
getAttribute(String name)获取请求属性的值。
setAttribute(String name, Object value)设置请求属性的值。
getInputStream()获取请求体的输入流。适用于POST请求。
getReader()获取请求体的字符流。适用于POST请求。
getParts()获取请求中的所有部件。适用于处理文件上传。
getPart(String name)获取指定名称的请求部件。适用于处理文件上传。
getCookies()获取客户端发送的所有Cookie。
setCharacterEncoding(“UTF-8”)处理中文乱码

13.请求转发

req.getRequestDispatcher("/forward2").forward(req, resp);

请求转发的特点:

  1. 服务器内部处理: 请求转发是在服务器内部进行的,客户端浏览器不知道请求被转发到了另一个资源。因此,对于客户端来说,这是无感知的。

  2. 单次请求-响应周期: 请求转发在单个请求-响应周期内完成。在同一次请求中,服务器可以将请求转发到另一个Servlet或JSP页面,然后将最终结果发送回客户端。

  3. 共享相同的请求对象: 在请求转发过程中,转发的Servlet和原始的Servlet共享同一个HttpServletRequest对象。这意味着转发的Servlet可以访问原始请求中的参数、头信息等。

  4. 资源共享: 请求转发的目标可以是同一Web应用程序中的任何Servlet或JSP页面,因此它们可以共享相同的上下文和资源,例如ServletContext属性和会话信息。

  5. 性能优势: 相比于客户端重定向,请求转发通常更高效,因为它避免了客户端和服务器之间的额外通信和HTTP请求-响应往返。

  6. 访问受限资源: 由于请求转发是在服务器内部进行的,因此可以用于访问受限的资源,例如位于受保护区域的Servlet或JSP页面,而无需将敏感信息暴露给客户端。

  7. 上下文切换: 请求转发允许在不切换用户的Web浏览器的情况下,在同一Web应用程序内部导航到不同的资源。

[!important]

  1. 转发是服务器行为
  2. 转发是浏览器只做了一次访问请求
  3. 转发浏览器地址不变
  4. 转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递
  5. 转发只能将请求转发给同一个web应用中的组件

14.base标签

<base> 标签是HTML中的一个元素,用于指定文档中所有相对链接的默认 URL 或目标。它没有结束标签,而是以单标签形式出现在文档的 <head> 部分。

以下是 <base> 标签的一些特点和用法:

  1. 指定基本链接: <base> 标签用于指定所有相对链接的基本 URL。这意味着所有未指定完整 URL 的链接(如 <a><img><link><script> 等元素中的 hrefsrc 属性)将相对于指定的基本 URL 进行解析。

  2. 仅应用于相对链接: <base> 标签只会影响到未包含完整 URL 的链接,对于已经包含完整 URL 的链接则不会产生影响。

  3. 仅允许一个 <base> 标签: 在文档中只能出现一个 <base> 标签。如果出现多个,通常只有第一个 <base> 标签会生效。

  4. 格式: <base> 标签通常位于文档的 <head> 部分,格式为 <base href="URL" target="目标窗口名称">href 属性用于指定基本 URL,target 属性用于指定默认的目标窗口(可选)。

  5. 优先级: 如果页面中存在 <base> 标签,则其中的 href 属性会覆盖所有相对链接的基础 URL。这意味着即使在 HTML 内容中使用了绝对路径,也会以 <base> 标签中指定的 URL 为准。

通过使用 <base> 标签,可以简化文档中的相对链接,并且方便地统一管理网站中的链接结构。

用法:

使用 <base> 标签来简化文档中的相对链接和统一管理网站中的链接结构非常简单。以下是使用 <base> 标签的步骤:

  1. 确定基础 URL: 首先,确定你希望作为相对链接的基础 URL。这通常是你网站的根路径或者其他你希望链接相对于的特定路径。

  2. 在文档的 <head> 部分添加 <base> 标签: 在 HTML 文档的 <head> 部分中,添加一个 <base> 标签,并设置 href 属性为你确定的基础 URL。例如:

    <head>
        <base href="http://www.example.com/" />
        <!-- 其他头部内容 -->
    </head>
    
  3. 使用相对链接: 现在,你可以在文档中使用相对链接了。这些链接将会相对于 <base> 标签中指定的基础 URL 进行解析。例如,假设你想链接到你网站根目录下的一个页面,你可以这样做:

    <a href="about.html">关于我们</a>
    

    在这个例子中,链接将会解析为 http://www.example.com/about.html

15.HttpServletResponse类

它代表了 Servlet 容器对客户端发起的 HTTP 请求所做出的响应

两种响应流

HttpServletResponse 类提供了两种主要的响应流,分别用于向客户端发送响应数据:

  1. 字符流(PrintWriter)PrintWriter getWriter() 方法返回一个 PrintWriter 对象,用于向客户端发送字符数据。通常用于发送文本、HTML、JSON 等内容。示例用法如下:
PrintWriter out = response.getWriter();
out.println("Hello, world!");
out.close();
  1. 字节流(ServletOutputStream)ServletOutputStream getOutputStream() 方法返回一个 ServletOutputStream 对象,用于向客户端发送字节数据。通常用于发送文件、图像、二进制数据等内容。示例用法如下:
ServletOutputStream out = response.getOutputStream();
byte[] data = // 从某处获取字节数据
out.write(data);
out.close();

这两种流可以根据需要灵活选择。通常情况下,如果要发送文本数据,推荐使用字符流(PrintWriter);如果要发送二进制数据或文件等内容,推荐使用字节流(ServletOutputStream)。在实际开发中,根据需要选择适合的响应流,并使用其提供的方法向客户端发送响应数据。

16.请求重定向

当您在Java Servlet中需要执行请求重定向时,您可以使用HttpServletResponse对象的sendRedirect()方法。重定向将客户端浏览器重定向到一个新的URL,这意味着浏览器将向新的URL发送一个新的请求。

下面是一个详细的示例,展示了如何在Servlet中执行请求重定向:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/RedirectServlet")
public class RedirectServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置重定向的目标URL
        String redirectURL = "http://example.com/new_location";
        
        // 执行重定向
        response.sendRedirect(redirectURL);
    }
}

在上面的示例中:

  1. 我们创建了一个名为RedirectServlet的Servlet类,并使用@WebServlet注解将其映射到URL路径/RedirectServlet
  2. doGet()方法中,我们获取了HttpServletRequestHttpServletResponse对象。
  3. 我们设置了要重定向到的目标URL,即http://example.com/new_location
  4. 最后,我们使用HttpServletResponse对象的sendRedirect()方法将请求重定向到目标URL。

当浏览器请求/RedirectServlet时,Servlet会发送一个包含重定向指令的响应,告诉浏览器将页面重定向到http://example.com/new_location。然后,浏览器将向新的URL发出新的请求,并加载该页面。

这就是在Java Servlet中执行请求重定向的基本原理和实现方法。

请求重定向特点:

请求重定向是Web开发中常用的一种技术,它具有以下几个特点:

  1. 客户端行为: 请求重定向是由服务器发送给客户端的指令,告诉客户端浏览器在接收到响应后执行重定向。客户端浏览器会自动向新的URL发送新的请求,完成页面跳转。

  2. 状态码: 请求重定向通常使用HTTP状态码,最常见的是302 Found303 See Other。这些状态码告诉客户端浏览器,请求的资源已经被临时或者永久移动到了另一个位置。

  3. URL变更: 请求重定向会导致浏览器地址栏中的URL发生变化,显示新的目标URL。这意味着用户可以清楚地看到页面跳转到了哪里。

  4. 无法保留请求信息: 由于重定向会导致浏览器发送一个全新的请求,因此原始请求中的参数、表单数据等信息无法被保留。如果需要保留这些信息,可以使用其他技术,如请求转发。

  5. 跨域限制: 请求重定向可能受到浏览器的跨域限制。如果重定向到了不同域名下的URL,浏览器可能会执行跨域检查,从而导致一些安全性问题。

  6. 搜索引擎处理: 对于搜索引擎爬虫来说,请求重定向会影响页面的搜索引擎优化(SEO)。重定向可能会影响页面的排名和索引,因此在设计网站时需要考虑到这一点。

[!important]

重定向是客户端行为

重定向是浏览器做了至少两次请求

重定向浏览器地址改变

重定向两次跳转之间传输的信息回丢失(request范围)

重定向可以指向任何的资源,包括当前应用程序中的其他资源。同一站点上的其他应用程序中的资源,其他站点的资源。

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

[猫玖]

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

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

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

打赏作者

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

抵扣说明:

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

余额充值