Spring基础——使用注解开发SpringMVC

目录

  • 配置SpringMVC的初始化信息
    • 配置ServletWebApplicationContext
    • 配置RootWebApplicationContext
    • 配置ServletContext
  • 创建Controller控制器
    • 配置Controller响应路径
    • 接收用户传递参数
      • 接收JSON数据
      • 接收简单类型
        • 对象封装参数
      • 接收数组类型
  • Restful

文章源码仓库:Spring Learn Repo

配置SpringMVC的初始化信息

  • 之前说过,SpringMVC中使用两个WebApplicationContext:ServletWebApplicationContext和RootWebApplicationContext对Web上下文环境进行分层管理。
    • ServletWebApplicationContext:用于管理Servlet相关的Bean,如控制器,视图解析器等,每个Servlet(通常是DispatcherServlet)都有自己的ServletWebApplicationContext;并且Scope与Servlet相对应
    • RootWebApplicationContext:是整个Web应用的上下文,用于管理应用程序级别的Bean,如Service,Repositories等,RootWebApplicationContext可以被多个Servlet共享,且Scope与整个Web应用相同。
      SpringMVC

配置ServletWebApplicationContext

  • 上文提到过每个DispatcherServlet都有一个ServletWebApplicationContext用于存储Servlet的相关Bean,因此我们需要扫描Controller注解标记的Bean
  • @EnableWebMvc:值得注意的是,这里还需要Spring MVC开启基于注解的基础功能以及一些默认配置。
    • 通过此注解SpringMVC会自动注册包括DefaultAnnotationHandlerMapping,AnnotationMethodHandlerAdapter等用于处理注解映射和处理方法的适配器。
    • 并且允许在Controller标记类的类和方法上使用@RequestMapping,@RequestParam等HTTP请求与响应方面的注解驱动如果你发现RequestParam没法使用的话可以查看是否开启了此注解
    • 而且此注解还提供了一些常见的用于处理请求参数的类型转换,如字符串转数字,json格式之间的转换等
@Configuration
@ComponentScan({"com.nobugnolife.controller"})
@EnableWebMvc
public class SpringMvcConfig {
}

配置RootWebApplicationContext

  • 上文说过RootWebApplicationContext里面是Web用于管理应用程序级别的Bean,如Service,Repositories等,而我们这里只是演示SpringMVC的功能,所以就不配置持久层了
@Configuration
@ComponentScan({"com.nobugnolife.service"})
public class SpringConfig {
}

配置ServletContext

  • Spring提供了WebApplicationInitializer接口可以让我们注册并初始化DispatcherServlet
public class MyWebApplicationInitializer implements WebApplicationInitializer {@Overridepublic void onStartup(ServletContext servletContext) {// 加载ServletWebApplicationContext配置信息AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();// 注册SpringMVC的配置类context.register(SpringMvcConfig.class);// 创建并注册DispatcherServletDispatcherServlet servlet = new DispatcherServlet(context);ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);registration.setLoadOnStartup(1);registration.addMapping("/");}
}
  • 官方文档里提供了一个简化的创建方案通过继承 AbstractAnnotationConfigDispatcherServletInitializer 并覆写特定的方法,用以简化配置开发
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}/** 过滤器* */
}

