SpringMvc进阶

简介: SpringMvc进阶

SpringMVC引言

在Web应用程序开发中,Spring MVC是一种常用的框架,它基于MVC(Model-View-Controller)模式,提供了一种结构化的方式来构建可维护和可扩展的应用程序。本文将介绍Spring MVC框架的基础知识和常用注解,以及参数传递、返回值处理和页面跳转等相关内容。

一、常用注解

1.1. @RequestMapping

@RequestMapping注解用于将HTTP请求映射到控制器方法上,通过指定URL路径和请求的方法类型来定义请求的处理。这是一个非常常用的注解,它可以灵活地匹配多种URL路径和请求方法,为控制器方法提供请求映射规则。

@RequestMapping("/hello1")
    public String index(String bname,Integer bid ){
//        System.out.println("hello springMvc..");
        log.info("简单类型参数:bname:{},bid{}",bname,bid);
        return "index";
    }

1.2. @RequestParam

@RequestParam注解用于获取请求参数的值,可以指定参数名和默认值。它可以用于获取基本类型和包装类的参数,并支持参数的必填和可选设置。通过@RequestParam注解,我们可以方便地获取和处理请求中的参数数据。

@RequestMapping("/hello3")
    public String hello3(@RequestParam String bname,@RequestParam(required = false) Integer bid){
//        System.out.println("hello springMvc..");
        log.info("@requestParam:bname:{},bid{}",bname,bid);
        return "index";
    };

1.3. @RequestBody

@RequestBody注解用于接收请求体的数据,并将其转换为对应的Java对象。通常在处理POST请求时使用,通过该注解,我们可以简化获取请求体数据的过程,直接将数据转换为Java对象,方便后续的业务处理。

@RequestMapping("/hello4/{bid}")
    public String hello4(@PathVariable("bid") Integer bid){
//        System.out.println("hello springMvc..");
        log.info("@PathVariable:bname:{},bid{}",bid);
        return "index";
    }

1.4. @RequestHeader

@RequestHeader注解用于获取请求头的值,可以指定头部名称和默认值。通过该注解,我们可以方便地获取请求中的头部信息,并根据需要进行相应的处理。例如,可以获取用户的认证信息、浏览器类型等数据。

@RequestMapping("/hello7")
    public String hello7( @RequestHeader("jwt") String jwt){
//        System.out.println("hello springMvc..");
        log.info("@RequestHeader:jwt:{}",jwt);
        return "index";
    };

二、参数传递

在Spring MVC中,控制器方法可以接收不同类型的参数,包括基础类型、字符串、复杂类型等。

2.1. 基础类型+String

控制器方法可以直接将基本类型和字符串作为参数,Spring MVC会自动进行类型转换。例如,可以直接传递整型、字符型、布尔型等参数,并在方法中进行相应的业务处理。

@ResponseBody
    @RequestMapping("/hello2")
    public  Map hello2(HttpServletResponse response) throws Exception {
        Map<String,Object>map=new HashMap<>();
        map.put("code",200);
        map.put("msg","成功添加");
return map;
    }

2.2. 复杂类型

如果请求中包含复杂的参数结构,我们可以定义一个与之对应的Java类,并将其作为控制器方法的参数。Spring MVC将自动将请求参数映射到该Java对象的属性上,提供了一种方便的方式来处理复杂的参数传递。

@RequestMapping("/hello2")
    public String index(Book book, HttpServletRequest request){
//        System.out.println("hello springMvc..");
        log.info("复杂类型参数:bname:{},bid{}",
                request.getParameter("bname"),
                request.getParameter("bid")
                );
        log.info("复杂类型参数:bname:{},bid{}",
        book.toString()
                );
        return "index";
    }

2.3. @RequestParam

使用@RequestParam注解可以获取请求参数的值,可以指定参数名和默认值。这个注解适用于获取单个参数的值,可以用于基本类型、字符串等参数的获取。

@RequestMapping("/hello3")
    public String hello3(@RequestParam String bname,@RequestParam(required = false) Integer bid){
//        System.out.println("hello springMvc..");
        log.info("@requestParam:bname:{},bid{}",bname,bid);
        return "index";
    };

2.4. @PathVariable

使用@PathVariable注解可以获取URL路径中的变量值,将路径变量绑定到方法参数上。这个注解适用于RESTful风格的URL处理,可以方便地获取URL中的动态参数。

