news 2026/6/14 6:22:53

api vs jsp 绑定风格

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
api vs jsp 绑定风格

api vs jsp 绑定风格

这是一个关于Java Web Servlet接口的示例,我将为您创建两个Servlet

  1. 一个支持cURL或任何标准 HTTP 客户端调用的接口 (CurlCallableServlet)。
  2. 一个通常不直接设计为 cURL 调用,而是与JSP页面集成(用于渲染视图)的接口 (JspBoundServlet)。

请注意:从技术上讲,任何暴露 HTTP 端点的Servlet都可以被 cURL 调用。这里的“不支持”主要是指它的设计意图和通常用法:它通常会将请求转发给一个 JSP 页面来生成完整的 HTML 响应,而不是像 API 接口那样直接返回数据。

1. 支持 cURL 调用的 Servlet (API 风格)

这个 Servlet 通常用于提供API 服务,它直接返回数据(例如 JSON 或纯文本),可以轻松地被 cURL 或其他编程客户端调用。

文件:CurlCallableServlet.java

import java.io.IOException; import java.io.PrintWriter; 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 注解,映射到 /api/data 路径 @WebServlet("/api/data") public class CurlCallableServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 设置响应的内容类型为 JSON,方便客户端(如 cURL)解析 response.setContentType("application/json"); // 2. 设置字符编码 response.setCharacterEncoding("UTF-8"); // 3. 构造要返回的数据 String name = request.getParameter("name"); String message = (name != null && !name.isEmpty()) ? "Hello, " + name + "! Data fetched successfully." : "Data fetched successfully for an anonymous user."; // 4. 简单 JSON 格式输出 String jsonResponse = String.format( "{\"status\":\"success\", \"message\":\"%s\", \"timestamp\":%d}", message, System.currentTimeMillis()); // 5. 写入响应 PrintWriter out = response.getWriter(); out.print(jsonResponse); out.flush(); } }

cURL 调用示例 (假设您的应用运行在http://localhost:8080):

# 简单的 GET 请求 curl http://localhost:8080/yourapp/api/data # 带有参数的 GET 请求 curl "http://localhost:8080/yourapp/api/data?name=UserA" # 预期输出类似: # {"status":"success", "message":"Hello, UserA! Data fetched successfully.", "timestamp":1701234567890}

2. 不支持 cURL 调用的 Servlet (JSP 绑定风格)

这个 Servlet 通常用于MVC (Model-View-Controller)模式的Controller部分。它的主要工作是处理请求、准备数据,然后使用RequestDispatcher将控制权转发给一个 JSP视图来渲染完整的 HTML 页面。如果用 cURL 调用,它会返回一个完整的 HTML 页面,而不是简洁的数据,所以通常认为它“不支持”直接作为 API 调用。

文件:JspBoundServlet.java

import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // 映射到 /app/page 路径 @WebServlet("/app/page") public class JspBoundServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. **不设置 ContentType** (通常由 JSP 来处理最终的 HTML 响应) // 2. 准备数据 (Model) String user = "Guest"; String time = new java.util.Date().toString(); // 3. 将数据放入 request 作用域,供 JSP 访问 request.setAttribute("username", user); request.setAttribute("serverTime", time); // 4. **转发**请求到 JSP 视图 (View) // 核心区别:它不自己写响应,而是把响应生成任务交给 JSP。 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/welcome.jsp"); dispatcher.forward(request, response); // 注意:在这个 Servlet 方法中,response.getWriter().print(...) 不会被调用 // 所有输出都由 JSP 负责。 } }

JSP 文件:/WEB-INF/views/welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Welcome Page</title> </head> <body> <h1>Hello, ${username}!</h1> <p>This is a view rendered by JSP.</p> <p>Current Server Time: <strong>${serverTime}</strong></p> <button onclick="alert('This is a button for a real user.')">Click Me</button> </body> </html>

cURL 调用示例 (假设您的应用运行在http://localhost:8080):

curl http://localhost:8080/yourapp/app/page # 预期输出:返回的是整个 HTML 页面内容,包含 <head>, <body> 等标签, # 客户端(cURL)通常只想要数据的场景下,这种输出是不合适的。 # <!DOCTYPE html><html><head>...</head><body>...</body></html>

总结比较

特性CurlCallableServlet (API 风格)JspBoundServlet (JSP 绑定风格)
设计意图提供结构化数据(JSON/XML)作为 API作为控制器,处理请求后转发给视图(JSP)
响应内容application/jsontext/plaintext/html(由 JSP 生成)
主要方法response.getWriter().print(...)直接输出数据request.getRequestDispatcher().forward(...)转发到 JSP
cURL 适用性非常适用(返回简洁数据)不适用(返回完整的 HTML 页面)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 0:56:16

ViGEmBus虚拟游戏控制器驱动:从入门到精通的完整指南 [特殊字符]

还在为游戏手柄兼容性问题而烦恼吗&#xff1f;想要让任天堂Switch Pro手柄、PS4手柄在PC上畅玩所有游戏&#xff1f;ViGEmBus就是你的完美解决方案&#xff01;这款强大的虚拟游戏控制器驱动能够将各种非标准设备完美模拟成Xbox 360或DualShock 4控制器&#xff0c;让你的游戏…

作者头像 李华
网站建设 2026/6/10 14:08:23

【智能制造典型场景参考指引(2025 年版)解读】 -产品研发环节

智能制造作为制造业转型升级的核心驱动力&#xff0c;通过深度融合新一代信息技术与先进制造技术&#xff0c;推动生产模式向数字化、网络化、智能化方向演进。智能制造典型场景参考指引&#xff08;2025 年版&#xff09;旨在为制造业企业提供可落地的典型场景参考&#xff0c…

作者头像 李华
网站建设 2026/6/12 20:16:46

LeetCode 面试经典150题之合并两个有序数组

LeetCode 面试经典150题之合并两个有序数组 一、题目 1.题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非…

作者头像 李华
网站建设 2026/6/13 2:15:20

大模型落地加速:15+15+8精选资源清单助力开发者攻克技术难关

大模型落地加速&#xff1a;15158精选资源清单助力开发者攻克技术难关 【免费下载链接】LongAlign-7B-64k 项目地址: https://ai.gitcode.com/zai-org/LongAlign-7B-64k 在人工智能技术迅猛发展的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;正经历着从实…

作者头像 李华