创建Controller控制器

  • 在控制层Controller中我们需要运用到如下这些注解:
    • @Controller:Controller Bean注解,用于标记controller中的类
    • @RequestMapping:在之前的文章中说过SpringMVC对用户发出的请求会有HandlerMapping解析路由选择对应处理器进行处理,因此我们在创建处理器Controller的时候也需要提供处理器对应的URL路径,通过 @RequestMapping,如果不提供默认为当前上下文的根路径
      • @PostMapping:@RequestMapping(value=“”, method = ReuqestMethod.POST)简化写法
      • @PutMapping:@RequestMapping(value=“”, method = ReuqestMethod.PUT)简化写法
      • @DeleteMapping:@RequestMapping(value=“”, method = ReuqestMethod.DELETE)简化写法
      • @GetMapping:@RequestMapping(value=“”, method = ReuqestMethod.GET)简化写法
    • @RequestParam:通过路径传参,允许接受用户从URL路径中传入的参数,并写入到形参中如:https://www.baidu.com/search?context=csdn,那么这里传入了个参数名为context,内容为csdn的信息,并且在SpringMVC中会自动转化成形参类型
    • @RequestBody:通过请求体传参,允许接受用户将信息写入请求体中,可以避免直接从URL中暴露参数信息,但一般接收的时候会通过post方式进行接收
    • @PathVariable:URL模板变量,属于简化了URL路径传参的方式,允许用户通过URL路径解析的格式将参数动态传入,但需要指明传入参数的位置如:https://www.baidu.com/search/{context},这里用户传入参数只需要在search/csdn,SpringMVC会自动将{context}路径对应的csdn解析到context参数中
    • @ResponseBody:将返回数据直接作为响应参数进行返回,之前文章说过,在SpringMVC中,DispatcherServlet会将我们最终处理完的数据注入到视图模型中并返回给用户,因此正常来说Controller的返回数据会被当成URL路径解析,而如果我们不想返回视图,只想返回我们的处理数据的话则需要用到这个注解
    • @RestController:将@ResponseBody与@Controller进行合并,用于简化开发代码

配置Controller响应路径

  • 通过@RequestMapping配置URL的解析路径(从SpringMCV的ServletContext配置的根路径开始解析),@RequestMapping可以作用到类上(作用到类上代表当前Controller类中所有的方法都会通过此路径),也可以作用到方法上(方法上的路径会自动配置到类的路径后边)
  • 比如这里我们配置一个WebController,通过访问/index/hello资源路径让服务器返回跳转到index.jsp
@Controller
@RequestMapping("/index")
public class WebController {/** 如果没有添加RequestBody则会把返回字符串当成路径访问服务器文件* */@RequestMapping("/hello")public String toIndex(){System.out.println("跳转到index.jsp");return "index.jsp";}
}

接收用户传递参数

接收JSON数据

  • JSON是一种轻量级的数据交换格式,基于JavaScript语法的子集,但如今是可独立于JavaScript使用,通常用于Web应用程序中的数据交换和存储,包括Restful中的数据传输,Ajax请求的数据格式,配置文件等,因为其简洁性和可读性,也被广泛用于日志,数据序列化等领域
    • 简洁性:JSON使用简洁的文本格式表示数据
    • 可读性:JSON数据格式有良好的可读性,易于被理解
    • 自我描述性:JSON支持多种数据类型,包括数字,字符串,数组,对象等,可以表示丰富的数据结构
    • 易于解析:JSON数据可以通过大多数编程语言的解析器轻松解析为内部数据结构
  • JSON的数据由键值对组成,其中键(Key)为字符串,值(Value)为表示的数据,一个完整的JSON对象使用{}表示,键值对之间使用:分割,JSON中数组使用[]表示,不同元素之间使用,分割,以下为JSON的简单示例:
{"name": "John","age": 30,"isStudent": false,"friends": ["Alice", "Bob", "Charlie"],"address": {"city": "New York","zipcode": "10001"}
}
  • 在SpingMVC中要想接收JSON数,官方文档给出Spring提供支持Jackson Json的依赖但是功能比较简单,不具备Jackson库提供的一些高级特性,同样SpringMVC也可以使用其他JSON转化库如:
    • Gson:Goolge提供的JSON转化,功能齐全,转化方便
    • FastJson:阿里提供的高性能JSON转化,转化非常快,但转化复杂类型的对象容易出错,可以用Gson将Bean转为Json保证数据正确,用FastJson将Json转Bean提高性能
    • Jackson Json:Jackson是一个成熟的,广泛使用的JSON处理库,其中提供了丰富的功能机制,也支持各种高级特性,在性能上处理大量JSON数据格式会比Gson更快,在支持性与功能性上又比FastJson更多
  • 这里我们导入Jackson库
<properties><jackson.version>2.15.2</jackson.version>
</properties><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version>
</dependency>
  • SpringMVC使用@RequestBody会自动将传入的Json数据转化成对象,并且会对有@ResponseBody的方法返回值自动转化成Json数据返回
