SpringMVC:从入门到精通,7篇系列篇带你全面掌握--二.SpringMVC常用注解及参数传递

news2024/11/24 17:57:14

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于SpringMVC的相关操作吧

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

一.关于日志的了解

1.使用日志的好处

2.日志的类型

3.需要的依赖

二.参数传递

1.基础类型+String

2.复杂类型

3.@RequestParam

4.@PathVariable

5.@RequestBody

6.@RequestHeader

​三.返回值

1.Void

2.String

3.String+Model

4.ModelAndView

四.常用注解

@RequestMapping

@PathVariable

@RequestBody

@RequestHeader

@RequestParam

@ModelAttribute

@CookieValue

@SessionAttributes

五.页面跳转 

1.转发

controller

浏览器效果

2.重定向

controller

浏览器效果

3.跳转到其他controller

转发

重定向


在进入今天的正题之前,还需要对一个知识点进行学习了解的

一.关于日志的了解

1.使用日志的好处

  • 1. 调试和故障排查:日志可以记录应用程序的运行状态、错误信息和异常堆栈跟踪,帮助开发人员定位和解决问题。通过查看日志,可以了解应用程序在特定情况下的行为,从而更好地理解和调试代码
  • 2. 监控和性能分析:日志可以提供应用程序的性能指标、请求处理时间、资源利用率等信息,帮助开发人员监控应用程序的运行情况。通过分析日志,可以找出性能瓶颈和资源消耗过高的地方,进行优化和改进
  • 3. 安全和合规性:日志可以记录应用程序的安全事件、用户操作和敏感数据访问,帮助监测和防止安全漏洞和攻击。此外,一些行业和法规要求应用程序必须记录和保留特定类型的日志,以确保合规性
  • 4. 运维和故障恢复:日志可以提供应用程序的运行状态、系统资源使用情况和错误信息,帮助运维人员监控和管理应用程序。在故障发生时,通过分析日志可以追踪问题的根源,进行故障恢复和修复
  • 5. 分析和业务洞察:日志可以记录应用程序的用户行为、业务事件和数据变化,帮助分析用户行为模式、业务趋势和数据异常。通过分析日志,可以获取有关用户需求、产品改进和市场趋势的洞察,支持业务决策和战略规划

2.日志的类型

  • 调试日志(Debug Logs):用于记录应用程序的调试信息,例如变量的值、方法的执行路径等。这些日志通常用于开发和调试阶段,帮助开发人员定位和解决问题

  • 信息日志(Info Logs):用于记录应用程序的一般信息,例如应用程序的启动和关闭、请求的处理结果等。这些日志通常用于了解应用程序的运行状态和行为

  • 警告日志(Warning Logs):用于记录应用程序的警告信息,例如潜在的问题或异常情况,但不会导致应用程序的中断或错误。这些日志通常用于提醒开发人员或运维人员注意潜在的风险或问题

  • 错误日志(Error Logs):用于记录应用程序的错误信息,例如异常抛出、无法处理的请求等。这些日志通常用于追踪和解决应用程序的错误和异常情况

  • 致命错误日志(Fatal Logs):用于记录应用程序的致命错误信息,例如无法恢复的错误、系统崩溃等。这些日志通常用于追踪和解决严重的错误情况

  • 审计日志(Audit Logs):用于记录应用程序的安全事件、用户操作和敏感数据访问等信息。这些日志通常用于监测和审计应用程序的安全性和合规性

3.​​​​​​​需要的依赖

<log4j2.version>2.9.1</log4j2.version>
<log4j2.disruptor.version>3.2.0</log4j2.disruptor.version>
<slf4j.version>1.7.13</slf4j.version>

<!--4.log日志相关依赖-->

<!-- log4j2日志相关依赖 -->
<!-- log配置:Log4j2 + Slf4j -->
<!-- slf4j核心包-->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>slf4j-api</artifactId>
	<version>${slf4j.version}</version>
</dependency>
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>${slf4j.version}</version>
	<scope>runtime</scope>
</dependency>

<!--核心log4j2jar包-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-api</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-core</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-slf4j-impl</artifactId>
	<version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-web</artifactId>
	<version>${log4j2.version}</version>
	<scope>runtime</scope>
</dependency>

<!--需要使用log4j2的AsyncLogger需要包含disruptor-->
<dependency>
	<groupId>com.lmax</groupId>
	<artifactId>disruptor</artifactId>
	<version>${log4j2.disruptor.version}</version>
</dependency>

二.参数传递

1.基础类型+String

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 王辉
 * @site www.shihuihuila.com
 * @create 2023-09-05 15:15
 */
