Servlet开发流程和常见方法

Servlet开发和常见方法

tomcat开发目录结构

  • 下面为普通java项目,maven项目将src中的替换即可
/MyWebApp
    /src
        /com
            /example
                HelloServlet.java
    /web
        /WEB-INF
            web.xml
        index.html

Servlet开发流程

  1. 创建项目,为当前项目导入tomcat的依赖(回导入servlet等相关依赖)

  2. 编写servlet类,继承HttpServlet

    • HttpServlet实现了servlet接口,并默认实现了servlet接口中的方法
    • 重写HttpServlet中的方法如service、doGet、doPost等方法
    • 定义业务处理代码
  3. 使用重写方法中的HttpServletRequest 对象接收请求参数,使用HttpServletResponse对象设置返回参数

    • package com.example;
      
      import java.io.IOException;
      import java.io.PrintWriter;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      public class HelloServlet extends HttpServlet {
      
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
              // 设置响应内容类型
              response.setContentType("text/html; charset=UTF-8");
      
              // 获取 PrintWriter 对象
              PrintWriter out = response.getWriter();
      
              // 写入响应内容
              out.println("<html>");
              out.println("<head><title>Hello Servlet</title></head>");
              out.println("<body>");
              out.println("<h1>Hello, World!</h1>");
              out.println("<p>This is my first Servlet.</p>");
              out.println("</body>");
              out.println("</html>");
          }
      }
      
  4. 配置 web.xml

    • web/WEB-INF/web.xml 中配置 Servlet 的映射关系。

    • <?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_3_1.xsd"
               version="3.1">
      
          <!-- 定义 Servlet -->
          <servlet>
              <servlet-name>HelloServlet</servlet-name>
              <servlet-class>com.example.HelloServlet</servlet-class>
          </servlet>
      
          <!-- 映射 Servlet 到 URL -->
          <servlet-mapping>
              <servlet-name>HelloServlet</servlet-name>
              <url-pattern>/hello</url-pattern>
          </servlet-mapping>
      
      </web-app>
      
  5. 使用前端代码访问该Servlet即可

Servlet的路径映射

  • 除了扩展名匹配外必须在路径最前面添加/

XML配置

  • web.xml 文件中,通过 <servlet><servlet-mapping> 标签配置 Servlet 的路径映射。

  • 使用 <servlet> 标签定义 Servlet,指定 Servlet 的名称和类名。

    • <servlet>
          <servlet-name>HelloServlet</servlet-name> <!-- Servlet 的名称 -->
          <servlet-class>com.example.HelloServlet</servlet-class> <!-- Servlet 的完整类名 -->
      </servlet>
      
  • 使用 <servlet-mapping> 标签将 Servlet 映射到指定的 URL 模式。

    • 一个<servlet-name>可以对应多个<url-pattern>

    • 一个<servlet>标签可以对应多个<servlet-mapping>

    • 不可以有相同的<url-pattern>报启动子级时出错

      <servlet-mapping>
          <servlet-name>HelloServlet</servlet-name> <!-- Servlet 的名称 -->
          <url-pattern>/hello</url-pattern> <!-- 映射的 URL 模式 -->
          <url-pattern>/hello1</url-pattern> <!-- 映射的 URL 模式 -->
      </servlet-mapping>
      

