快速掌握————>Servlet

1. Servlet

ServletServlet 的简称,是使用 Java 语言编写的运行在服务器端的程序。具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

  1. Servlet 主要用于处理客户端传来的 HTTP 请求,并返回一个响应,它能够处理的请求有 doGet() 和 doPost() 等。
  2. Servlet 由 Servlet 容器提供,Servlet 容器是指提供了 Servlet 功能的服务器(如 Tomcat)。
  3. Servlet 容器会将 Servlet 动态加载到服务器上,然后通过 HTTP 请求和 HTTP 应与客户端进行交互。

Servlet 的请求首先会被 HTTP 服务器(如 Apache)接收,HTTP 服务器只负责静态 HTML 页面的解析,而 Servlet 的请求会转交给 Servlet 容器,Servlet 容器会根据 web.xml 文件中的映射关系,调用相应的 Servlet,Servlet 再将处理的结果返回给 Servlet 容器,并通过 HTTP 服务器将响应传输给客户端。

1)方便

Servlet 提供了大量的实用工具例程,如处理很难完成的 HTML 表单数据、读取和设置 HTTP 头,以及处理 Cookie 和跟踪会话等。

2)跨平台

Servlet 使用 Java 类编写,可以在不同的操作系统平台和不同的应用服务器平台运行。

3)灵活性和可扩展性强

采用 Servlet 开发的 Web 应用程序,由于 Java 类的继承性及构造函数等特点,使得应用灵活,可随意扩展。

2. 在 Servlet 接口

2.1)5 个抽象方法

方法声明 功能描述
void init(ServletConfig config) 容器在创建好 Servlet 对象后,就会调用此方法。该方法接收一个 ServletConfig 类型的参数,Servlet 容器通过该参数向 Servlet 传递初始化配置信息
ServletConfig getSendetConfig() 用于获取 Servlet 对象的配置信息,返回 Servlet 的 ServletConfig 对象
String getServletInfo() 返回一个字符串,其中包含关于 Servlet 的信息,如作者、版本和版权等信息
void service (ServletRequest request,ServletResponse response) 负责响应用户的请求,当容器接收到客户端访问 Servlet 对象的请求时,就会调用此方法。 容器会构造一个表示客户端请求信息的 ServletRequest 对象和一个用于响应客户端的 ServletResponse 对象作为参数传递给 service() 方法。 在 service() 方法中,可以通过 ServletRequest 对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用 ServletResponse 对象的方法设置响应信息
void destroy() 负责释放 Servlet 对象占用的资源。当服务器关闭或者 Servlet 对象被移除时,Servlet 对象会被销毁,容器会调用此方法

2.2)针对 Servlet 的接口,

Sun 公司提供了两个默认的接口实现类:GenericServletHttpServlet

GenericServlet

​ 是一个抽象类,该类为 Servlet 接口提供了部分实现,它并没有实现 HTTP 请求处理。

HttpServlet

​ 是 GenericServlet 的子类,它继承了 GenericServlet 的所有方法,并且为 HTTP 请求中的 GET 和 POST 等类型提供了具体的操作方法。通常情况下,编写的 Servlet 类都继承自 HttpServlet

方法声明 功能描述
protected void doGet (HttpServletRequest req, HttpServletResponse resp) 用于处理 GET 类型的 HTTP 请求的方法
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 用于处理 POST 类型的 HTTP 请求的方法

2.3)HttpServlet 主要有两大功能

  1. 根据用户请求方式的不同,定义相应的 doXxx() 方法处理用户请求。例如,与 GET 请求方式对应的 doGet() 方法,与 POST 方式对应的 doPost() 方法。
  2. 通过 service() 方法将 HTTP 请求和响应分别强转为 HttpServletRequestHttpServletResponse 类型的对象。

3. Servlet生命周期详解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-74tAQ4fv-1625925452558)(Q:\imaga\2.png)]

3.1)初始化阶段

当客户端向 Servlet 容器发出 HTTP 请求要求访问 Servlet 时

​ Servlet 容器首先会解析请求,检查内存中是否已经有了该 Servlet 对象

如果有,则直接使用该 Servlet 对象

如果没有,则创建 Servlet 实例对象,然后通过调用 init() 方法实现 Servlet 的初始化工作

注意,在 Servlet 的整个生命周期内,它的 init() 方法只能被调用一次

3.2)运行阶段

1.这是 Servlet 生命周期中最重要的阶段,在这个阶段中

​ 1. Servlet 容器会为这个请求创建代表 HTTP 请求的 ServletRequest 对象

​ 2. Servlet 容器会为这个响应创建 代表 HTTP 响应的 ServletResponse 对象

