【Java网络编程】详解常见servlet的API使用

embedded/2024/11/27 18:07:28/

servlet常用类和接口

在Java Servlet中,主要涉及的几个类和接口包括:

  1. HttpServlet:这是一个抽象类,提供了处理HTTP请求的基本功能。你通常会继承这个类来创建自己的Servlet。

  2. HttpServletRequest:这个接口是ServletRequest的子接口,专门用于处理HTTP请求。它提供了更多与HTTP相关的方法,例如获取请求方法(GET、POST等)和获取请求参数。

  3. HttpServletResponse:这个接口是ServletResponse的子接口,专门用于处理HTTP响应。它提供了设置内容类型、设置响应状态码等方法。

简单代码实例:

当你创建一个Servlet时,通常需要扩展HttpServlet,并重写doGet()doPost()等方法来处理HTTP请求。以下是一个简单的Servlet示例:

java">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("/example")
public class ExampleServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");response.getWriter().write("<h1>Hello, Servlet!</h1>");}
}

在这个例子中,ExampleServlet继承了HttpServlet,并实现了doGet()方法来处理GET请求。

HttpServlet 类常用API

HttpServlet是一个基于HTTP协议的 servlet 的抽象类,提供以下主要方法:

  • **doGet(HttpServletRequest req, HttpServletResponse resp)**:处理GET请求。
  • **doPost(HttpServletRequest req, HttpServletResponse resp)**:处理POST请求。
  • **init()**:Servlet初始化时调用。
  • **destroy()**:Servlet销毁时调用。

使用示例

java">import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyServlet extends HttpServlet {@Overridepublic void init() throws ServletException {super.init();// Servlet initialization logic here}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// Handle GET request}@Overridepublic void destroy() {// Cleanup logic heresuper.destroy();}
}

HttpServletRequest 接口常用API

HttpServletRequest接口提供了与客户端请求相关的方法。常用API包括:

  • **getParameter(String name)**:获取请求参数。
  • **getMethod()**:获取请求的方法(如 "GET"、"POST")。
  • **getHeader(String name)**:获取请求头信息。
  • **getRequestURI()**:获取请求的URI。
  • **getSession()**:获取当前请求的Session。

使用示例

java">@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求参数String name = req.getParameter("name");// 获取请求方法String method = req.getMethod();// 获取请求头String userAgent = req.getHeader("User-Agent");// 获取请求URIString requestURI = req.getRequestURI();// 使用获取的信息处理响应resp.setContentType("text/html");resp.getWriter().write("<h1>Hello, " + name + "!</h1>");
}

HttpServletResponse 接口常用API

  • **setContentType(String type)**:设定响应的内容类型。
  • **setStatus(int sc)**:设置响应的状态码。
  • **addHeader(String name, String value)**:添加响应头信息。
  • **getWriter()**:返回用于写入响应正文的PrintWriter对象。
  • **sendRedirect(String location)**:重定向到指定的URL。

使用示例

java">@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置内容类型resp.setContentType("text/html; charset=UTF-8");// 设置HTTP状态码resp.setStatus(HttpServletResponse.SC_OK);// 添加响应头resp.addHeader("Custom-Header", "Value");// 写入响应内容try (PrintWriter out = resp.getWriter()) {out.write("<h1>Hello, Servlet Response!</h1>");}// 重定向示例(可选)// resp.sendRedirect("http://www.example.com");
}

常用的响应头类型:

HTTP 响应头是服务器在响应请求时发送给客户端(浏览器、API 客户端等)的元数据。它们提供关于服务器的信息、内容类型、多种缓存策略等。以下是一些常用的 HTTP 响应头及其描述:

1. Content-Type

  • 描述: 指定响应内容的媒体类型,从而告知客户端如何处理响应的内容。
  • 示例
    • Content-Type: text/html; charset=UTF-8 (HTML文档)
    • Content-Type: application/json (JSON数据)
    • Content-Type: image/png (PNG图像)

2. Content-Length

  • 描述:指示响应体的大小(以字节为单位),客户端可以根据这个值读取指定数量的字节。
  • 示例
    • Content-Length: 1234 (响应体大小为1234字节)

