SpringMVC4

一、SpringMVC 注解与项目开发流程

 

1.1注解的生命周期

 

- @Target、@Retention 等元注解:

-  @Target(ElementType.TYPE) :说明这个注解只能用在类、接口上。

-  @Retention(RetentionPolicy.RUNTIME) :说明注解在运行时保留,能通过反射获取。

-  @Documented :生成文档时包含这个注解。

-  @Controller 、 @ResponseBody :这两个注解组合起来就是  @RestController ,所以  @RestController = @Controller + @ResponseBody 。

- @RestController 接口示例:

public @interface RestController {

    @AliasFor(annotation = Controller.class)

    String value() default "";

}

 

 

-  @AliasFor :指定  value  属性和  @Controller  的  value  属性互为别名。

 

@ResponseBody 注解

 

- 作用:把方法返回值转成 JSON 或字符串,直接返回给客户端,而不是跳转到页面。

- 示例 1(返回字符串):

@ResponseBody

@RequestMapping("/returnHTML")

public String returnHTML() {

    return "<h1>returnHTML</h1>";

}

 

 

- 方法返回字符串  <h1>returnHTML</h1> ,会直接作为响应体返回给客户端(浏览器会把它当 HTML 渲染)。

- 示例 2(设置响应头和响应体):

@ResponseBody

@RequestMapping("/setContentType")

public void setContentType(HttpServletResponse response) throws IOException {

    response.setContentType("text/html"); // 设置响应类型为 HTML

    response.getOutputStream().write("<h1>setContentType</h1>".getBytes(StandardCharsets.UTF_8));

}

 

 

-  HttpServletResponse :用来设置响应头、响应体等。这里设置  Content-Type  为  text/html ,然后写响应体。

 

@RequestMapping 注解的属性

 

- value:指定映射的 URL 路径,是默认属性。

- method:指定支持的请求方法(GET、POST 等)。

- consumes:指定请求体的 MIME 类型(比如  application/json ),只有符合的请求才会被处理。

- produces:指定响应体的 MIME 类型(比如  application/json ),设置返回的  Content-Type 。

- params:指定请求中必须包含某些参数,才会被处理。

- headers:指定请求头中必须包含某些值,才会被处理。

 

1.2国内企业主流开发模式(前后端分离)

 

- 前后端代码完全分开:前端代码(Vue、React 等)和后端代码(SpringBoot 等)在不同项目里,甚至不同团队开发。

- 部署方式:前端单独部署(比如用 Nginx),后端也单独部署(比如用 Tomcat、Jar 包)。

- 对比课堂案例:课堂里的案例前后端没完全分离,前端页面在后端项目里(比如  static/index.html )。

- 微服务模式:更彻底的分离,每个服务独立开发、部署、运维。

 

1.3项目开发流程

 

1. 需求调研:和 PM(产品经理)、业务方沟通,明确需求文档(目标、功能、逻辑等)。

2. 分工干活:

- 方案设计:概要设计、详细设计、数据库设计、接口设计。

- 方案 review:团队评审方案,发现问题及时改。

- 开发:写代码实现功能。

- 自测:开发自己测试,保证功能没问题。

3. 提测:把功能交给测试人员测试。

4. 联调:前后端、服务间联调,保证整个流程跑通。

5. 上线:把代码部署到生产环境。

 

- 接口文档:企业开发中,接口文档一般一次性全部提供;课堂里是一个接口一个接口提供。

- 敏捷开发:尽量做到短期交付(比如两周一个迭代),别 delay。

 

二、Session、请求头与返回页面

 

2.2Session 的工作流程

 

1. 客户端发请求:第一次请求时,服务器还没给客户端分配 Session。

2. 服务器创建 Session:服务器生成 Session,把 SessionID 通过  Set-Cookie  头返回给客户端。

3. 客户端带 Cookie 发请求:后续请求时,客户端会自动带上包含 SessionID 的 Cookie。

4. 服务器查 Session:服务器根据 SessionID 找到对应的 Session,处理请求(比如获取用户信息)。

 

- Session 存储:默认存在服务器内存里,服务器重启后 Session 就没了(可以用 Redis 等持久化 Session)。

 

2.2request.getSession() 方法

 

- request.getSession():

- 默认  create = true ,如果没有 Session,就创建一个新的。

- 示例:

@RequestMapping("/getSession")

public String getSession(HttpServletRequest request) {

    HttpSession session = request.getSession(); // 没有就创建

    String name = (String) session.getAttribute("name");

    Integer age = (Integer) session.getAttribute("age");

    return "Session 中的数据,name: " + name + ",age: " + age;

}

 

