Servlet开发流程和常见方法

Servlet开发和常见方法

tomcat开发目录结构

  • 下面为普通java项目,maven项目将src中的替换即可
/MyWebApp/src/com/exampleHelloServlet.java/web/WEB-INFweb.xmlindex.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 {@Overrideprotected 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/javaeehttp://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()清空响应缓冲区,但保留头信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900964.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用cursor打造智能客服demo

cursor AI它真的是非常强大。 今天讲下如何使用它,搭配deepseek api接口,来生成一个智能客服系统。这是最终的效果。首先cursor需要登录后才能使用。登录之后有两周的免费试用期。我们在窗口的右侧填写智能客服的需求。帮我实现一个网页智能客服。详细要求如下: 1.生成一个h…

【蓝牙小程序】小程序使用echart图表报错:setOption of undefined

转载自:https://developers.weixin.qq.com/community/develop/doc/0004ac054ccec0f26df7baa8756800问题:小程序使用echart图表报错 Cannot read property setOption of undefined;at api request success callback function TypeError: Cannot read property setOption of un…

前端中的Javascript

前端中的Javascript javascript定义方式内联JavaScript直接在HTML元素的事件属性中编写JavaScript代码<body><h1>Hello, World!</h1><button onclick="alert(Button clicked!)">Click Me</button> </body>内部JavaScript可以直接…

NVM:安装配置使用

一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同,而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题,它可以在同一台机器上下管理多个 node 版本,使得程序员可以轻松地安装、卸载和切换不同的 node 版本。 在下载和配置 nvm 前,需要在控制面板中先删…

硬盘科普,M.2,PCI-E,NVMe 傻傻分不清

首先从三个层面去理解这个问题:物理接口,通道,协议 1:物理接口(相当于通讯中的电,光口) 大白话- 物理规格,像是 公路,铁路 专门跑PCI-E通道的那个物理接口:扩展性极强,可以插显卡的PCI-E X16的那个物理接口,或者插网卡,声卡的那个PCI-E X1那个物理接口,都是属于一类…

第二届长城杯ciscn半决赛awdp pwn以及应急响应wp

这次半决赛还真是状况频出,先是上午全场靶机断联了2轮,下午的应急又在坐大牢,还好是后面捋顺了逻辑做出来了,下半场干了个赛区第二,总成绩第四,这回是真燃尽了 上半场AWDP typo fix 一开始一直在改这道结果后面才发现那个prompt是真的好改,白浪费了3轮。。。 进入程序是…

LLM Assistance for Memory Safety

LLM Assistance for Memory SafetyMohammed, Nausheen, et al. "LLM Assistance for Memory Safety." 2025 IEEE/ACM 47th International Conference on Software Engineering (ICSE). IEEE Computer Society, 2024.Introduction 在软件安全的漏洞中,内存安全是主要…

『Plotly实战指南』--折线图绘制进阶篇

上一篇介绍了Plotly绘制折线图的基础知识和数据预处理的技巧, 本文将重点探讨如何利用Plotly实现多线折线图的布局设计以及动态折线图的实现, 让我们一起掌握进阶的折线图绘制技巧。 1. 多折线图布局 在实际的数据分析场景中,常常需要同时展示多组数据,例如对比不同产品的销…

使用gradio快速实现聊天机器人

我们可以使用gradio库通过低代码的方式快速实现聊天机器人界面及交互: import gradio as gr from ollama import chatdef predict(message,history):stream = chat(model="deepseek-r1:1.5b",messages=[{"role":"user","content":mess…

Edge浏览器登录微软账户报错0x80190001的解决办法

问题 0x80190001是什么错误?有用户在Edge浏览器上登录微软账户遇到了这个错误代码,这是什么意思?要如何解决呢?一个比较靠谱的解决办法解决方式1、下载一个finder(抓包软件)官网下载地址(最新版本):https://www.telerik.com/download/fiddler2、直接安装就好,选择左上…

2025年项目管理软件革命:7大工具重新定义团队协作

本文深度解析2025年项目管理工具的技术革新与市场格局,聚焦AI、量子计算、混合现实等技术对团队协作模式的颠覆性影响。一、2025年项目管理生态的三大颠覆性变化 在生成式AI、量子计算与混合现实技术推动下,项目管理工具正经历三大变革:决策权转移:AI从辅助工具升级为“虚拟…

【前瞻技术布局】京东零售广告创意:引入场域目标的创意图片生成

作者:京东零售 冯伟WWW2025: CTR-Driven Advertising Image Generation with Multimodal Large Language Models 论文链接:https://arxiv.org/pdf/2502.06823 代码链接:https://github.com/Chenguoz/CAIG 摘要:在电商平台中,广告图片对于吸引用户注意力和提高广告效果至关…