@Data
public class Product {private String productName;private Integer productId;private Double value;
}
@PostMapping
public String addProduct(@RequestBody Product product) {System.out.println("请求访问商品添加接口,当前商品信息为:" + product);return "商品信息添加成功";
}
  • 测试数据
    test_json
    test_json_result

接收简单类型

  • 对于从URL传入的参数,SpringMVC能自动传入到对应的参数名中同时也可以使用@RequestParam对传入的参数名与形参名进行映射
@RequestMapping("/login")
@ResponseBody
public String userLogin(@RequestParam("username") String username, String password) {if (Objects.equals(password, "123")) {System.out.println(username + "登录成功");}else {System.out.println("用户密码错误");}return username;
}
  • 测试输出
    attribute
    arrtribute_test
对象封装参数
  • SpringMVC同时也支持将多个参数封装进类中(需类提供set方法),并将传入数据自动配置到类的属性中
@RequestMapping("/account/login")
@ResponseBody
public String accountLogin(Account account){System.out.println(account.getUserName()+"\n用户密码:"+account.getPassword());return "登录成功";
}
  • 测试输出
    objectobject_test

接收数组类型

  • 数组类型发送方式为:参数1=xxx&参数1=xxx参数1=xxx,SpringMVC会自动将参数1的数据转化为参数1数组中,数组可以是List也可以是数组[]
@RequestMapping("/cart")
@ResponseBody
public String addToCart(@RequestParam List<Integer> productIds){System.out.println(productIds);return productIds.toString();
}

list
list_test