匹配规则

  • 精确匹配

    • 完全匹配指定的路径。
    • 示例:/hello 只会匹配 /hello
  • 路径匹配

    • / 开头,以 /* 结尾,匹配指定路径下的所有请求。
    • 示例:/app/* 会匹配 /app/foo/app/bar 等。

    3. 扩展名匹配

    • *. 开头,匹配指定扩展名的请求。
    • 示例:*.do 会匹配 /foo.do/bar.do 等。

    4. 默认匹配

    • / 表示默认 Servlet,匹配所有未被其他 Servlet 处理的请求。除jsp以外所有资源
    • /*,包括jsp所有资源

当多个 Servlet 的 URL 模式匹配同一个请求时,优先级规则如下:

  • 精确匹配 > 路径匹配 > 扩展名匹配 > 默认匹配
  • 如果多个 Servlet 的 URL 模式优先级相同,则按照配置顺序选择第一个匹配的 Servlet。

注解配置

  • 在 Servlet 类上使用 @WebServlet 注解,直接指定 URL 映射。

    • import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      
      @WebServlet("/hello") // 指定 URL 映射
      public class HelloServlet extends HttpServlet {
          // Servlet 逻辑
      }
      
  • 可以通过 urlPatterns 属性指定多个 URL 映射。

    • @WebServlet(urlPatterns = {"/hello", "/greet"})
      public class HelloServlet extends HttpServlet {
          // Servlet 逻辑
      }
      

注解的其他属性:

属性名 说明
name Servlet 的名称,默认为类的全限定名。
value URL 映射,与 urlPatterns 等价。
urlPatterns URL 映射,支持多个值。
loadOnStartup Servlet 的加载顺序,值越小优先级越高。
initParams Servlet 的初始化参数,使用 @WebInitParam 注解指定。
asyncSupported 是否支持异步处理,默认为 false

Servlet中重写的方法

一般自定义servlet都继承自HttpServlet ,HttpServlet 的处理请求核心方法为:

  • service(HttpServletRequest request, HttpServletResponse response)

    • 作用:处理所有类型的 HTTP 请求。

    • 调用时机:每次客户端请求时,Servlet 容器会调用此方法。

    • 默认实现:根据请求方法(GET、POST 等)调用相应的 doGet()doPost() 等方法。

    • 重写场景:通常不需要重写此方法,除非需要自定义请求分发逻辑。

    • @Override
      protected void service(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
          String method = request.getMethod(); // 获取请求方法
          if ("GET".equals(method)) {
              doGet(request, response);
          } else if ("POST".equals(method)) {
              doPost(request, response);
          } else {
              // 处理其他方法
              super.service(request, response);
          }
      }
      
  • doGet(HttpServletRequest request, HttpServletResponse response)

    • 作用:处理 HTTP GET 请求。

    • 调用时机:当客户端发送 GET 请求时,Servlet 容器会调用此方法。

    • 常见用途

      • 获取资源(如 HTML 页面、JSON 数据)。

      • 处理查询参数(URL 中的参数)。

      • @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String name = request.getParameter("name"); // 获取查询参数
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("<h1>Hello, " + name + "!</h1>");
        }
        
  • doPost(HttpServletRequest request, HttpServletResponse response)

    • 作用:处理 HTTP POST 请求。

    • 调用时机:当客户端发送 POST 请求时,Servlet 容器会调用此方法。

    • 常见用途

      • 提交表单数据。

      • 上传文件。

      • 处理敏感数据(如登录信息)。

      • @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String username = request.getParameter("username"); // 获取表单数据
            String password = request.getParameter("password");
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("<h1>Welcome, " + username + "!</h1>");
        }
        

其他重要方法:

  • init(ServletConfig config)

    • 作用:Servlet 初始化时调用,用于加载配置或初始化资源。

    • 调用时机:Servlet 第一次被请求时,或服务器启动时(如果配置了 loadOnStartup)。

    • 常见用途

      • 加载配置文件。
      • 初始化数据库连接。
    • @Override
      public void init(ServletConfig config) throws ServletException {
          super.init(config);
          String username = config.getInitParameter("username"); // 获取初始化参数
          System.out.println("Servlet initialized with username: " + username);
      }
      
  • destroy()

    • 作用:Servlet 销毁时调用,用于释放资源。
    • 调用时机:Servlet 被卸载或服务器关闭时。
    • 常见用途
      • 关闭数据库连接。
      • 清理内存。

HttpServletRequest

获取请求参数

  • 请求参数通常来自 URL 查询字符串(GET 请求)或表单数据(POST 请求)。

  • String getParameter(String name)

    • 作用:获取指定名称的请求参数值。

    • 返回值:参数值(字符串),如果参数不存在则返回 null

    • String username = request.getParameter("username");
      
  • String[] getParameterValues(String name)

    • 作用:获取指定名称的请求参数的所有值(适用于多值参数,如复选框)。

    • 返回值:参数值的数组,如果参数不存在则返回 null

    • String[] hobbies = request.getParameterValues("hobby");
      
  • Enumeration<String> getParameterNames()

    • 作用:获取所有请求参数的名称。

    • 返回值:参数名称的枚举。

    • Enumeration<String> parameterNames = request.getParameterNames();
      while (parameterNames.hasMoreElements()) {
          String name = parameterNames.nextElement();
          String value = request.getParameter(name);
          System.out.println(name + ": " + value);
      }
      
  • Map<String, String[]> getParameterMap()

    • 作用:获取所有请求参数的键值对。

    • 返回值:参数名称和值的映射(值为字符串数组)。

    • Map<String, String[]> parameterMap = request.getParameterMap();
      for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
          String name = entry.getKey();
          String[] values = entry.getValue();
          System.out.println(name + ": " + String.join(", ", values));
      }
      

获取请求头

  • 请求头信息包含客户端发送的元数据,如浏览器类型、内容类型等。

  • String getHeader(String name)

    • 作用:获取指定名称的请求头值。

    • 返回值:请求头值(字符串),如果头信息不存在则返回 null

    • String userAgent = request.getHeader("User-Agent");
      
  • Enumeration<String> getHeaders(String name)

    • 作用:获取指定名称的请求头的所有值(适用于多值头信息)。

    • 返回值:请求头值的枚举。

    • Enumeration<String> acceptHeaders = request.getHeaders("Accept");
      while (acceptHeaders.hasMoreElements()) {
          String headerValue = acceptHeaders.nextElement();
          System.out.println(headerValue);
      }
      
  • Enumeration<String> getHeaderNames()

    • 作用:获取所有请求头的名称。

    • 返回值:请求头名称的枚举。

    • Enumeration<String> headerNames = request.getHeaderNames();
      while (headerNames.hasMoreElements()) {
          String name = headerNames.nextElement();
          String value = request.getHeader(name);
          System.out.println(name + ": " + value);
      }
      

获取客户端信息

  • 客户端信息包括客户端的 IP 地址、主机名、端口号等。

  • String getRemoteAddr()

    • 作用:获取客户端的 IP 地址。

    • 返回值:客户端的 IP 地址(字符串)。

    • String clientIP = request.getRemoteAddr();
      
  • String getRemoteHost()

    • 作用:获取客户端的主机名。

    • 返回值:客户端的主机名(字符串),如果无法解析则返回 IP 地址。

    • String clientHost = request.getRemoteHost();
      
  • int getRemotePort()

    • 作用:获取客户端的端口号。

    • 返回值:客户端的端口号(整数)。

    • int clientPort = request.getRemotePort();
      

获取请求路径信息

  • String getRequestURI()

    • 作用:获取请求的 URI(不包括协议、主机和端口)。

    • 返回值:请求的 URI(字符串)。

    • String requestURI = request.getRequestURI();
      
  • StringBuffer getRequestURL()

    • 作用:获取请求的完整 URL(包括协议、主机和端口)。

    • 返回值:请求的完整 URL(StringBuffer)。

    • StringBuffer requestURL = request.getRequestURL();
      
  • String getContextPath()

    • 作用:获取请求的上下文路径(Web 应用的根路径)。

    • 返回值:上下文路径(字符串)。

    • String contextPath = request.getContextPath();
      

获取会话信息

  • 会话信息用于跟踪用户的状态。

  • HttpSession getSession()

    • 作用:获取与当前请求关联的会话对象。如果会话不存在,则创建一个新的会话。

    • 返回值HttpSession 对象。

    • HttpSession session = request.getSession();
      
  • HttpSession getSession(boolean create)

    • 作用:获取与当前请求关联的会话对象。如果 createfalse 且会话不存在,则返回 null

    • 返回值HttpSession 对象或 null

    • HttpSession session = request.getSession(false);
      if (session != null) {
          // 会话存在
      } else {
          // 会话不存在
      }
      

其他常用方法

  • String getMethod()

    • 作用:获取请求的 HTTP 方法(如 GET、POST)。

    • 返回值:HTTP 方法(字符串)。

    • String method = request.getMethod();
      
  • String getQueryString()

    • 作用:获取请求的查询字符串(URL 中 ? 后面的部分)。

    • 返回值:查询字符串(字符串),如果不存在则返回 null

    • String queryString = request.getQueryString();
      
  • String getProtocol()

    • 作用:获取请求的协议和版本(如 HTTP/1.1)。

    • 返回值:协议和版本(字符串)。

    • String protocol = request.getProtocol();
      

HttpServletResponse

设置响应状态码

  • void setStatus(int status)

    • 作用:设置响应的状态码。

    • 参数

      • status:HTTP 状态码(如 200404)。

      • response.setStatus(HttpServletResponse.SC_OK); // 200
        
  • void sendError(int status)

    • 作用:发送错误状态码,并清空响应缓冲区。

    • 参数

      • status:HTTP 错误状态码(如 404500)。

      • response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404
        
  • void sendError(int status, String message)

    • 作用:发送错误状态码和错误信息,并清空响应缓冲区。

    • 参数

      • status:HTTP 错误状态码。

      • message:错误信息。

      • response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Server Error"); // 500
        

设置响应头

  • 响应头信息包含服务器返回的元数据,如内容类型、缓存控制等。

  • void setHeader(String name, String value)

    • 作用:设置指定名称的响应头。

    • 参数

      • name:响应头名称。

      • value:响应头值。

      • response.setHeader("Content-Type", "text/html; charset=UTF-8");
        
  • void addHeader(String name, String value)

    • 作用:添加指定名称的响应头(允许多个值)。

    • 参数

      • name:响应头名称。

      • value:响应头值。

      • response.addHeader("Set-Cookie", "username=John");
        response.addHeader("Set-Cookie", "language=en");
        
  • void setIntHeader(String name, int value)

    • 作用:设置指定名称的响应头,值为整数。

    • 参数

      • name:响应头名称。

      • value:响应头值(整数)。

      • response.setIntHeader("Content-Length", 123);
        
  • void addIntHeader(String name, int value)

  • void setDateHeader(String name, long date)

  • void addDateHeader(String name, long date)

设置响应内容

  • 响应内容是服务器返回给客户端的主体数据。

  • void setContentType(String type)

    • 作用:设置响应内容的 MIME 类型。

    • 如果不设置tomcat会在conf/web.xml配置文件中寻找配置好的对应文件类型的相应头,如果找不到默认按照HTML格式进行处理

    • 参数

      • type:MIME 类型(如 text/htmlapplication/json)。

      • response.setContentType("text/html; charset=UTF-8");
        
  • void setCharacterEncoding(String encoding)

    • 作用:设置响应内容的字符编码。

    • 参数

      • encoding:字符编码(如 UTF-8)。

      • response.setCharacterEncoding("UTF-8");
        
  • PrintWriter getWriter()

    • 作用:返回一个 PrintWriter 对象,用于向客户端发送文本数据。

    • 返回值PrintWriter 对象。

    • PrintWriter out = response.getWriter();
      out.println("<h1>Hello, World!</h1>");
      
  • ServletOutputStream getOutputStream()

    • 作用:返回一个 ServletOutputStream 对象,用于向客户端发送二进制数据。

    • 返回值ServletOutputStream 对象。

    • ServletOutputStream out = response.getOutputStream();
      out.write(fileBytes); // fileBytes 是文件的字节数组
      
  • void setContentLength(int length)

    • 作用:设置响应内容的长度。

    • 参数

      • length:内容长度(字节数)。

      • response.setContentLength(123);
        

重定向

  • void sendRedirect(String location)

    • 作用:将客户端重定向到指定的 URL。

    • 参数

      • location:重定向的目标 URL。

      • response.sendRedirect("/new-location");
        

其他常用方法

  • void addCookie(Cookie cookie)

  • 作用:向客户端添加一个 Cookie。

  • 参数

    • cookieCookie 对象。

    • Cookie cookie = new Cookie("username", "John");
      response.addCookie(cookie);
      
  • void setBufferSize(int size)设置响应缓冲区的大小(字节数)

  • void flushBuffer()强制将缓冲区的内容发送到客户端

  • void reset()清空响应缓冲区和头信息

  • void resetBuffer()清空响应缓冲区,但保留头信息

posted @ 2025-03-18 15:21  QAQ001  阅读(25)  评论(0)    收藏  举报