@RequestMapping("/hello4/{bid}")
    public String hello4(@PathVariable("bid") Integer bid){
//        System.out.println("hello springMvc..");
        log.info("@PathVariable:bname:{},bid{}",bid);
        return "index";
    };

2.5. @RequestBody

使用@RequestBody注解可以将请求体的数据转换为对应的Java对象,并作为方法的参数。通过该注解,我们可以直接获取请求体中的数据,并进行后续的业务处理。

@RequestMapping("/hello6")
    public String hello6( @RequestBody Map map){
//        System.out.println("hello springMvc..");
        log.info("@RequestBody:map:{}",map);
        return "index";
    };

2.6. @RequestHeader

使用@RequestHeader注解可以获取请求头的值,可以指定头部名称和默认值。通过该注解,我们可以方便地获取请求头中的信息,并根据需要进行相应的处理。

@RequestMapping("/hello7")
    public String hello7( @RequestHeader("jwt") String jwt){
//        System.out.println("hello springMvc..");
        log.info("@RequestHeader:jwt:{}",jwt);
        return "index";
    };

三、返回值

在Spring MVC中,控制器方法可以返回不同类型的值作为响应结果,根据业务需求选择合适的返回类型。

3.1. void

如果控制器方法返回值为void,则表示该方法没有返回值。这种情况下,通常是直接向客户端写入数据或者通过其他方式进行响应处理。

public  void hello1(HttpServletResponse response) throws Exception {
        Map<String,Object>map=new HashMap<>();
        map.put("code",200);
        map.put("msg","成功添加");
        ResponseUtil.writeJson(response,map);
    };

3.2. String

控制器方法可以返回一个字符串作为响应结果,这个字符串可以表示视图的名称或者响应的内容。当返回视图名称时,Spring MVC会根据视图解析器的配置找到对应的视图并渲染返回给客户端。

@ResponseBody
    @RequestMapping("/hello2")
    public  Map hello2(HttpServletResponse response) throws Exception {
        Map<String,Object>map=new HashMap<>();
        map.put("code",200);
        map.put("msg","成功添加");
return map;
    };

3.3. String+Model

控制器方法可以返回一个字符串和一个Model对象。这种情况下,字符串表示视图的名称,而Model对象用于在视图中传递数据。通过Model对象,我们可以将数据传递到视图中进行展示或者其他业务处理。

@RequestMapping("/hello4")
    public  String hello4(Model model, HttpServletRequest request) throws Exception {
model.addAttribute("currentName","鸭");
       request.setAttribute("location","鸡");
        return "index";
    };

3.4. ModelAndView

控制器方法可以返回一个ModelAndView对象,它包含了视图名称和数据模型。ModelAndView是一种更加灵活的方式来处理视图和数据的传递,可以同时指定视图名称和数据模型,并在需要的时候进行相应的操作。

@RequestMapping("/hello5")
    public ModelAndView hello5(Model model, HttpServletRequest request) throws Exception {
       ModelAndView mv=new ModelAndView();
       mv.addObject("sign","h");
mv.setViewName("index");
        return mv;
    };

四、页面跳转

在Spring MVC中,页面跳转可以通过转发(forward)或重定向(redirect)来实现。

@RequestMapping("/hello6")
    public String hello6() throws Exception {
        System.out.println("hello6");
        return "forward:hello2";
    };

4.1. 转发(forward)

使用请求转发将请求发送到另一个URL路径上进行处理,客户端的URL地址不会变化。这种方式适用于不同请求之间的跳转和处理,可以共享请求的上下文数据。

@RequestMapping("/hello7")
    public String hello7() throws Exception {
        System.out.println("hello6");
        return "forward:/param//hello1";
    };

4.2. 重定向(redirect)

使用重定向将请求发送到另一个URL路径上进行处理,客户端的URL地址会改变。这种方式适用于不同请求之间的跳转和处理,可以避免表单重复提交等问题。

@RequestMapping("/hello9")
    public String hello9() throws Exception {
        System.out.println("hello6");
        return "redirect:/param//hello1";
    };

总结:

本文介绍了Spring MVC框架的基础知识和常用注解,以及参数传递、返回值处理和页面跳转等相关内容。掌握了这些知识,我们可以更加灵活地开发Web应用程序,实现不同功能和业务需求。在后续的文章中,我们将深入讨论Spring MVC的更多特性和用法,帮助读者更好地理解和应用该框架。