3. Cache-Control

  • 描述:控制缓存的行为,指定请求和响应是否可以被缓存及缓存的策略。
  • 示例
    • Cache-Control: no-cache (不缓存)
    • Cache-Control: max-age=3600 (缓存最大一小时)

4. Expires

  • 描述:定义一个日期和时间,响应在该时间之前是有效的,通常与 Cache-Control 一起使用。
  • 示例
    • Expires: Wed, 21 Oct 2025 07:28:00 GMT

5. Access-Control-Allow-Origin

  • 描述:用于CORS(跨域资源共享),定义哪些域可以访问资源。
  • 示例
    • Access-Control-Allow-Origin: * (允许所有域访问)
    • Access-Control-Allow-Origin: https://example.com (仅允许特定域)

6. Location

  • 描述:用于指示客户端进行重定向,通常在 3xx 响应状态码中使用。
  • 示例
    • Location: https://www.example.com/new-page (重定向至新地址)
  • 描述:用于设置客户端的cookie。
  • 示例
    • Set-Cookie: sessionId=abc123; HttpOnly; Secure (设置名为 sessionId 的cookie)

8. Content-Disposition

  • 描述:指定内容的处理方式,可以用于指示浏览器以下载的方式打开文件,而不是直接显示。
  • 示例
    • Content-Disposition: attachment; filename="file.txt" (下载文件,文件名为 file.txt

使用示例

java">@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置内容类型resp.setContentType("text/html; charset=UTF-8");// 添加常用响应头resp.setHeader("Cache-Control", "no-cache");resp.setHeader("Custom-Header", "MyHeaderValue");resp.setHeader("Access-Control-Allow-Origin", "*");// 写入响应内容try (PrintWriter out = resp.getWriter()) {out.write("<h1>Hello, HttpHeaders!</h1>");}
}

servlet 中 ObjectMapper 类的使用

ObjectMapper 是 Jackson 库中一个非常重要的类,用于在 Java 对象与 JSON 之间进行转换。Jackson 是一个流行的 Java JSON 处理库,广泛用于将 Java 对象序列化为 JSON 格式,以及将 JSON 格式反序列化为 Java 对象。

1. 常见用途

  • 将 Java 对象转换为 JSON 字符串(序列化)
  • 将 JSON 字符串转换为 Java 对象(反序列化)
  • 读取 JSON 数据并将其映射到 Java 对象
  • 将 Java 对象写入 JSON 文件或输出流

2. 基本使用

2.1. 库依赖

在使用 ObjectMapper 之前,需要确保你的项目中包含 Jackson 依赖。例如,使用 Maven 的话,你可以在 pom.xml 中添加以下依赖:

java"><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.2</version> <!-- 替换为当前最新版本 -->
</dependency>
2.2. 创建 ObjectMapper 实例

ObjectMapper 的实例通常是可以重用的,创建一个实例后可以用来进行多次转换。

java">import com.fasterxml.jackson.databind.ObjectMapper;ObjectMapper objectMapper = new ObjectMapper();

java-对象转换为-json">3. 序列化:将 Java 对象转换为 JSON