@Controller
@RequestMapping("/smvc2")
@Slf4j
public class SpringMVC2Controller {
    @RequestMapping("/print1")
    public String test1(String bname ,Integer bid){
        log.info("简单类型的参数 bname:{},bid:{}",bname,bid);
        return "index";
    }
}

2.复杂类型

  @RequestMapping("/print2")
    public String test2(HBook book){
        log.info("简单类型的参数 Book:{}",book.toString());
        return "index";
    }

参数是复杂类型时,比如实体,那么所携带的参数必须是实体有的,不然传过去也是没有的

3.@RequestParam

   @RequestMapping("/print3")
    public String test3(@RequestParam Integer bid, @RequestParam(value = "p") Integer price){
        log.info("用@RequestParam传递参数{}",bid,price);
        return "index";
    }

如果不是传的你指定的那个value值的话便会有错误

而且只要你是设置了value值那么那个参数就是必须携带的

4.@PathVariable

    @RequestMapping("/print4/{bid}")
    public String test4(@PathVariable("bid") Integer bid){
        log.info("用@PathVariable传递参数{}",bid);
        return "index";
    }

5.@RequestBody

需要将依赖导入到pom.xml中

 <jackson.version>2.9.3</jackson.version>
 
 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>${jackson.version}</version>
    </dependency>

这里需要用到一个工具,因为在网页中无法发送put请求(可在网上自行下载)

  @RequestMapping("/print5")
    public String test5(@RequestBody Map map){
        log.info("用@RequestBody传递参数{}",map);
        return "index";
    }

6.@RequestHeader

  @RequestMapping("/print6")
    public String test6( @RequestHeader("huihui") String huihui){
        log.info("用@RequestHeader传递参数{}",huihui);
        return "index";
    }

​三.返回值

1.Void


    @RequestMapping("/myreturn1")
    public void myretuen1(HttpServletResponse response) throws Exception {
        Map<String,Object> map= new HashMap();
        map.put("huihui",18);

        ResponseUtil.writeJson(response,map);
        log.info("void");
    }

2.String

 @RequestMapping("/myreturn2")
    public String myretuen2(){
        return "hello_huihui";
    }

3.String+Model

@RequestMapping("/myreturn3")
    public String myretuen3(Model model,HttpServletResponse response){
        //将模型数据填充好
        model.addAttribute("name","huihui");
        return "hello_huihui";
    }

4.ModelAndView

 @RequestMapping("/myreturn4")
    public ModelAndView myretuen4(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("info","大美女");
        mv.setViewName("hello_huihui");
        return mv;
    }

四.常用注解

@RequestMapping

  1. 用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上
  2. 用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法
  3. 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
参数说明
value@RequestMapping 的 value 属性必须设值; @RequestMapping 的 value 属性是通过当前请求的请求地址来匹配请求; 从源码中可以看到value属性是一个字符串类型的数组,因此说明可以将多个请求映射到一个方法上,只需要给 value 来指定一个包含多个路径的数组。
method@RequestMapping的method属性是通过当前请求的请求方式来匹配请求; 浏览器向服务器发送请求,请求方式有很多GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。可以使用 method 属性来约束请求方式。
headers@RequestMapping的headers属性是通过当前请求的请求头信息来匹配请求; @RequestMapping的headers属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系 例如: “header”:要求请求映射的请求必须为包含 header的请求头信息 “!header”:要求请求映射的请求必须为不包含 header的请求头信息 “header=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须为value “header!=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须不是value
params@RequestMapping的params属性是通过当前请求的请求参数来匹配请求; @RequestMapping的params属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系 例如: “param”:要求请求映射的请求必须为包含 param的请求参数 “!param”:要求请求映射的请求是不能包含param的请求参数 “param=value”:要求请求映射的请求必须包含 param 的请求参数,且 param 参数的值必须为 value “param!=value”: 要求请求映射的请求是必须包含 param 的请求参数,其值不能为 value。

@PathVariable

  1. 请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定
  2. 当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上

@RequestBody

  1. 用来接收前端传递给后端的json字符串中的数据的(即请求体中的数据的)
  2. GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个【一个请求:只有一个@RequestBody ,可以有多个@RequestParam
  3. @RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性

@RequestHeader

@RequestHeader 注解可以获取指定的请求头信息。如果想要获取所有的请求头信息,可以使用 Map<String,String>、MultiValueMap<String,String>、HttpHeaders 这三个 Map 中的任何一个封装所有请求头的 name 和 value

参数说明
namename 和 value 互为别名,当只有一个参数时,可以省略 value,直接("xxx") 就可以了
valuename 和 value 互为别名,当只有一个参数时,可以省略 value,直接("xxx") 就可以了
required默认情况下,如果请求头中缺少了指定的 name,那么将会报错。 如果没有添加required = false,当请求头中没有这个zking请求头时就会报错。
defaultValue如果请求头中缺少了指定的 name ,那么会报错,可以使用 defaultValue 这个属性指定默认值,就可以避免报错 ;如果请求头缺少指定 name ,该属性设置的值将会作为默认值,如果该属性不设置值,它有自己的默认值 DEFAULT_NONE