注意:然后将它们作为参数传递给 Servlet 的 service() 方法。

2.service() 方法从 ServletRequest 对象中获得客户请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。

3.在 Servlet 的整个生命周期内,对于 Servlet 的每一次访问请求

注意:Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象,也就是说,service() 方法在 Servlet 的整个生命周期中会被调用多次

3.3)销毁阶段

1.当服务器关闭或 Web 应用被移除出容器时Servlet 随着 Web 应用的关闭而销毁。在销毁 Servlet 之前,Servlet 容器会调用 Servlet 的 destroy() 方法,以便让 Servlet 对象释放它所占用的资源。

注意:

​ 1.在 Servlet 的整个生命周期中,destroy() 方法也只能被调用一次。

​ 2.需要注意的是,Servlet 对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭或 Web 应用被移除出容器时,Servlet 对象才会销毁。

4. Servlet的多重映射

Servlet 的多重映射指同一个 Servlet 可以被映射成多条虚拟路径,客户端可以通过多条路径实现对同一个 Servlet 的访问

4.1) 配置多个实现多重映射

<servlet-mapping>
    <!-- 映射为TestServlet01和Test02 -->
    <servlet-name>TestServlet01</servlet-name>
    <url-pattern>/TestServlet01</url-pattern>
    <url-pattern>/Test02</url-pattern>
</servlet-mapping>

4.2)Servlet映射路径中使用通配符

在实际开发过程中,开发者有时会希望某个目录下的所有路径都可以访问同一个 Servlet,这时,可以在 Servlet 映射的路径中使用通配符*。通配符的格式有两种,具体如下。

  • 格式为“*.扩展名”,例如 *.do 匹配以 .do 结尾的所有 URL 地址。
  • 格式为 /,例如 /abc/ 匹配以 /abc 开始的所有 URL 地址。

5. ServletConfig接口

5.1)在运行 Servlet 程序时

可能需要一些辅助信息,例如,文件使用的编码、使用 Servlet 程序的共享信息等

这些信息可以在 web.xml 文件中使用一个或多个 元素进行配置。

当 Tomcat 初始化一个 Servlet 时,会将该 Servlet 的配置信息封装到 ServletConfig 对象中,此时可以通过调用 init(ServletConfig config)方法将 ServletConfig 对象传递给 Servlet。

5.2)ServletConfig接口的方法

方法说明 功能描述
String getInitParameter(String name) 根据初始化参数名返回对应的初始化参数值
Enumeration getInitParameterNames() 返回一个 Enumeration 对象,其中包含了所有的初始化参数名
ServletContext getServletContext() 返回一个代表当前 Web 应用的 ServletContext 对象
String getServletName() 返回 Servlet 的名字,即 web.xml 中 元素的值

6. ServletContext接口

6.1)当 Tomcat 启动时

​ Tomcat 会为每个 Web 应用创建一个唯一的 ServletContext 对象代表当前的 Web 应用,该对象封装了当前 Web 应用的所有信息。

作用

​ 1. 可以利用该对象获取 Web 应用程序的初始化信息、

​ 2. 读取资源文件等。

对 ServletContext 接口的不同作用分别进行讲解。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GfjgLzpQ-1625925452560)(C:\Users\一个人\AppData\Roaming\Typora\typora-user-images\image-20210710031015617.png)]

package com.mengma.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet03 extends HttpServlet {
    
    

    public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    
    

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        // 得到ServletContext对象
        ServletContext context = this.getServletContext();
        // 得到包含所有初始化参数名的Enumeration对象
        Enumeration<String> paramNames = context.getInitParameterNames();
        // 遍历所有的初始化参数名,得到相应的参数值并打印
        while (paramNames.hasMoreElements()) {
    
    
          String name = paramNames.nextElement();
          String value = context.getInitParameter(name);
          out.println(name + ":" + value);
          out.println("<br/>");
    }
}

    public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    
    
        this.doGet(request, response);
    }
}

6.2) 读取 Web 应用下的资源文件

ServletContext接口的常用方法

方法说明 功能描述
Set getResourcePaths(String path) 返回一个 Set 集合,集合中包含资源目录中子目录和文件的路径名 称。参数 path 必须以正斜线(/)开始,指定匹配资源的部分路径
String getRealPath(String path) 返回资源文件在服务器文件系统上的真实路径(文件的绝对路径)。参数 path 代表资源文件的虚拟路径,它应该以正斜线(/)开始,/ 表示当前 Web 应用的根目录,如果 Servlet 容器不能将虚拟路径转换为文 件系统的真实路径,则返回 null
URL getResource(String path) 返回映射到某个资源文件的 URL 对象。参数 path 必须以正斜线(/)开始,/ 表示当前 Web 应用的根目录
InputStream getResourceAsStream(String path) 返回映射到某个资源文件的 InputStream 输入流对象。参数 path 的传递规则和 getResource() 方法完全一致

