Spring MVC注解式控制器开发

        主要对Spring MVC的核心注解的应用进行了详细讲解,介绍了Controller和RequestMapping注解类型的相关知识。

1.注解式控制器概念

Spring2.5之前,我们都是通过实现框架提供的Controller接口来定义我们的处理器类。

Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类。并且提供了一组强大的注解:

  •       @Controller:用于标识是处理器类;

  •       @RequestMapping:用于从客户端到控制器的地址映射;

  •       @RequestParam:用于客户端参数注入到控制器的数据绑定;

  •       @ModelAttribute:请求参数到对象的绑定

 Spring3.0以上引入了对RESTfu架构风格的支持(通过@PathVariable注解和一些其他特性来支持),且又引入了更多的注解支持。

       @CookieValue:Cookie数据绑定;

       @RequestHeader:请求头数据参数绑定;

       @RequestBody:将请求Body进行绑定  HttpMessageConverter转换;

       @ResponseBody:将返回值作为响应体;

       @ExceptionHandler:声明式异常处理器 HttpMessageConverter转换;

       @PathVariable:URI模板变量的绑定

之后的spring版本每次升级,都会提供更多的注解帮助程序开发者进行快速开发,提高开发效率。

2.Spring注解版本支持

Spring2.0 开始引入注解:

  • @Required、@Repository(用于dao层)、@Aspect 等注解

spring 2.5,引入大量注解、配合配置文件中的注解(包)扫描:

  • @Component、@Service @Controller 相关

spring3.1,引入新的注解,可以不再使用xml配置ioc:

  • @Configuration  注册配置类  、@Bean 配置类中的bean注册   @Scope 作用域注解
  • @ComponentScan 用来扫描 @Controller @Service @Repository
  • @Import 增强,用在配置类上,将@Import中的类直接注册到spring中
  • @Autowired、@Qualifier 与@Autowired配合, 指定注入的bean的名称 @Autowired有一个required属性
  • @Primary有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级
  • @Enable管理第三方Bean 如@EnableScheduling 官方提供的@Enable注解包括@EnableScheduling @EnableAsync @EnablewebMvc,实际上,我们还可以自己去实现、自定义自己的@EnableXxx注解

Spring 4.X,引入:

  • @Conditional条件注解 、 @RestController(相当于@Controller+@ResponseBody) @Profile 适用的环境@PropertySource 加载配置文件

Spring5.x

  • @Indexed 用来提升性能的注解

3.案例实践:使用注解完成Spring MVC的控制器基本功能

案例说明:通过一个登陆验证的案例,使用Spring MVC注解的方式来实现控制器及其请求路径映射功能,体会注解在Spring MVC开发中的特点。

3.1 配置SpringMVC的核心映射文件springmvc-servlet.xml。

<?xml version="1.0" encoding="UTF-8"?><!--增加xmlns:context命名空间及其约束:注解的相关配置  --><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 开启注解扫描--><context:component-scan base-package="com.inspur.action"></context:component-scan></beans>

3.2 新建后台登录处理器类LoginController.java。

@Controller
public class LoginController{@RequestMapping("/loginCheck.action")public ModelAndView loginCheck(HttpServletRequest request,HttpServletResponse response) throws Exception {  ModelAndView mav=new ModelAndView();String name=request.getParameter("userName");String password=request.getParameter("password");if("123".equals(password)){mav.addObject("info", "欢迎你"+name);mav.setViewName("success.jsp");}return mav;}
} 

3.3 新建后台登录界面login.jsp。

<body><h3>登录页面</h3><form action="/Springmvc_Ch12/loginCheck.action" method="post">请输入用户名:<input type="text" name="userName"/><br/>请输入密码:<input type="password" name="password"/><br/><input type="submit" value="点击登录"/></form>
</body>

3.4 使用注解对请求方式进行匹配处理。

@RequestMapping(value="/test.action",method={RequestMethod.GET})public String test(){System.out.println("hello success");return "success.jsp";}

4.使用注解完成Spring MVC的参数绑定功能

        Spring MVC框架为了提高开发者的开发效率,提供了很多的参数绑定功能,这些功能为开发者节约了大量的重复工作。