- request.getSession(false):

-  create = false ,如果没有 Session,就返回  null ,不创建新的。

- 示例:

@RequestMapping("/getSession2")

public String getSession2(HttpServletRequest request) {

    HttpSession session = request.getSession(false); // 没有就返回 null

    if (session == null) {

        return "没有 Session";

    }

    String name = (String) session.getAttribute("name");

    Integer age = (Integer) session.getAttribute("age");

    return "Session 中的数据,name: " + name + ",age: " + age;

}

 

 

2.3请求头相关(@RequestHeader)

 

- @RequestHeader:从请求头中取参数。

- 示例 1(取单个请求头):

@RequestMapping("/getHeader")

public String getHeader(HttpServletRequest request) {

    String userAgent = request.getHeader("User-Agent");

    return "Header 中的数据,User-Agent: " + userAgent;

}

 

- 示例 2(用 @RequestHeader 注解):

@RequestMapping("/getHeader2")

public String getHeader2(@RequestHeader("User-Agent") String userAgent) {

    return "Header 中的数据,User-Agent: " + userAgent;

}

 

 

-  @RequestHeader("User-Agent")  直接把请求头中  User-Agent  的值绑定到  userAgent  变量。

 

2.4返回页面(@Controller vs @RestController)

 

- @Controller:方法返回值会被解析为页面路径,跳转到对应页面。

- 示例:

@Controller

@RequestMapping("/return")

public class ReturnController {

    @RequestMapping("/returnPage")

    public String returnPage() {

        return "index.html"; // 跳转到 static/index.html 页面

    }

}

 

 

- 方法返回  index.html ,会跳转到  static/index.html  页面(默认请求路径是  index.html/index.htm/index.jsp )。

- @RestController:方法返回值会转成 JSON 或字符串,不会跳转页面。

- 区别: @Controller  配合  @ResponseBody  等于  @RestController 。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914927.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构排序算法总结(C语言实现)

以下是常见排序算法的总结及C语言实现&#xff0c;包含时间复杂度、空间复杂度和稳定性分析&#xff1a;1. 冒泡排序 (Bubble Sort)思想&#xff1a;重复比较相邻元素&#xff0c;将较大元素向后移动。 时间复杂度&#xff1a;O(n)&#xff08;最好O(n)&#xff0c;最坏O(n)) 空…

嵌入式学习-PyTorch(2)-day19

很久没有学了&#xff0c;期间打点滴打了一个多星期&#xff0c;太累了&#xff0c;再加上学了一下Python语法基础&#xff0c;再终于开始重新学习pytorchtensorboard 的使用import torch from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs…

Prompt Engineering 快速入门+实战案例

资料来源&#xff1a;火山引擎-开发者社区 引言 什么是 prompt A prompt is an input to a Generative AI model, that is used to guide its output. Prompt engineering is the process of writing effective instructions for a model, such that it consistently generat…

「源力觉醒 创作者计划」_文心开源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得

文章目录背景操作流程开源模型选择算力服务器平台开通部署一个算力服务器登录GPU算力服务器进行模型的部署FastDeploy 快速部署服务安装paddlepaddle-gpu1. 降级冲突的库版本安装fastdeploy直接部署模型&#xff08;此处大约花费15分钟时间&#xff09;放行服务端口供公网访问最…

P10719 [GESP202406 五级] 黑白格

题目传送门 前言&#xff1a;不是这样例有点过分了哈&#xff1a; 这是我没考虑到无解的情况的得分&#xff1a; 这是我考虑了的得分&#xff1a; 总而言之&#xff0c;就是一个Subtask 你没考虑无解的情况&#xff08;除了Subtask #0&#xff09;,就会WA一大片,然后这个Subt…

AWS RDS PostgreSQL可观测性最佳实践

AWS RDS PostgreSQL 介绍AWS RDS PostgreSQL 是亚马逊云服务&#xff08;AWS&#xff09;提供的托管型 PostgreSQL 数据库服务。托管服务&#xff1a;AWS 管理数据库的底层基础设施&#xff0c;包括硬件、操作系统、数据库引擎等&#xff0c;用户无需自行维护。高性能&#xff…

C++——set,map的模拟实现

文章目录前言红黑树的改变set的模拟实现基本框架迭代器插入源码map模拟实现基础框架迭代器插入赋值重载源码测试代码前言 set&#xff0c;map底层使用红黑树这种平衡二叉搜索树来组织元素 &#xff0c;这使得set, map能够提供对数时间复杂度的查找、插入和删除操作。 下面都是基…

LabVIEW液压机智能监控

