Servlet基本知识

Servlet基本知识

Servlet基本概念

Servlet的定义:

  • Servlet 是 Java 技术中用于扩展服务器功能的组件。它是一个运行在 Web 服务器上的 Java 程序,能够处理客户端(通常是浏览器)的请求并生成动态内容
  • 它是 Java EE(Java Platform, Enterprise Edition)规范的一部分,通常运行在支持 Java 的 Web 服务器(如 Apache Tomcat、Jetty 等)中
  • 像xxx.html文件为静态资源,Servlet为动态资源
  • Servlet:运行在 Web 容器中,负责处理具体的业务逻辑。
    • Web 容器接收客户端请求并将其转发给对应的 Servlet。
    • Servlet 处理请求并生成响应,Web 容器将响应返回给客户端。

Servlet的作用

  • 处理 HTTP 请求:接收客户端发送的 HTTP 请求(如 GET、POST 等)。
  • 生成动态响应:根据请求内容生成动态的 HTML、JSON、XML 等响应。
  • 管理会话状态:通过 HttpSession 对象跟踪用户会话(如用户登录状态)。
  • 与数据库交互:通过 JDBC 或其他持久化技术与数据库交互。
  • 文件上传和下载:处理客户端上传的文件或提供文件下载功能。

Servlet 的生命周期

Servlet 的生命周期由 Web 容器(如 Tomcat)管理,分为以下四个阶段:

1. 加载和实例化

  • 当 Servlet 容器启动或首次接收到针对该 Servlet 的请求时,容器会加载 Servlet 类并创建其实例

  • 调用 Servlet 的无参构造函数创建 Servlet 实例

    • Servlet 是单例的,容器只会创建一个实例

    • 由于是单实例,会引发线程安全问题,尽量不去修改使用的变量

    • 如果配置了 <load-on-startup>,Servlet 会在容器启动时立即加载和实例化

      • 可以通过设置整数值来指定多个 Servlet 的加载顺序,值越小优先级越高

      • 默认的web.xml文件中已经将值占用到5,建议从6往后写

      • <servlet>
            <servlet-name>ServletName</servlet-name>
            <servlet-class>com.example.MyServlet</servlet-class>
            <load-on-startup>优先级值</load-on-startup>
        </servlet>
        
      • @WebServlet(
            urlPatterns = "/initServlet",
            loadOnStartup = 1
        )
        

2. 初始化(Initialization)

  • 在 Servlet 实例化(构造完毕)后,容器会调用 init(ServletConfig config) 方法进行初始化
  • init() 方法只执行一次,通常用于加载配置或初始化资源(如数据库连接)。
  • 可以通过 @WebInitParam 注解或 web.xml 配置文件传递初始化参数。
  • 如果初始化失败,Servlet 会被容器标记为不可用

3. 处理请求(Service)

  • 每次客户端请求时,Web 容器会调用 service() 方法。
  • service() 方法根据请求类型(GET、POST 等)调用相应的 doGet()doPost() 等方法。
  • 这些方法是开发者需要实现的核心逻辑。

4. 销毁(Destruction)

  • 当 Servlet 被卸载或 Web 容器关闭时,容器会调用 destroy() 方法。
  • destroy() 方法用于释放资源(如关闭数据库连接、清理内存)。

Servlet Context

  • ServletContext 是 Java Servlet 规范中的一个核心接口,它代表了整个 Web 应用程序的上下文环境。
  • 每个 Web 应用在 Servlet 容器(如 Tomcat)中运行时,都会有一个唯一的 ServletContext 实例。通过 ServletContext,开发者可以访问 Web 应用的全局信息、共享资源以及配置参数
  • 由于每个项目只有一个Servlet Context,所以需要在改项目的web.xml文件中配置Servlet Context