7. servlet处理用户请求的完整流程

7.1) 针对 Servlet 的每次请求

​ Web 服务器在调用 service() 方法之前

创建

​ HttpServletRequest 和 HttpServletResponse 对象

作用

​ HttpServletRequest 对象用于封装 HTTP 请求消息,简称 request 对象

​ HttpServletResponse 对象用于封装 HTTP 响应消息,简称 response 对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o9V6dUqM-1625925452562)(Q:\imaga\3.png)]

7.2) 需要注意的是

在 Web 服务器运行阶段,每个 Servlet 都只会创建一个实例对象,针对每次 HTTP 请求,Web 服务器都会调用所请求 Servlet 实例的 service(HttpServletRequest request,HttpServletResponse response)方法,并重新创建一个 request 对象和一个 response 对象。

8. HttpServletRequest

HttpServletRequest 发音:[rɪˈkwest]

HttpServletRequest 接口继承自 ServletRequest 接口

8.1)HTTP请求

分为三部分

  • 请求行
  • 请求消息头
  • 请求消息体

8.2) 获取请求行信息的相关方法

请求行中包含

  • 请求方法
  • 请求资源名
  • 请求路径等信息
方法声明 功能描述
String getMethod() 该方法用于获取 HTTP 请求消息中的请求方式(如 GET、POST 等)
String getRequestURI() 该方法用于获取请求行中的资源名称部分即位于 URL 的主机和端门之后、参数部分之前的部分
String getContextPath() 这个路径以 / 开头,表示相对于整个 Web 站点的根目录
int gctServcrPort() 该方法用于获取当前请求所连接的服务器端口号,即 HTTP 请求消息中 Host 头字段所对应的端口号部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CHco44em-1625925452563)(C:\Users\一个人\AppData\Roaming\Typora\typora-user-images\image-20210710134432177.png)]

8.3) 获取请求消息头的相关方法

当浏览器发送 Servlet 请求时,需要通过请求消息头向服务器传递附加信息

9.Cookie,Session

9.1)Sessionn会话

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvhCoQps-1625925452565)(Q:\imaga\4.png)]

会话:

​ 用户访问一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称之为会话

有状态会话:访问过的浏览器,下次在访问,服务器端会自动这个客户曾经来过

9.2)保存会话的两种技术

cookie:

  • 客户点技术(响应,请求)

session:

  • 服务器技术:利用这个技术,可以保存用户的会话信息,我们可以把信息(数据)放在Session中

9.3)cookic

  1. 从请求中拿到cookie信息
  2. 服务器响应给客户点cooke
  3. 细节一个网站cookie是否存在上限!
    • 一个cookie只能保存一个信息
    • 一个web站点可以给浏览器发送多个cookie,最多可以存放20歌cookie
    • Cookie大小有限制4kb
    • 300歌Cookie是浏览器上限
  4. 删除Cookie
    • 不设置有效期。关闭浏览器,自动失效
    • 设置有效期为0

获取Cookie获取对象

 Cookie cookie = new Cookie("user",String.valueOf(System.currentTimeMillis()));

获取Cookie的值

if(Request.Cookies["userName"] != null)
    Label1.Text = Server.HtmlEncode(Request.Cookies["userName"].Value);
 
if(Request.Cookies["userName"] != null)
{
    
    
    HttpCookie aCookie = Request.Cookies["userName"];
    Label1.Text = Server.HtmlEncode(aCookie.Value);
}

9.4) Session(重点)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4zCUKjfV-1625925452565)(Q:\imaga\5.png)]

什么是Session

  • 服务器会给每个用户(浏览器)创建一个Seeion对象
  • 一个Seesion独占一个浏览器,只要浏览器没关,这个Seeion就存在
  • 用户登录之后,整个网站他都可以访问!

创建:Session

  • Request.getSession

Session方法

  • 给Session存储信息:setAttribute(key,value)
  • 获取SessionID:getId( );
  • 判断Session是不是新创建的:isNew( );
  • 根据Session的key获取值:getSession( );
  • 删除Session的key:removeAttributr( );
  • 手动注销Session:invalidate( );

Session和cookie的区别

Cookie:是把用户的数据写给浏览器,浏览器保存(可以保存多个)

Session:把用户的数据写到用户单独占Session中,服务器端保存,(保存重要的信息,减少服务器资源的浪费)

使用场景:

  • 保存一个登录用户的信息;
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存在Session中;

猜你喜欢

转载自blog.csdn.net/yigre/article/details/118641482
今日推荐