目录
相关文章
|
canal 存储 SQL
MySQL数据库同步CDC方案调研
数据库同步是一个比较常见的需求,业务数据一般存储在一致性要求比较高的OLTP数据库中,在分析场景中往往需要OLAP数据库或者比较火的数据湖方案;CDC是数据库同步较为流行的方案,全称是Change Data Capture,主要用于捕捉数据库中变化的数据,然后根据变化的数据写入不同的目标存储。接下来是一些数据库CDC方案的调研及原理探讨,调研方案基于MySQL数据库。
4200 0
MySQL数据库同步CDC方案调研
|
8月前
|
人工智能 编解码 算法
《3D植被建模痛点解决:开放世界层级实例化+GPU批处理优化方案》
本文记录开放世界生存游戏“迷雾森林”场景3D植被建模的技术攻坚过程。初期因静态烘焙方案,出现近景纹理拉伸、中景阴影脱节、显存过载闪退等问题,后转向“动态层级实例化”,按空间、模型、材质三维度拆分植被资源,搭建层级参数库。面对实例化数量过载,通过材质分组批处理与GPU实例化优化,将Draw Call从3200次降至210次,帧率回升至58帧。后续开发动态环境响应模块,实现植被随天气调整形态,并优化地形采样算法解决穿模悬浮问题。最终沉淀“四维协同”建模逻辑,还探索AI辅助LOD生成,为开放世界3D资产开发提供可复用路径。
449 6
|
10月前
|
人工智能
把“猜”变成“答”——让大模型更懂你 | AI小知识
如何让大语言模型更懂你?本文揭示大模型“答非所问”的背后原因,提供四步提问法:给背景、定目标、举例子、迭代追问。通过生活场景对比,展示如何将模糊提问转化为精准答案,帮助用户高效使用AI,提升沟通与工作效率。
505 0
|
数据采集 弹性计算 供应链
阿里云服务器包年包月、按量付费和抢占式实例有什么区别?如何选择?
阿里云服务器ECS提供三种付费类型:包年包月、按量付费和抢占式实例。包年包月适合长时间稳定使用,价格优惠且支持备案;按量付费为先用后付,按小时结算,适用于短期或突发需求,但费用较高;抢占式实例价格最低(可省90%),但可能因资源供需被释放,适合无状态应用如大数据分析、图像渲染等。选择时需根据业务场景权衡成本与稳定性,例如网站服务选包年包月,短期测试选按量付费,弹性伸缩业务可用抢占式实例。
369 4
|
存储 安全 索引
回收站删除的照片怎么恢复?
在日常使用电脑的过程中,我们常常会不小心误删照片、文件或者其他重要数据,尤其是在清空回收站后,许多人会感到恐慌,担心数据永远丢失。不过,实际上,即使回收站中的照片被删除,也并非完全没有恢复的可能。本文将详细介绍几种常用的照片恢复方法,帮助大家在遇到类似问题时能够及时采取措施,尽可能地找回丢失的数据。
|
前端开发 应用服务中间件 API
|
小程序
微信小程序项目实例——体质计算器
微信小程序项目实例——体质计算器
|
API 开发工具 Android开发
安卓与iOS开发环境对比分析
移动操作系统的两大巨头,安卓和iOS,各自拥有独特的开发环境和工具。本文将深入探讨两者的开发环境差异,从编程语言、开发工具、用户界面设计、API支持以及生态系统五个维度进行比较分析。通过数据支撑和案例研究,揭示各自的优势和局限性,为开发者选择适合自己项目需求的平台提供参考依据。
451 27
|
编解码 网络协议 开发工具
Android平台如何实现多路低延迟RTSP|RTMP播放?
本文档详细介绍了大牛直播SDK在Android平台上实现RTSP与RTMP流媒体播放及录像功能的技术细节。早在2015年,SDK的第一版就已经支持了多实例播放,并且通过简单的实例封装就能轻松实现。文档中提供了代码示例,展示了如何开启播放、停止播放以及开始和停止录像等功能。此外,SDK还提供了丰富的配置选项,例如设置录像目录、文件大小限制、转码选项等。总结部分列出了该SDK的关键特性,包括但不限于高稳定性和低延迟的播放能力、多实例支持、事件回调、硬解码支持、网络状态监控以及复杂的网络环境处理等。这些功能使得SDK能够应对各种应用场景,特别是在对延迟和稳定性有极高要求的情况下表现优异。
564 5