news 2026/2/28 6:17: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/2/26 12:26:03

Java毕设项目:基于springboot厨具厂产品在线销售系统设计与实现小程序(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/26 6:41:35

League Akari:6个实用功能让你告别繁琐操作,轻松上分

League Akari&#xff1a;6个实用功能让你告别繁琐操作&#xff0c;轻松上分 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari …

作者头像 李华
网站建设 2026/2/27 10:45:51

QDialog-基础讲解

注意&#xff1a;前面都是基础讲解&#xff0c;如果有什么不懂的可以看看&#xff0c;但是如果只是想看实际运用场景&#xff0c;建议只看自定义案例 这里是目录标题自定义案例问题互动案例互动The QDialog class is the base class of dialog windowsQDialog 类是对话框窗口的…

作者头像 李华
网站建设 2026/2/26 23:22:01

深度学习打卡第J2周:ResNet50V2算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 import tensorflow as tf import tensorflow.keras.layers as layers from tensorflow.keras.models import Modeldef block2(x, filters, kernel_size3, stri…

作者头像 李华
网站建设 2026/2/25 5:08:47

搜维尔科技:MANUS数据手套实现远程虚拟现实神经外科手术训练

理工学院纳米沉浸式实验室沉浸式实验室是理工学院的多学科空间&#xff0c;旨在可视化复杂数据并开发沉浸式技术原型。它为科学、工程和艺术领域的用户提供增强现实和虚拟现实研究、动作捕捉以及数字物理交互方面的支持。外科手术训练挑战现代神经外科技术对精准度要求极高&…

作者头像 李华