Restful

  • Restful(Representational State Transfer) 是一种软件架构风格,用于设计网络应用程序,本身是基于一组原则和约束,用于提高系统的可伸缩性,简化通信,提高可见性并降低应用复杂性。其中Restful架构包含的关键约束有:

    • 无状态性(Statelessness):客户端每个请求都必须包含服务器处理所需的所有信息,服务器不应保存客户端的状态,每个请求都必须是独立的。
    • 基于资源(Resource):资源是Restful架构的核心,资源是应用程序中的实体或服务,如用户,订单,产品等,每个资源都应该有唯一的资源路径定位符(URL)
    • 表现层状态转化(Representational State Transfer):表现层是资源(数据或功能)当前状态的表现形式,客户端通过与资源的表现层交互来实现资源的状态转化,通常使用Json或XML作为表现层(简单点说就是使用Json数据与服务端进行交互通信)。
    • 统一接口(Uniform Interface):Restful应该有一个统一的接口,一提高系统的可见性。
    操作对应接口
    通过xx获取指定数据GET
    获取全部数据GET
    添加数据POST
    修改数据PUT
    删除数据DELETE
    • 按需可缓存性:Restful服务能够使用缓存来提高性能,服务器与客户端之间的通信应该标识哪些信息是可以缓存的,并在适当的时候使用缓存
    • 分层系统:构建Restful服务时使用分层系统,每层都提供特定的功能,每个层都只知道与其直接相邻的层的信息,从而提高了系统的可伸缩性(SpringMVC本身就是一个分层架构
  • 以下为Restful风格样例,@RestController里包含@RequestBody与@Controller,并且product有属于自己的资源访问路径/products,客户端与服务端交互使用json数据格式

@RestController
@RequestMapping("/products")
public class ProductController {@Autowiredprivate ProductService productService;@PostMappingpublic Result saveProduct(@RequestBody Product product) {boolean flag = productService.saveProduct(product);return new Result(flag ? Code.SAVE_OK.getCode() : Code.SAVE_ERROR.getCode(), flag);}@PutMappingpublic Result updateProduct(@RequestBody Product product) {boolean flag = productService.updateProduct(product);return new Result(flag ? Code.UPDATE_OK.getCode() : Code.UPDATE_ERROR.getCode(), flag);}@DeleteMapping("/{id}")public Result deleteProduct(@PathVariable Integer id) {boolean flag = productService.deleteProductById(id);return new Result(flag ? Code.DELETE_OK.getCode() : Code.DELETE_ERROR.getCode(), flag);}@GetMapping("/{id}")public Result getProduct(@PathVariable Integer id) {Product product = productService.getProductById(id);boolean flag = (product != null);String msg = flag ? "数据查询成功" : "数据查询失败,请重试!";return new Result(flag ? Code.GET_OK.getCode() : Code.GET_ERROR.getCode(), product, msg);}@GetMappingpublic Result getAll() {List<Product> list = productService.getAllProducts();boolean flag = (list != null);String msg = flag ? "数据查询成功" : "数据查询失败,请重试!";return new Result(flag ? Code.GET_OK.getCode() : Code.GET_ERROR.getCode(), list, msg);}}

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

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

相关文章

2024年云服务器ECS价格表出炉——阿里云

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

Python Web开发记录 Day9:Django part3 用户管理

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据库准备2、用户列表3、新建用户4、编辑用…

钡铼技术R40路由器隧道通风控制及环境监测系统集成方案

一、背景介绍 随着城市化进程的加快&#xff0c;地下交通建设越来越重要。地下隧道作为城市交通的重要组成部分&#xff0c;其安全运行和环境质量直接关系到人们的出行体验和生活质量。为了保障隧道内空气的流通和质量&#xff0c;钡铼技术R40路由器通风控制及环境监测系统应运…

【SpringCloud微服务实战08】RabbitMQ 消息队列

MQ异步通信优缺点: 优点: 吞吐量提升:无需等待订阅者处理完成,响应更快速 故障隔离:服务没有直接调用,不存在级联失败问题 调用间没有阻塞,不会造成无效的资源占用 耦合度极低,每个服务都可以灵活插拔,可替换 流量削峰:不管发布事件的流量波动多大,都由Broker接收,…

如何利用百度SEO优化技巧将排到首页

拥有一个成功的网站对于企业和个人来说是至关重要的&#xff0c;在当今数字化的时代。在互联网上获得高流量和优质的访问者可能并不是一件容易的事情&#xff0c;然而。一个成功的SEO战略可以帮助你实现这一目标。需要一些特定的技巧和策略、但要在百度搜索引擎中获得较高排名。…

Selenium 自动化 —— 入门和 Hello World 实例

Selenium 是什么 Selenium 是一个用于自动化网页浏览器操作的工具&#xff0c;它支持多种浏览器和多种操作系统。主要用于测试 web 应用程序的功能&#xff0c;也可用于执行一些基本的浏览器操作任务&#xff0c;例如自动化表单填写、网页导航等。 Selenium 是一个开源项目&a…

天地图全国幼儿园数据下载与处理分析

概述 在看天地图服务资源的时候看到有个“幼儿园”的数据&#xff0c;好奇点开看了下&#xff0c;下载下来数据差看了下&#xff0c;数据质量还不错。本篇文章给大家分享一下这个数据的处理以及一些简单的统计分析结果。 数据下载 通过地址https://service.tianditu.gov.cn/…

WPF —— Grid网格布局

1 &#xff1a;Grid网格布局简介 Grid为WPF中最常用的布局容器, 作为View中的主要组成部分, 负责框架中整体的页面布局。 2&#xff1a;网格标签Grid.ColumnDef Grid.ColumnDefinitions自定义列 只能设置宽度 不能设置高度ColumnDefinition 每一个列可以设置宽度&#xff0c;…

机试:蛇形矩阵

问题描述: 代码示例: //蛇形矩阵 #include <bits/stdc.h> using namespace std;int main(){int n;cout << "输入样例" << endl; cin >> n;int k 1; for(int i 0; i < n; i){if( i %2 0){//单数行for(int j 0; j < n; j){ cout &…

Apache Paimon 的 CDC Ingestion 概述

CDC Ingestion 1&#xff09;概述 Paimon支持schema evolution将数据插入到Paimon表中&#xff0c;添加的列将实时同步到Paimon表&#xff0c;并且无需重启同步作业。 目前支持的同步方式如下&#xff1a; MySQL Synchronizing Table: 将MySQL中的一个或多个表同步到一个Pa…

网络原理(网络协议初识)

目录 1.网络通信基础 1.1IP地址 1.2端口号 1.3认识协议 1.4五元组 1.5 协议分层 2.TCP/IP五层&#xff08;或四层&#xff09;模型 2.1网络设备所在分层 2.2网络分层对应 3.封装和分用 1.网络通信基础 网络互连的目的是进行网络通信&#xff0c;也即是网络数据传输&#…

数据仓库为什么要分层建设?每一层的作用是什么?

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。为了更好地管理和利用这些数据&#xff0c;许多企业都建立了数据仓库。然而&#xff0c;数据仓库并非简单的数据存储工具&#xff0c;而是一个复杂的数据处理和分析系统。其中&#xff0c;分层建设是数据仓库设计的重…

【OpenCV实战】基于OpenCV中DNN(深度神经网络)使用OpenPose模型实现手势识别详解

一、手部关键点检测 如图所示,为我们的手部关键点所在位置。第一步,我们需要检测手部21个关键点。我们使用深度神经网络DNN模块来完成这件事。通过使用DNN模块可以检测出手部21个关键点作为结果输出,具体请看源码。 二,openpose手势识别模型 OpenPose的原理基于卷积神经网…

【计算机图形学】End-to-End Affordance Learning for Robotic Manipulation

对RLAfford&#xff1a;End-to-End Affordance Learning for Robotic Manipulation的简单理解 1. 为什么要做这件事 在交互环境中学习如何操纵3D物体是RL中的挑战性问题。很难去训练出一个能够泛化到具有不同语义类别、不同几何形状和不同功能物体上的策略。 Visual Afforda…

粒子群算法对pi控制器进行参数优化,随时优化pi参数以控制直流无刷电机转速。

粒子群算法对pi控制器进行参数优化&#xff0c;随时优化pi参数以取得设定直流无刷电机转速。 PSO优化PID&#xff0c;用于BLDC速度控制 仿真平台为&#xff1a;MATLAB 采用的是Simulinkm程序相配合 仿真结果以及程序示例&#xff1a;

Armv8状态寄存器

Processor state AArch64没有与ARMv7当前程序状态寄存器直接对应的寄存器(CPSR)。在AArch64中&#xff0c;传统CPSR的组件以字段的形式提供可独立访问。这些统称为处理器状态(PSTATE)。 在AArch64中&#xff0c;通过执行ERET指令从异常中返回&#xff0c;这会导致要拷贝到PSTAT…

IEEE802.11v协议介绍

IEEE802.11v协议简介 协议全称:无线网络管理(Wireless Network Management) 批准日期:2011年2月 协议状态:并入802.11-2012 协议别名:BSS过渡管理 主要功能 支持AP和STA间交换:关于RF环境和拓扑状态的信息,以协助STA进行漫游决策支持STA之间交换:关于RF环境状态的信…

嵌入式单片机学习思路感想分享

今天看到了一个提问,原话如下: 曾经干了8年单片机工程师,对工程师从入门,到入行,再到普通,再到高级,整个路径还算清晰,比如什么阶段,会碰到什么瓶颈,怎么突破,我都经历过。 这个同学,有个典型的问题,就是学得太多且杂了,估计稍微复杂点的项目,做不出来。 现在…

superset连接Apache Spark SQL(hive)过程中的各种报错解决

superset连接数据库官方文档&#xff1a;Installing Database Drivers | Superset 我们用的是Apache Spark SQL&#xff0c;所以首先需要安装下pyhive #命令既下载了pyhive也下载了它所依赖的其他安装包 pip install pyhive#多个命令也可下载 pip install sasl pip install th…

npm yarn 一起使用报错

项目记录&#xff0c;具有独特性&#xff0c;仅供参考 项目好好的运行&#xff0c;前一天装个测试工具包&#xff0c; 突然就不行了&#xff0c;卸载重装也不行&#xff0c;所有的项目都安装失败&#xff0c;新起一个项目也不行&#xff0c;有时候某个单独安装一个包可以&…