当前位置: 首页 > news >正文

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 页面)
http://www.jsqmd.com/news/79659/

相关文章:

  • 理解 Proxy 原理及如何拦截 Map、Set 等集合方法调用实现自定义拦截和日志——含示例代码解析
  • Java毕设项目:基于springboot厨具厂产品在线销售系统设计与实现小程序(源码+文档,讲解、调试运行,定制等)
  • Java毕设项目:基于springboot二手商品网站(源码+文档,讲解、调试运行,定制等)
  • 详解 Gitee/GitHub 中 HTTPS/SSH 方式数据库仓库创建与本地连接
  • 第五十七篇-ComfyUI+V100-32G+安装SD1.5
  • 突破实时视频生成瓶颈:Krea Realtime 14B模型革新文本到视频技术
  • systemd-resolved.service实验实战3
  • 哔哩下载姬:5个实用技巧让你的B站视频下载效率翻倍
  • Windows右键菜单终极优化指南:从卡顿到流畅的深度解析
  • 腾讯优图实验室开源Youtu-Embedding文本表示模型,赋能企业级AI应用创新
  • SAM3在医疗影像里“指鹿为马”?MedSAM3来了——文本一句话,精准分割病灶
  • Java毕设项目:基于SpringBoot网上超市的设计与实现基于springboot超市在线销售系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 小学娃近视防控不费妈!这款眼调节训练灯,学习护眼一步到位
  • 无人机看地面小目标总“眼瞎”?MambaRefine-YOLO来救场:双模态融合+高效检测,精度直接拉满!
  • QDialog-基础讲解
  • 【异常】豆包TTS语音合成常见报错及SSML代码实现解决方案
  • Java 大视界 -- Java 大数据在智能教育学习成果评估体系完善与教育质量提升中的深度应用(434)
  • 【项目实战】Vercel 是一个让你的网站“瞬间上线”的云平台。Vercel 现在确实是技术圈的“当红炸子鸡”,尤其是在个人博客和前端开发领域。
  • 【异常】Coze提示WorkflowEventError(errorCode=5000, errorMessage=The request parameter is illegal, see:
  • Python-2. Python语言初识-教学设计
  • IC卡门禁读卡器是一款高性能、多协议兼容的智能识别终端,专为门禁、梯控、闸机等场景设计。它同时支持125KHz低频协议和13.56MHz高频协议,具备极强的环境适应性,可在金属表面(建议开孔安装)
  • 02、打不开某个网站
  • 基于SpringBoot + Vue的企业培训与绩效评估系统
  • 为什么近视的孩子更推荐眼调节训练灯?不是护眼灯不好,而是需求不一样!
  • 基于SpringBoot + Vue的健身房管理系统
  • 每个神经元负责提取不同特征?还是每层神经元负责提取不同特征?
  • WPS Office镜像大全
  • 基于SpringBoot + Vue的养老院管理系统
  • 基于Uniapp + SpringBoot + Vue的动物园导览系统(双端:PC端 + 移动端)
  • ViGEmBus虚拟游戏控制器驱动:从入门到精通的完整指南 [特殊字符]