获取ServletContext

  • 通过 ServletConfig获取

    • @Override
      public void init(ServletConfig config) throws ServletException {
          ServletContext context = config.getServletContext();
      }
      
  • 直接通过HttpServlet的对象进行获取(调用GenericServlet的方法)

    • ServletContext context = this.getServletContext();
      //或者
      ServletContext context = getServletContext();
      
  • 通过 HttpServletRequest对象获取

    • ServletContext context = request.getServletContext();
      

配置和获取全局参数

  • 在 web.xml 中配置全局初始化参数:

    • <context-param>
          <param-name>appName</param-name>
          <param-value>MyWebApp</param-value>
      </context-param>
      
  • getInitParameter(String name) 方法获取参数值

    • String appName = context.getInitParameter("appName");
      System.out.println("Application Name: " + appName);
      
  • 使用 getInitParameterNames() 方法获取所有参数名。

    • Enumeration<String> paramNames = context.getInitParameterNames();
      while (paramNames.hasMoreElements()) {
          String name = paramNames.nextElement();
          String value = context.getInitParameter(name);
          System.out.println(name + ": " + value);
      }
      

代码中设置全局参数

  • 使用 setAttribute(String name, Object value) 方法设置数据

  • 使用 getAttribute(String name) 方法获取数据

  • 使用 removeAttribute(String name) 方法移除共享数据

  • context.setAttribute("userCount", 100);
    
    Integer userCount = (Integer) context.getAttribute("userCount");
    System.out.println("User Count: " + userCount);
    
    context.removeAttribute("userCount");
    

访问资源

  • 使用 getRealPath(String path) 方法获取资源的真实路径。
    • 用于将相对路径(相对于 Web 应用的根目录)转换为服务器文件系统上的绝对路径。
  • 使用 getResourceAsStream(String path) 方法读取资源文件。
  • 使用getContextPath();获取该项目的上下文路径既访问路径
    • 部署在 Servlet 容器(如 Tomcat)中的 Web 应用的名称通常和访问路径不一致
    • 比如访问路径为/spring,该方法返回/spring,参数不会影响该访问路径的获取
    • 真实路径中所携带的是Web 应用的名称(例如Spring_Tomcat_war_exploded)

default Servlet

  • 在 Tomcat 中,<load-on-startup> 值为 1default Servlet 是一个特殊的 Servlet,它的作用是处理静态资源(如 HTML、CSS、JS、图片等)的请求。它是 Tomcat 默认提供的一个核心 Servlet,负责处理那些没有映射到其他 Servlet 的请求

  • default Servlet将静态资源封装到response对象中返回(设置好响应头、响应长度等相关信息后)

  • 处理静态资源

    • 当客户端请求一个静态资源(如 /index.html/styles.css 等)时,如果没有其他 Servlet 映射到该请求路径,Tomcat 会使用 default Servlet 来处理该请求。
    • default Servlet 会从应用的 webroot(通常是 WEB-INF 之外的目录)中查找并返回请求的静态文件。
  • 处理目录列表

    • 如果请求的是一个目录路径(如 /images/),且目录中没有默认文件(如 index.html),default Servlet 可以配置为返回目录列表(需在 web.xml 中启用目录列表功能)
  • 处理默认文件

    • 如果请求的是一个目录路径,default Servlet 会尝试返回该目录下的默认文件(如 index.htmlindex.jsp 等)。
  • 处理 404 错误

    • 如果请求的资源不存在,default Servlet 会返回 404 错误。
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

listings

  • 如果设置为 true,当请求的是一个目录且没有默认文件时,default Servlet 会返回目录列表。
  • 默认值为 false,表示禁用目录列表。

debug

  • 设置调试级别,用于输出调试信息。
  • 默认值为 0,表示不输出调试信息。

Servlet 的核心类和接口

Servlet 的核心类和接口定义在 javax.servletjavax.servlet.http 包中,主要包括:

1. javax.servlet.Servlet 接口

  • 定义了 Servlet 的生命周期方法:init()service()destroy()

  • 所有 Servlet 类都必须实现这个接口。

    • 这个接口下还有getServletConfig方法用来获取ServletConfig,该对象存储用户声明的初始化信息

    • 每个Servlet中有自己独立的ServletConfig对象

    • 在Servlet接口下的GenericServlet实现类中实现封装

    • ServletConfig getServletConfig();
      
    • <servlet>
          <servlet-name>MyServlet</servlet-name>
          <servlet-class>com.example.MyServlet</servlet-class>
          <init-param>
              <param-name>param1</param-name>
              <param-value>value1</param-value>
          </init-param>
          <init-param>
              <param-name>param2</param-name>
              <param-value>value2</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      
    • @WebServlet(
          urlPatterns = "/myServlet",
          initParams = {
              @WebInitParam(name = "param1", value = "value1"),
              @WebInitParam(name = "param2", value = "value2")
          },
          loadOnStartup = 1
      )
      
    • @Override
      public void init() {
          // 获取初始参数
          param1 = getServletConfig().getInitParameter("param1");
          param2 = getServletConfig().getInitParameter("param2");
          System.out.println("param1: " + param1);
          System.out.println("param2: " + param2);
      }
      

2. javax.servlet.http.HttpServlet

  • Servlet 接口的实现类,专门用于处理 HTTP 请求。
  • 提供了 doGet()doPost()doPut()doDelete() 等方法,开发者可以重写这些方法以处理不同类型的 HTTP 请求。
    • Tomcat默认调用servlet的service方法
    • 该实现类重写了service方法,根据请求的方法类型调用相应的do方法,do方法的默认实现是响应405页面,可以在自定义servlet中通过重写这些do方法来调用自定义的逻辑。
    • 不推荐直接重写service方法,因为父类的service方法中还有响应的其他判断逻辑

3. javax.servlet.ServletRequestjavax.servlet.ServletResponse

  • 用于封装请求和响应信息。
  • ServletRequest 提供客户端请求的数据(如参数、头信息)。
  • ServletResponse 用于向客户端发送响应。

4. javax.servlet.http.HttpServletRequestjavax.servlet.http.HttpServletResponse

  • ServletRequestServletResponse 的子接口,专门用于处理 HTTP 协议的请求和响应。
  • 提供了 HTTP 特定的方法,如 getHeader()getMethod()setStatus() 等。

5. javax.servlet.http.HttpSession

  • 用于管理用户会话状态。
  • 可以在多个请求之间存储用户数据(如用户登录信息)。

HttpServletRequest

在 Tomcat(或其他符合 Java Servlet 规范的 Web 容器)中,客户端发送的 HTTP 请求信息会被封装在 HttpServletRequest 对象中。HttpServletRequest 是 Java Servlet API 中的一个接口,它提供了访问 HTTP 请求信息的方法

HttpServletRequest 的作用

  • HttpServletRequest 对象用于封装客户端发送的 HTTP 请求信息,包括:
    • 请求方法(GET、POST 等)。
    • 请求头信息。
    • 请求参数(URL 参数或表单数据)。
    • 客户端信息(如 IP 地址、浏览器类型)。
    • 会话信息(如 HttpSession)。

HttpServletRequest 提供了许多方法,用于获取请求的详细信息。

1. 获取请求信息

  • String getMethod():返回请求的 HTTP 方法(如 GET、POST)。
  • String getRequestURI():返回请求的 URI(不包括协议、主机和端口)。
  • String getQueryString():返回请求的查询字符串(URL 中 ? 后面的部分)。
  • String getProtocol():返回请求的协议和版本(如 HTTP/1.1)。

2. 获取请求头信息

  • String getHeader(String name):返回指定名称的请求头值。
  • Enumeration<String> getHeaderNames():返回所有请求头的名称。

3. 获取请求参数

  • String getParameter(String name):返回指定名称的请求参数值。
  • Map<String, String[]> getParameterMap():返回所有请求参数的键值对。
  • Enumeration<String> getParameterNames():返回所有请求参数的名称。