@RequestParam

用于将请求参数区域的数据映射到控制层方法的参数上

参数说明
value请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。
required该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。
defaultValue参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}"

@ModelAttribute

​​​​​​
  • 绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;

  • 暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;

  • 暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用

@CookieValue

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

参数说明
value绑定的参数名称,String类型。
required是否必须包含value,boolean类型,默认为 true,表示请求参数中必须包含对应的参数;若不存在,将抛出异常。
defaultValue默认值,String类型。当没有传参时将使用此值赋值。

@SessionAttributes

  • 在默认情况下,当ModelMap中的属性作用域是request级别时,也就是说,当本次请求结束后,ModelMap中的属性将销毁。如果希望在多个请求中共享ModelMap中的属性,必须将其属性转存到session中,这样ModelMap的属性才会被跨请求访问;
  • spring允许我们有选择地指定ModelMap中的哪些属性需要转存到session中,以便下一个请求属对应的ModelMap的属性列表中还能访问到这些属性
  • 有两种方式将ModelMap中的属性值共享到session中:
    •     使用注解的value属性:可以通过属性名指定需要放到会话中的属性
    •     使用注解的types属性:还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中

五.页面跳转 

1.转发

controller

 @RequestMapping("/forward")
    public String toHelloPage1(){
        System.out.println("forward转发");
        return "forward:myreturn2";
    }

浏览器效果

2.重定向

controller

    @RequestMapping("/redirect")
    public String toHelloPage2(){
        System.out.println("redirect重定向");
        return "redirect:myreturn2";
    }

浏览器效果

3.跳转到其他controller

转发

 @RequestMapping("/otherforward")
    public String otherforward(){
        System.out.println("otherforward");
        return "forward:/smvc1/print";
    }
-------------------------------------------------------------------------------------------
 @RequestMapping("/print")
    public String test(){
        return "hello_huihui";
    }

重定向

@RequestMapping("/otherredirect")
    public String otherredirect(){
        System.out.println("otherredirect");
        return "redirect:/smvc1/print";
    }

-------------------------------------------------------------------------------------------
 @RequestMapping("/print")
    public String test(){
        return "hello_huihui";
    }

   好啦,今天的分享就到这了,希望能够帮到你呢!😊😊  

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

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

相关文章

ESD门禁管理系统的组成和主要功能

ESD门禁管理系统是一种用于实现企业或组织对出入口进行管理和控制的系统。ESD代表“电子门禁系统”&#xff0c;它利用先进的技术手段来确保只有授权人员可以进入特定区域&#xff0c;从而提高管理效率。 ESD门禁管理系统通常包括以下组件&#xff1a; 1. 门禁读卡器&#xf…

论文阅读《Robust Monocular Depth Estimation under Challenging Conditions》

论文地址&#xff1a;https://arxiv.org/pdf/2308.09711.pdf 源码地址&#xff1a;https://github.com/md4all/md4all 概述 现有SOTA的单目估计方法在理想的环境下能得到满意的结果&#xff0c;而在一些极端光照与天气的情况下往往会失效。针对模型在极端条件下的表现不佳问题&…

拓展世界 | “秀才”被封,千万粉丝一朝空,数字时代来临,大众情感寄托是否有新的出口?

近日&#xff0c;短视频千万粉丝博主“秀才”因违反平台相关规定被封&#xff0c;引起了不少网友的关注&#xff0c;网络上大家戏称他为“中年妇女收割机”&#xff0c;这次的封杀&#xff0c;网友开玩笑道“这得有多少阿姨伤心欲绝”。 在当今数字时代&#xff0c;网红主播已…

计算机领域期刊会议级别分类

文章目录 一、查询期刊1.1、知网1.2、letpub1.3、ccf 二、CCF2.1、CCF和SCI的区别2.2、国际学术期刊2.3、国内期刊2.4、国际会议2.5、国内会议 三、期刊会议总结 一、查询期刊 1.1、知网 查询中⽂期刊⼀般用知⽹&#xff0c;输入你想了解的期刊然后搜索&#xff0c;可以查看期…

Ab3d.DXEngine 6.0 Crack 2023

Ab3d.DXEngine 不是另一个游戏引擎&#xff08;如Unity&#xff09;&#xff0c;它强迫您使用其游戏编辑器、其架构&#xff0c;并且需要许多技巧和窍门才能在标准 .Net 应用程序中使用。Ab3d.DXEngine 是一个新的渲染引擎&#xff0c;它是从头开始构建的&#xff0c;旨在用于标…