4.1 Spring MVC默认支持的参数绑定。

        在前面的用户登录案例中,当路径匹配成功后,程序进入具体的业务方法,此时进行登录模拟验证时,我们直接使用了HttpServletRequest request对象进行获取了页面参数值。这里的request对象就是框架默认封装好,供开发者直接使用的对象,除此之外,还有HttpServletResponse对象,HttpSession对象也是比较常用的默认绑定参数对象。

4.2  通过@RequestParam注解,实现类型基本类型和字符串参数值的绑定。

         Spring MVC框架为方便实际开发时,大量页面参数值需要通过请求对象传递到后端,使用注解的形式直接将参数数据注入到后端程序中,但必须按照一定的规则才能顺利完成绑定和注入。

<form action="/springMvc01/user/register" method="post">用户名:<input type="text" name="userName"><br>密码:<input type="password" name="password"><br><input type="submit" value="注册"></form>
@PostMapping("/register")public Result register(@RequestParam("userName")  String username, @RequestParam String password) {System.out.println(username+": "+password);return Result.success();}

4.3  通过@RequestParam注解,实现引用类型参数值的绑定。

        在实际开发中,有时从前端页面需要的数据非常杂乱,此时如果将这些数据封装成对象,则在后台接收数据时就相对方便,节约了后台代码的书写量。Spring MVC的参数映射注解同样提供了这样的功能。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Integer userId;private String username;private String password;
}
@PostMappingpublic Result addUser(User user) {// 添加用户userService.addUser(user);return Result.success("添加用户成功");}

5.使用注解完成Spring MVC参数绑定时的类型转换

        Spring MVC框架的参数绑定功能,对提高开发效率提供了非常大的帮助,在实际开发中,页面参数都是以字符串的类型传递的,而在后台控制器中,需要的数据类型可能是多种多样的。有些类型必须由程序员进行手动的转换,而有些常见的类型,如字符串类型到int类型的转换,非常常见。为了让程序员把更多的 精力放到业务逻辑上,框架提供了一些类型的转换机制。

5.1  参数类型的自动转换

      Spring MVC框架对页面输入的字符串类型数据,如果通过@RequestParam注解需要转换为基本类型数据,则进行自动转换。

5.2  字符串参数与其他非基本类型的转换

      Spring MVC框架除了提供对一些简单类型的自动转换之外,针对实际开发中常见的一些非基本类型,如日期类型等,也提供了与字符串类型之间的转换工具。

6.Spring MVC框架中常用的注解及属性配置

6.1 @RequestParam

6.1.1 功能

用于将请求参数区数据映射到功能处理方法的参数上。

例子:public String requestparam1(@RequestParam String username)

①如果请求中包含username参数(如/requestparam1?username=zhang),则自动传入。

②也可以使用@RequestParam("username")明确告诉Spring Web MVC使用username进行入参

6.1.2 主要参数

value参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;

required是否必须,默认是true,表示请求中一定要有相应的参数,否则将报400错误码;

defaultValue默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“#{systemProperties[‘java.vm.version’]}”

例子1public String test(@RequestParam(value="username",required=false) String username)

表示请求中可以没有名字为username的参数,如果没有默认为null,需注意如下几点:

原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。

Boolean包装类型类型:默认Boolean.FALSE,其他引用类型默认为null。 

6.2 @PathVariable

6.2.1 功能

用于将请求URL中的模板变量映射到功能处理方法的参数上

例子:

@RequestMapping(value="/users/{userId}/topics/{topicId}")public String test(@PathVariable(value="userId") int userId,@PathVariable(value="topicId") int topicId)

        如请求的URL为“控制器URL/users/123/topics/456”,则自动将URL中模板变量{userId}和{topicId}绑定到通过@PathVariable注解的同名参数上,即入参后userId=123、topicId=456

6.3 @CookieValue

6.2.3 功能

用于将请求的Cookie数据映射到功能处理方法的参数上

例子1

public String test(@CookieValue(value="JSESSIONID", defaultValue="") String sessionId)

如上配置将自动将JSESSIONID值入参到sessionId参数上,defaultValue表示Cookie中没有JSESSIONID时默认为空。

例子2

public String test2(@CookieValue(value="JSESSIONID", defaultValue="") Cookie sessionId)

传入参数类型也可以是javax.servlet.http.Cookie类型。

@CookieValue也拥有和@RequestParam相同的三个参数,含义一样。

6.4 @RequestHeader

6.4.1 功能

用于将请求的头信息区数据映射到功能处理方法的参数上

例子:

@RequestMapping(value="/header")public String test(@RequestHeader("User-Agent") String userAgent,@RequestHeader(value="Accept") String[] accepts){}

如上配置将自动将请求头“User-Agent”值入参到userAgent参数上,并将“Accept”请求头值入参到accepts参数上。

@RequestHeader也拥有和@RequestParam相同的三个参数,含义一样。

7.Spring MVC框架中控制器向View传参

几种方法:

①Servlet api 中的 HttpServletRequest对象,在SpringMvc中已不推荐。

②ModelAndView 对象:通过addObject方法添加数据, setViewName 设置视图。

③ModelMap 对象:ModelMap对象与request对象相似,可以采用addAttribute()方法来传递参数,向ModelMap对象中添加key和value,其实就是在向request域中添加key和value,与Servlet解耦合。

④ Model 对象:在执行方法的参数列表中,声明一个Model对象,通过addAttribute进行添加。

⑤ Map 集合:在执行方法的参数列表中,声明一个Map集合,并向其中put()仅key和value,就可以被springmvc解析成向request域中传递值。仅仅使用一个简单的map集合,就可以完成对request对象的操作。

8.REST简介

        REST(表征状态转移)是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。

  • 对站点资源的CRUD操作:查询,添加,更新,删除
  • http请求的方式:GET, POST, PUT, DELETE

        REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表征。获得这些表征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态,所谓表征状态转移。

如果一个架构符合REST原则,就称它为RESTful架构。

8.1 SpringMVC对REST的支持

       org.springframework.web.filter.HiddenHttpMethodFilter过滤器可以对请求方式进行扩展,支持PUT和DELETE

REST特点

(1)REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML以及HTML这些现有的广泛流行的协议和标准。

(2)资源是由URI来指定

(3)对资源的操作包括获取、创建、修改和删除资源

(4)通过操作资源的表现形式来操作资源

REST的优点

(1)可以利用缓存Cache来提高响应速度

(2)通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性

(3)浏览器即可作为客户端,简化软件需求

(4)相对于其他叠加在HTTP协议之上的机制,REST的软件依赖性更小

(5)不需要额外的资源发现机制

(6)在软件技术演进中的长期的兼容性更好

8.2 REST风格控制器注解

8.2.1 @RestController

   @RestController 是 Spring MVC 中用于构建 RESTful Web 服务 的核心注解,它是 @Controller 和 @ResponseBody 的组合注解,专门设计用于简化 REST API 的开发。

@RestController@RequestMapping("/orders")public class OrderController {@GetMapping("/{id}")public Order getOrderById(@PathVariable int id) {Order order = orderService.getOrderById(id);return order;}}

        使用 @RestController 注解标记类,并在方法上使用 @GetMapping 注解定义了一个 GET 请求的处理方法。方法的返回值是 Order 类型的对象,它将会直接序列化为 JSON 格式的数据,并作为 HTTP 响应的主体内容返回给客户端。

注意:需要加入jackson的依赖包: jackson-core、jackson-databind、jackson-annotations

        @RestController其实是@Controller+@ResponseBody的组合

@Controller@RequestMapping("/orders")public class OrderController {@GetMapping("/{id}")@ResponseBodypublic Order getOrderById(@PathVariable int id) {// 从数据库中获取订单信息Order order = orderService.getOrderById(id);return order;}}

        使用 @Controller 注解标记类,并在方法上使用 @GetMapping 注解定义了一个 GET 请求的处理方法。在方法上使用 @ResponseBody 注解,表示方法的返回值应该作为响应的主体内容,而不是解析为视图。

8.2.2 @RequestBody注解

        @RequestBody 是 Spring MVC 中用于 RESTful 风格 API 的注解,主要用于处理 HTTP 请求体(Request Body)中的数据,并将其绑定到 Java 对象上。

@RestController@RequestMapping("/api")public class MyController {@PostMapping("/user")public String createUser(@RequestBody User user) {// 处理接收到的User对象// ...return "User created: " + user.getName();}}

        在上述示例中,@PostMapping("/user")将createUser()方法映射到POST请求的路径/api/user上。@RequestBody注解将请求体中的内容绑定到User对象上,Spring会自动根据请求的Content-Type将请求体转换为User对象。

        请注意,为了使@RequestBody注解生效,需要确保项目中已配置了适当的HttpMessageConverter,以便进行请求体到Java对象的转换。通常,Spring 会自动配置适当的转换器。

8.3 两种控制器注解的区别

  • @RestController 是 @Controller 和 @ResponseBody 的组合注解,用于创建 RESTful 风格的 API。
  • @RestController 返回的数据会直接作为响应的主体内容(JSON 或 XML),不进行页面跳转或视图解析
  • @Controller 用于传统的 MVC 架构,负责处理请求并返回视图作为响应。
  • @Controller 方法通常需要配合 @ResponseBody 注解,才能将返回值作为响应的主体内容。

        传统的springMVC一般就需要直接返回视图,而现在新兴的前端技术vue在项目中为前后端分离的架构,前端框架负责处理数据和渲染页面,而后端 API 则负责提供数据即可,所以对返回视图的要求也就比较少了。

9. 实验:通过注解式控制器实现CURD操作

前后端分离:注解式控制器实现CURD操作https://download.csdn.net/download/m0_74808313/90746506

10. HTTP四种常见请求与MVC参数绑定如何规范使用

HTTP中常用的4种请求方式——前端如何发送?后端怎么接受?-CSDN博客https://blog.csdn.net/m0_74808313/article/details/141229920

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

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

相关文章

thonny提示自动补全功能

THONNY IDE 自动补全功能配置 在 Thonny IDE 中启用和优化自动补全功能可以显著提升编程体验。为了确保该功能正常工作&#xff0c;需要确认几个设置选项。 配置自动补全 Thonyy IDE 的自动补全默认情况下是开启的。如果发现自动补全未按预期运行&#xff0c;可以通过调整首选…

D. 例题3.2.2 整数划分问题

题目描述 将正整数n表示成一系列正整数之和&#xff1a;nn_1n_2...n_knn1​n2​...nk​&#xff0c;其中8\geq n_1\geq n_2\geq ...\geq n_k\geq 18≥n1​≥n2​≥...≥nk​≥1&#xff0c;k\geq1k≥1。正整数n的这种表示称为正整数n的划分。 例如正整数6有如下11种不同的划分…

电脑RGB888P转换为JPEG方案 ,K230的RGB888P转换为JPEG方案

K230开发板本身具备将RGB888P转换为JPEG的能力&#xff0c;但需要正确调用硬件或软件接口。以下是具体分析及解决方案&#xff1a; 一、K230原生支持性分析 1. 硬件支持 K230的NPU&#xff08;神经网络处理器&#xff09;和图像处理单元&#xff08;ISP&#xff09;理论上支持…

图解 Git 工作流:理解 Rebase、Merge 与 Pull Request 的区别

图解 Git 工作流&#xff1a;理解 Rebase、Merge 与 Pull Request 的区别 在多人协作开发中&#xff0c;选择合适的 Git 分支管理策略至关重要。Merge、Rebase 和 Pull Request 是最常见的三种方式&#xff0c;它们本质不同&#xff0c;使用场景也不同。 本文将通过流程图&am…

Dart和Go语言特征对比

文章目录 Dart 和 Go 语法对照表字符串常用方法对照列表(数组/切片)常用方法对照Map (字典/哈希表) 使用对照IO 操作对照文件操作标准输入输出网络IO 主要差异说明 有同事说&#xff0c;我前端用Flutter&#xff0c;后端用Golang&#xff0c;都师出名门。但两个语言还是老打架&…

ActiveMQ 集群搭建与高可用方案设计(二)

五、高可用方案设计与优化 &#xff08;一&#xff09;Zookeeper 在 ActiveMQ 集群中的应用 作用&#xff1a;在 ActiveMQ 集群中&#xff0c;Zookeeper 扮演着至关重要的角色。它主要用于选举 Master 节点&#xff0c;通过其内部的选举机制&#xff0c;从众多的 ActiveMQ Br…

【项目归档】数据抓取+GenAI+数据分析

年后这两个月频繁组织架构变动&#xff0c;所以博客很久没更新。现在暂时算是尘埃落定&#xff0c;趁这段时间整理一下。 入职九个月&#xff0c;自己参与的项目有4个&#xff0c;负责前后端开发&#xff0c;测试&#xff0c;devops&#xff08;全栈/doge&#xff09;&#xff…

服务器热备份,服务器热备份的方法有哪些?

服务器热备份是保障业务连续性的重要技术手段&#xff0c;通过实时数据同步和快速故障切换&#xff0c;确保在主服务器故障时备份服务器能无缝接管。以下是常见的服务器热备份方法及其核心要点&#xff1a; 双机热备&#xff08;Active-Standby/Active-Active&#xff09; 主备…

【AI平台】n8n入门6:调用MCP服务(非社区节点)

前言 前边用n8n搭建一个MCP服务&#xff0c;现在&#xff0c;用n8n调用其他服务商提供的MCP服务。本文以高德地图服务为例&#xff0c;记录一下操作过程。 实现案例功能 MCP是啥 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropi…

基于ArduinoIDE的任意型号单片机 + GPS北斗BDS卫星定位

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.1 器件选择1.2 接线方案 二、驱动实现2.1 核心代码解析&#xff08;arduino/ESP32-S3&#xff09; 三、坐标解析代码四、典型问题排查总结 前言 北斗卫星导航…

经典算法 最小生成树(prim算法)

最小生成树 题目描述 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和。如果最小生成树不存在&#xff0c;则输出 impossible。 给定一张边带权的无向图 G (V, E)&#xff0c;其中&#xff1a…

LeetCode算法题 (设计链表)Day16!!!C/C++

https://leetcode.cn/problems/design-linked-list/description/ 一、题目分析 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引…

《解锁GCC版本升级:开启编程新世界大门》

《解锁GCC版本升级:开启编程新世界大门》 一、引言:GCC 版本升级的魔法钥匙 在编程的广阔天地里,GCC(GNU Compiler Collection)宛如一座灯塔,为无数开发者照亮前行的道路。它是一款开源且功能强大的编译器集合,支持 C、C++、Objective - C、Fortran、Ada 等多种编程语言…

toLua笔记

基本 LuaState luaStatenew LuaState(); luaState.Start(); luaState.DoString("xxx"); luaState.DoFile("yyy.lua"); luaState.Require("zzz");//不要加.lua后缀 luaState.CheckTop();//检查解析器栈顶为空 luaState.Dispose(); luaStatenull;…

go实现双向链表

需求 实现双向链表的节点生成、正反向遍历、指定删除。 实现 package mainimport ("fmt" )type zodiac_sign struct {number intdizhi stringanimal stringyear intprevious *zodiac_signnext *zodiac_sign }// 添加 // func add_node_by_order(pr…

AI实践指南:AGENT、RAG和MCP在Java中的简单实现

在当今AI快速发展的时代&#xff0c;有几个核心概念正在改变我们构建智能应用的方式。本文将用简单易懂的语言介绍三个重要概念&#xff1a;AGENT&#xff08;AI代理&#xff09;、RAG&#xff08;检索增强生成&#xff09;和MCP&#xff08;多通道感知&#xff09;&#xff0c…

解决VMware虚拟机能搜索到网页但打不开的问题

&#x1f334; 问题描述 很奇怪&#xff0c;不知道为什么&#xff0c;我安装的Windows 10虚拟机能在浏览器中搜索到网页&#xff0c;但点击具体的网页链接就是死活不能加载出来&#xff0c;如下图所示&#xff1a; 点击第一个链接&#xff0c;加载了四五分钟&#xff0c;结果就…

JVM性能调优的基础知识 | JVM内部优化与运行时优化

目录 JVM内部的优化逻辑 JVM的执行引擎 解释执行器 即时编译器 JVM采用哪种方式&#xff1f; 即时编译器类型 JVM的分层编译5大级别&#xff1a; 分层编译级别&#xff1a; 热点代码&#xff1a; 如何找到热点代码&#xff1f; java两大计数器&#xff1a; OSR 编译…

什么是多租户系统

随着云计算和 SaaS&#xff08;Software as a Service&#xff09;模式的普及&#xff0c;多租户架构&#xff08;Multi-Tenant Architecture&#xff09;成为 SaaS 产品设计中的核心模式之一。多租户架构允许多个用户&#xff08;租户&#xff09;共享同一套基础设施和应用&am…

多线程系列三:这就是线程的状态?

1.认识线程的状态 NEW&#xff1a;Thread对象已经创建好了&#xff0c;但还没有调用start方法在系统中创建线程 RUNNABLE&#xff1a;就绪状态&#xff0c;表示这个线程正在CPU上执行&#xff0c;或准备就绪&#xff0c;随时可以去CPU上执行 BLOCKED&#xff1a;表示由于锁竞争…