3.1. 示例代码
java">import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;class User {private String name;private int age;// 构造函数、getter、setter 省略
}public class Main {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();User user = new User("Alice", 30);try {// 序列化为 JSON 字符串String jsonString = objectMapper.writeValueAsString(user);System.out.println(jsonString);// 将对象写入 JSON 文件objectMapper.writeValue(new File("user.json"), user);} catch (IOException e) {e.printStackTrace();}}
}

java-对象">4. 反序列化:将 JSON 转换为 Java 对象

4.1. 示例代码
java">import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.IOException;public class Main {public static void main(String[] args) {ObjectMapper objectMapper = new ObjectMapper();try {// 从 JSON 字符串反序列化为 Java 对象String jsonString = "{\"name\":\"Alice\",\"age\":30}";User user = objectMapper.readValue(jsonString, User.class);System.out.println("Name: " + user.getName() + ", Age: " + user.getAge());// 从 JSON 文件反序列化为 Java 对象User userFromFile = objectMapper.readValue(new File("user.json"), User.class);System.out.println("From File - Name: " + userFromFile.getName() + ", Age: " + userFromFile.getAge());} catch (IOException e) {e.printStackTrace();}}
}

5. 配置 ObjectMapper

ObjectMapper 提供了许多选项来配置序列化和反序列化行为。例如:

  • 启用或禁用特定特性

    java">objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); // 使输出的 JSON 格式化
    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略未知属性
    

  • **自定义 Serializer 和 Deserializer**:你可以为特定类型创建自定义的序列化和反序列化规则。

6. 常见特性

  • 支持复杂类型ObjectMapper 可以处理嵌套对象和集合(如 List 和 Map)。
  • 可处理多种格式:除了 JSON,该库还支持其他数据格式,如 XML 和 YAML(需要附加依赖)。

总结

ObjectMapper 是一个强大且灵活的工具,用于在 Java 对象和 JSON 之间进行转换。它非常适合用于 Web 开发(例如:处理 RESTful API 的 JSON 请求和响应)以及任何需要 JSON 处理的 Java 应用程序中。


http://www.ppmy.cn/embedded/140965.html

相关文章

Doris 数据集成 LakeSoul

Doris 数据集成 LakeSoul 作为一种全新的开放式的数据管理架构,湖仓一体(Data Lakehouse)融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势,帮助用户更加便捷地满足各种数据处理分析的需求,在企业的大数据体系中已经得到越来越多的应用。 在过去多个版本…

深度学习在雷达中的应用

1.CNN基本原理 20世纪60年代&#xff0c; Hubel和Wiese研究猫脑皮层发现用于局部敏感和方向选择的神经元具有独特的 网络结构&#xff0c;该结构可以降低反馈神经网络的复杂性&#xff0c;针对此研究提出了CNN。近些年&#xff0c;针对CNN具有避免图像的复杂前期预处理的优势&a…

HTML的自动定义倒计时,这个配色存一下

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>自定义倒计时</title><style>* {mar…

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类&#xff0c;其中选择JUnit5 和 JUnit&#xff0c;但是感觉这不是标准的单元测试&#xff0c;因为接口命名吧。 差异对比 两者生成的单测API名称同原API&#xff0c;没加test前缀的。使用差异主要表现在&#xff1a; setUp &#xff06; …

性能测试工具|如何有效度量前端性能

目标 从用户角度明确前端 Web、H5 性能测试需要重点关注的内容&#xff1b; 根据关注内容明确性能测试过程中的性能评判指标和建议的阈值范围&#xff1b; 整理性能测试过程中各性能评价指标的收集方法&#xff1b; 明确性能测试完毕后的测试结果展现形式。 质量模型 用户…

Leetcode3206:交替组 I

题目描述&#xff1a; 给你一个整数数组 colors &#xff0c;它表示一个由红色和蓝色瓷砖组成的环&#xff0c;第 i 块瓷砖的颜色为 colors[i] colors[i] 0 表示第 i 块瓷砖的颜色是 红色 。 colors[i] 1 表示第 i 块瓷砖的颜色是 蓝色 。 环中连续 3 块瓷砖的颜色如果是 …

什么是MyBatis?

MyBatis简介 MyBatis是一款优秀的持久层框架&#xff0c;用于简化Java应用程序对数据库的操作。它曾是Apache的一个开源项目&#xff0c;名为iBatis&#xff0c;2010年迁移到Google Code并改名为MyBatis&#xff0c;2013年11月又迁移到了GitHub。 一、MyBatis的作用 在JavaE…

C#水仙花

打印出所有的“水仙花数”&#xff0c;所谓“水仙花数”是指一个三位数&#xff0c;其各位数字立方和等于该数本身。例如&#xff1a;153是一个“水仙花数”&#xff0c;因为1531*1*1&#xff0b;5*5*5&#xff0b;3*3*3 首先是3位数那就是100-999&#xff0c;遍历它们&#…