计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目。今年第11号台风“海葵”后部云团的影响&#xff0c;福州地区的降雨量突破了历史极值&#xff0c;多出地方存在严重的积水。城市道路积水是造成交通拥…

关于ThreadPoolTaskExecutor线程池的配置

说明&#xff1a; 1、线程池分类、其他 1.1、分类 IO密集型 和 CPU密集型 任务的特点不同&#xff0c;因此针对不同类型的任务&#xff0c;选择不同类型的线程池可以获得更好的性能表现。 1.1. IO密集型任务 ​ IO密集型任务的特点是需要频繁读写磁盘、网络或者其他IO资源&a…

Netty—Channel

文章目录 一、Channel 是什么&#xff1f;&#x1f914;️二、 Channel 的继承体系&#x1f46a;三、Channel 的初始化过程 &#x1f50d;首先&#xff0c;channel() 指定 ChannelFactory 类型其次&#xff0c;Channel 实例化 一、Channel 是什么&#xff1f;&#x1f914;️ …

初识Java 5-1 实现隐藏

目录 库单元&#xff1a;package 代码组织 独一无二的包名 Java访问权限修饰符 包访问权限 接口访问权限&#xff08;public&#xff09; 不可访问&#xff08;private&#xff09; 继承访问权限&#xff08;protected&#xff09; 包访问权限与公共构造器 接口与实现…

基于Java+SpringBoot+Vue前后端分离医疗挂号管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

pdf怎么转cad?几个简单方法分享给你

pdf怎么转cad&#xff1f;PDF文件转换为CAD文件是一项非常重要的任务&#xff0c;特别是对于那些需要进行工程、建筑和设计的专业人士来说。在过去&#xff0c;这项任务可能需要耗费大量时间和精力&#xff0c;但现在&#xff0c;随着技术的不断发展&#xff0c;已经有很多工具…

华为云云服务器评测| 之性能测试

文章目录 前言软件安装扩展知识 收集服务器负载信息指令解析开始压测后台运行 stress 运行 sysbench 测试网络带宽总结 测试磁盘 I/O 性能I/O 性能评估总结 前言 在当今数字化时代&#xff0c;云计算作为一种高效、灵活的计算方式&#xff0c;正日益受到企业和个人用户的广泛关…

如何远程访问Linux MeterSphere一站式开源持续测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

基于Java+SpringBoot+Vue前后端分离校园商铺管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

LeetCode 15 三数之和

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 // 1. 排序双指针 // 2. 固定一个值nums[i] 然后去剩下的位置去找 两数之和符合nums[j]nums[k]是否等于-nums[i] // 3. 细节问题&#xff1a;由于题目中是不可以包含重复的三元组的…

功率放大器的功能是什么功能

功率放大器是一种电子设备&#xff0c;用于放大输入信号的功率&#xff0c;并输出对应增强后的信号。功率放大器的功能主要包括增强信号的功率、保持信号的形状和质量、提供足够的电流和电压驱动负载&#xff0c;以满足不同应用需求。 功率放大器的主要功能是增强信号的功率。输…

阿里巴巴API接口解析,实现按关键字搜索商品

要解析阿里巴巴API接口并实现按关键字搜索商品&#xff0c;你需要进行以下步骤&#xff1a; 了解阿里巴巴API接口文档&#xff1a;访问阿里巴巴开放平台&#xff0c;找到API文档&#xff0c;了解阿里巴巴提供的API接口以及相关的参数、返回值等信息。注册开发者账号&#xff1…

远传水表和流量计的区别

远传水表和流量计是两种用于测量和控制水流的设备&#xff0c;虽然在某些方面有重叠的功能&#xff0c;但它们之间也有一些区别。下面我们将详细介绍这两种设备的区别。 一、定义和作用 远传水表是一种能够远程传输用水数据的水表&#xff0c;可以通过无线通信技术将数据传输到…

轻松解决Idea中maven无法下载源码

今天在解决问题的时候想要下载源码&#xff0c;突然发现idea无法下载&#xff0c;这是真的蛋疼&#xff0c;没办法查看原因&#xff0c;最后发现问题的原因居然是因为Maven&#xff0c;由于我使用的idea的内置的Bundle3的Maven&#xff0c;之前没有研究过本地安装和内置的区别&…

前端面试0906

// 请给出输出结果 function foo(){ console.log(a); } function bar(){ var a 3; console.log(this.a); foo(); } var a 2; bar(); 2 2 // 请从下面的问题中挑选3道进行回答 1. 防抖和节流分别是什么&#xff0c;一般用在什么场景&#xff1f; 防抖&#xff08;Debounc…