4. 获取客户端信息

  • String getRemoteAddr():返回客户端的 IP 地址。
  • String getRemoteHost():返回客户端的主机名。
  • int getRemotePort():返回客户端的端口号。

5. 获取会话信息

  • HttpSession getSession():返回与当前请求关联的会话对象。如果会话不存在,则创建一个新的会话。
  • HttpSession getSession(boolean create):返回与当前请求关联的会话对象。如果 createfalse 且会话不存在,则返回 null

6. 获取其他信息

  • String getServletPath():返回请求的 Servlet 路径。
  • String getContextPath():返回请求的上下文路径(Web 应用的根路径)。
  • Cookie[] getCookies():返回客户端发送的所有 Cookie。
  • RequestDispatcher getRequestDispatcher(String path):请求转发
  • **RequestDispatcher接口的forward(ServletRequest request, ServletResponse response) **:请求转发

HttpServletRequest 的工作流程

  • 客户端发送请求:浏览器或其他客户端发送 HTTP 请求到服务器。
  • Tomcat 接收请求:Tomcat 解析 HTTP 请求并将其封装为 HttpServletRequest 对象。
  • Servlet 处理请求:Tomcat 将 HttpServletRequest 对象传递给对应的 Servlet,Servlet 通过该对象获取请求信息并处理。
  • 生成响应:Servlet 根据请求信息生成响应,并通过 HttpServletResponse 对象返回给客户端。

HttpServletResponse

在 Tomcat(或其他符合 Java Servlet 规范的 Web 容器)中,服务器生成的 HTTP 响应信息会被封装在 HttpServletResponse 对象中。HttpServletResponse 是 Java Servlet API 中的一个接口,它提供了设置 HTTP 响应信息的方法。

HttpServletResponse 的作用

  • HttpServletResponse 对象用于封装服务器生成的 HTTP 响应信息,包括:
    • 响应状态码(如 200、404)。
    • 响应头信息(如 Content-TypeSet-Cookie)。
    • 响应体内容(如 HTML、JSON、文件)。
    • 重定向和错误处理。

HttpServletResponse 的主要方法

1. 设置响应状态

  • void setStatus(int status):设置响应的状态码(如 200、404)。
  • void sendError(int status):发送错误状态码,并清空响应缓冲区。
  • void sendError(int status, String message):发送错误状态码和错误信息。

2. 设置响应头信息

  • void setHeader(String name, String value):设置指定名称的响应头。
  • void addHeader(String name, String value):添加指定名称的响应头(允许多个值)。
  • void setContentType(String type):设置响应内容的 MIME 类型(如 text/htmlapplication/json)。
  • void setCharacterEncoding(String encoding):设置响应内容的字符编码(如 UTF-8)。

3. 设置响应体内容

  • PrintWriter getWriter():返回一个 PrintWriter 对象,用于向客户端发送文本数据。
  • ServletOutputStream getOutputStream():返回一个 ServletOutputStream 对象,用于向客户端发送二进制数据。

4. 重定向

  • void sendRedirect(String location):将客户端重定向到指定的 URL。

5. 其他方法

  • void addCookie(Cookie cookie):向客户端添加一个 Cookie。
  • void setContentLength(int length):设置响应内容的长度。
  • void setBufferSize(int size):设置响应缓冲区的大小。

HttpServletResponse 的工作流程

  • Servlet 处理请求:Servlet 根据 HttpServletRequest 对象处理客户端请求。
  • 设置响应信息:Servlet 通过 HttpServletResponse 对象设置响应状态码、头信息和内容。
  • Tomcat 发送响应:Tomcat 将 HttpServletResponse 对象中的信息转换为 HTTP 响应并发送给客户端。
posted @ 2025-03-18 15:19  QAQ001  阅读(18)  评论(0)    收藏  举报