当前位置: 首页 > 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.gsyq.cn/news/89741.html

相关文章:

  • Java毕设项目:基于springboot厨具厂产品在线销售系统设计与实现小程序(源码+文档,讲解、调试运行,定制等)
  • 详解 Gitee/GitHub 中 HTTPS/SSH 方式数据库仓库创建与本地连接
  • 第五十七篇-ComfyUI+V100-32G+安装SD1.5
  • 突破实时视频生成瓶颈:Krea Realtime 14B模型革新文本到视频技术
  • Windows右键菜单终极优化指南:从卡顿到流畅的深度解析
  • 小学娃近视防控不费妈!这款眼调节训练灯,学习护眼一步到位
  • QDialog-基础讲解
  • 【异常】豆包TTS语音合成常见报错及SSML代码实现解决方案
  • 【项目实战】Vercel 是一个让你的网站“瞬间上线”的云平台。Vercel 现在确实是技术圈的“当红炸子鸡”,尤其是在个人博客和前端开发领域。
  • 【异常】Coze提示WorkflowEventError(errorCode=5000, errorMessage=The request parameter is illegal, see:
  • Python-2. Python语言初识-教学设计
  • 02、打不开某个网站
  • 为什么近视的孩子更推荐眼调节训练灯?不是护眼灯不好,而是需求不一样!
  • 基于SpringBoot + Vue的健身房管理系统
  • 搜维尔科技:MANUS数据手套实现远程虚拟现实神经外科手术训练
  • 团队协作神器!本地部署 ONLYOFFICE + cpolar,多人编辑文档超方便
  • Day28~实现strlen、strcpy、strncpy、strcat、strncat
  • 学习c语言第一天的学习笔记
  • 端侧多模态新纪元:MiniCPM-V 2.6重新定义移动端AI交互体验
  • 技术工具类文章仿写专家Prompt指南
  • 利用用户的通话记录、通讯录以及短信内容可以极大提高销售效率和精准度
  • 【YOLO11-MM 多模态目标检测】动态门控MCFGatedFusion特征融合【自研模块】、抛弃Concat、实现特征动态补偿
  • LeetCode 189. 旋转数组 | 三步反转最优解全拆解
  • 【YOLO11-MM 多模态目标检测】MSAA多尺度特征融合、轻量而且高效、抛弃Concat普通融合
  • 终极英雄联盟智能助手:三步实现游戏自动化完全指南
  • 亲测!高性价比AI数字员工租赁公司分享
  • LLM本地推理全流程:基于LMDeploy的pipeline实战指南
  • OpenAI开源安全推理引擎震撼发布:gpt-oss-safeguard改写AI内容治理规则
  • 匹配回文串:利用KMP算法求解
  • 百度网盘极速下载终极指南:3步实现高速下载体验