​基于LabVIEW平台&#xff0c;结合西门子、研华等硬件&#xff0c;构建液压机实时监控系统。通过 OPC 通信技术实现上位机与 PLC 的数据交互&#xff0c;解决传统监控系统数据采集滞后、存储有限、参数调控不便等问题&#xff0c;可精准采集冲压过程中的位置、速度、压力等参数…

15. 什么是 xss 攻击?怎么防护

总结 跨站脚本攻击&#xff0c;注入恶意脚本敏感字符转义&#xff1a;“<”,“/”前端可以抓包篡改主要后台处理&#xff0c;转义什么是 XSS 攻击&#xff1f;怎么防护 概述 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的 Web 安全…

更换docker工作目录

使用环境 由于默认系统盘比较小docker镜像很容易就占满&#xff0c;需要挂载新的磁盘修改docker的默认工作目录 环境&#xff1a;centos7 docker默认工作目录: /var/lib/docker/ 新的工作目录&#xff1a;/home/docker-data【自己手动创建&#xff0c;一般挂在新加的磁盘下面】…

算法学习笔记:26.二叉搜索树(生日限定版)——从原理到实战,涵盖 LeetCode 与考研 408 例题

二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种特殊的二叉树&#xff0c;因其高效的查找、插入和删除操作&#xff0c;成为计算机科学中最重要的数据结构之一。BST 的核心特性是 “左小右大”&#xff0c;这一特性使其在数据检索、排序和索引…

共生型企业:驾驭AI自动化(事+AI)与人类增强(人+AI)的双重前沿

目录 引言&#xff1a;人工智能的双重前沿 第一部分&#xff1a;自动化范式&#xff08;事AI&#xff09;——重新定义卓越运营 第一章&#xff1a;智能自动化的机制 第二章&#xff1a;自动化驱动的行业转型 第三章&#xff1a;自动化的经济演算 第二部分&#xff1a;协…

TypeScript的export用法

在 TypeScript 中&#xff0c;export 用于将模块中的变量、函数、类、类型等暴露给外部使用。export 语法允许将模块化的代码分割并在其他文件中导入。 1. 命名导出&#xff08;Named Export&#xff09; 命名导出是 TypeScript 中最常见的一种导出方式&#xff0c;它允许你导出…

数据结构-2(链表)

一、思维导图二、链表的反转def reverse(self):"""思路&#xff1a;1、设置previous_node、current、next_node三个变量,目标是将current和previous_node逐步向后循环并逐步进行反转,知道所有元素都被反转2、但唯一的问题是&#xff1a;一旦current.next反转为向…

ros2 标定相机

一个终端执行&#xff1a; ros2 run image_tools cam2image --ros-args -p width:640 -p height:480 -p frequency:30.0 -p device_id:-1 -r /image:/camera/image_raw另一个终端执行&#xff1a;8x6 是格子角点数量&#xff0c;0.028是格子尺寸 ros2 run camera_calibration …

IsaacLab学习记录(二)

二、导入并训练自己的机器人1、urdf等其他格式转usd&#xff08;工具在./scrips/tools/&#xff09;​​​维度​​​​URDF (Unified Robot Description Format)​​​​USD (Universal Scene Description)​​​​定位​​机器人模型描述标准&#xff08;仅描述单机器人&…

基于Rust Softplus 函数实践方法

Softplus 函数 Softplus 函数是神经网络中常用的激活函数之一,定义为: ​ Softplus函数导数 ​ 是 sigmoid 函数。Softplus 处处可导,并且导数恰好是 sigmoid。 它是 ReLU 函数的平滑近似,具有连续可导的特性,适合需要梯度优化的场景。 数学特性 平滑性:导数为 Sig…

Ubuntu服务器安装Miniconda

下载 Miniconda 安装脚本&#xff08;如果能联网&#xff09;wget https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-x86_64.sh -O Miniconda3.sh安装 Miniconda 到 /opt/condabash Miniconda3.sh -b -p /opt/conda激活 conda/opt/conda/bin/conda init ba…

Java数组补充v2

一、数组基本概念1. 什么是数组数组是Java中用来存储同类型数据的固定大小的连续内存空间的数据结构。2. 数组特点固定长度&#xff1a;一旦创建&#xff0c;长度不可改变相同类型&#xff1a;所有元素必须是同一数据类型索引访问&#xff1a;通过下标&#xff08;从0开始&…

【PTA数据结构 | C语言版】前缀树的3个操作

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;利用前缀树查找给定字符串是否在某给定字符串集合 S 中。 输入格式&#xff1a; 输入首先给出一个正整数 n&#xff08;≤1000&#xff09;&#xff0c;随后 n 行&#xff0…