Spring MVC 注解实现

news2024/11/15 8:35:48

注解描述

注解描述
@Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象,分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。RequestMapping注解有六个属性:value: 指定请求的实际地址method: 指定请求的method类型, GET、POST、PUT、DELETE等;consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;params: 指定request中必须包含某些参数值是,才让该方法处理。headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
@PostMappingSpring MVC新特性提供了对Restful风格的支持。从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@ PostMapping用于处理请求方法的POST类型等。如果我们想使用传统的@RequestMapping注释实现URL处理程序,那么它应该是这样的:@RequestMapping(value = “/get/{id}”, method = RequestMethod.GET)新方法可以简化为:@GetMapping(“/get/{id}”)
@GetMapping查询操作
@PutMapping更新操作
@DeleteMapping删除操作
@PatchMapping更新单个数据
@Resource做bean的注入时使用,可以写在字段和setter方法上,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。默认按照ByName自动注入。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired做bean的注入时使用,可以写在字段和setter方法上,为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;它是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。
@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。@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。
@RequestParam@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue = “0”, required = false, value = “isApp”;defaultValue 表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。
@ResponseBody一般在方法上面表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】。比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。
@RequestBody在形参里面是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
@RestController作用等同于@Controller + @ResponseBody
@ModelAttribute注解用于将方法的参数或方法的返回值作为Model的属性加入到Model中,然后Spring框架自会将这个Model传递给ViewResolver。Model的生命周期只有一个http请求的处理过程,请求处理完后,Model就销毁了。
@SessionAttributes注解只用作用在 类 上,作用是将指定的 Model 的键值对保存在 session 中。可以让其他请求共用 session 中的键值对。SessionAttribute有两个参数:  String[] value:要保存到session中的参数名称  Class[] typtes:要保存的参数的类型,和value中顺序要对应上所以可以这样写:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})
@ControllerAdvice@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理,需要配合@ExceptionHandler使用。
@Exceptionhandler可以用来处理方法抛出的异常

1.实战案例

1.1 Url传参数

@GetMapping("/save")
public void save(@RequestParam String name,@RequestParam int age){
    System.out.println("name==="+name);
    System.out.println("age==="+age);
}@GetMapping("/save/{name}/{age}")
public void save(@PathVariable(value = "name") String name,@PathVariable("age") int age){
    //中文必需转换
    name = new String(name.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
    System.out.println("name==="+name);
    System.out.println("age==="+age);
}@GetMapping("/girl") //简写模式,发回视图名称
    public String test(){
        return "girl";  
    }

1.2 获取表单参数

从Form表单或URL参数中获取

//index.jsp
   
<form action="login" method="post">
        UserName:
        <input type="text" name="userName" />
        <br/><br/>
        PassWord:
        <input type="password" name="passWord"/>
        <br/><br/>
        <button type="submit">Login</button>
    </form>
            
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String userGetUserInfo(String userName,String passWord){
        //两个属性值必须与表单里的属性值一模一样
        System.out.println("用户名:"+userName);
        System.out.println("密码:"+passWord);
        return "success";
 }@GetMapping("/index")
public String index(){
    
    return "index";
}

💡 说明:注意这时候这个User类一定要有无参数的构造函数。

2. 中文乱码处理

SpringMVC提供专用的中文字符过滤器,用于处理乱码问题

解决方案一 配置在 web.xml 里面(推荐)

<!--乱码处理过滤器,与Servlet中使用的完全相同,差异之处在于处理器的类由Spring提供-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

解决方案二:在spring-mvc.xml中使用注解扫描的方式解决(可能会不适用)

 <mvc:annotation-driven>
        <!-- 消息转换器 -->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

方案一和方案三结合使用,控制台和页面中文乱码

解决方案三:使用全局配置方式

在WebMvcConfig中添加

 @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        WebMvcConfigurer.super.extendMessageConverters(converters);
        for (HttpMessageConverter<?> converter : converters) {
            // 解决 Controller 返回普通文本中文乱码问题
            if (converter instanceof StringHttpMessageConverter) {
                ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
            }// 解决 Controller 返回json对象中文乱码问题
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
            }
        }
    }

注解应用

案例一

全局演示:

@RestController
@RequestMapping("/api/")
public class TeacherController {
    @GetMapping("teacher")
    public String get(){
        System.out.println("执行get请求");
        return "苍老师";
    }
    @PostMapping("teacher")
    public Integer post(){
        System.out.println("执行post请求");
        return 1;
    }
    @PutMapping("teacher")
    public Integer put(){
        System.out.println("执行put请求");
        return 1;
    }
    @DeleteMapping("teacher")
    public Integer delete(){
        System.out.println("执行delete请求");
        return 1;
    }
}

上面都是使用后缀为 teacher访问,那么我们可以简写

//把方法上面的("teacher") 去掉直接放到类上面
@RestController
@RequestMapping("/api/teacher")
public class TeacherController {}

可以使用一个插件来演示,也可以是用postman来演示:

在这里插入图片描述

GetMapping:另一种写法

@Controller
@RequestMapping("/api")
public class BodyController {
/**
     *之前返回的是ModelAndView spring提供了简易的方式Model参数接收
     */
    @RequestMapping(method = RequestMethod.GET,value = "/usert")
    public String userT(Model model) {
        model.addAttribute("name", "李四");
        model.addAttribute("age", 18);
        return "user";//使用视图文件
    }

getMapping结合@ResponseBody 案例:

    /*
    @ResponseBody 应用方式
    * */@GetMapping("/boy")
    //加上此注解,说明此方法直接输出String字符串,不再使用视图渲染,也可以在类上直接注解  @RestController也是可以的
    @ResponseBody
    public String boy() {
        return "hello c2 中文";
    }@GetMapping("/strings")
    @ResponseBody
    public String[] strings() {
        return new String[]{"java", "javascript", "springboot", "中文编程"};
    }
    @GetMapping("/books")
    @ResponseBody
    public List<Book> books() {
        List<Book> list = new ArrayList<>();
​
        list.add(new Book(1, "java11",180,new Date()));
        list.add(new Book(2, "java 基础开发",280,new Date()));
        list.add(new Book(3, "java22",380,new Date()));
        list.add(new Book(4, "java33",480,new Date()));
        return list;
    }

PostMapping:

创建注册页面:register.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
    <body>
        <form action="/api/regok2" method="post">
            UserName:
            <input type="text" name="username" />
            <br/><br/>
            PassWord:
            <input type="password" name="passWord"/>
            <br/><br/>
            <button type="submit">Login</button>
        </form>
    </body>
</html>

编写controller类

@GetMapping("/register")
    public String login(){
        return "register";
    }@PostMapping("/regok")
    public String regok(String username){
        //重定向
        System.out.println("数据保存");
        System.out.println(username);return "redirect:http://www.baidu.com";
        //return "redirect:/";//重定向当前网站的首页
        //return "forward:/WEB-INF/page.jsp"; 转发地址栏不变量,显示的结果变了
    }
    @PostMapping("/regok2")
    public ModelAndView regok2(String username){
        ModelAndView mv = new ModelAndView("success");
        mv.addObject("name", username);
        System.out.println("数据保存");
        System.out.println(username);return mv;
    }

DeleteMapping:

 @RequestMapping(value = "/mds/{id}", method = RequestMethod.DELETE)
    public String mds(@PathVariable("id") int id, HttpServletRequest req) {
        String msg = String.format("method:%s,deleteById:%d", req.getMethod(), id);
        return msg;
    }

测试:

先运行项目,然后配置路径,点击按钮执行

案例二

 @DeleteMapping("/del1")
    @ResponseBody
    public String del1(int id,HttpServletRequest req){
        System.out.println(id);
        System.out.println(req.getMethod());
        return ""+id+"="+req.getMethod();
    }

配置:

DELETE http://localhost:8080/api/del1?id=99

PutMapping:

 @RequestMapping(value = "/puts", method = RequestMethod.PUT)
    public String puts( String name, HttpServletRequest req) {
        System.out.println("name="+name);
        System.out.println(req.getMethod());
        String s = "name的值=" + name + ";获取到的请求方式:" + req.getMethod();
        System.out.println(s);
        return "forward:/api/puts2";
    }
  
    @PutMapping("/puts2")
    @ResponseBody
    public String puts2(String name, HttpServletRequest req) {
        String msg = String.format("method:%s,hello:%s", req.getMethod(), name);
        System.out.println(msg);
        return msg;
    }

测试请求地址:

在这里插入图片描述

@ModelAttribute:注解用于将方法的参数或方法的返回值作为Model的属性加入到Model中,然后Spring框架自会将这个Model传递给ViewResolver

    @ModelAttribute
    public void populateModel(@RequestParam String name, Model model) {
        model.addAttribute("name", name);
    }//自动调用 model.addAttribute("user",u)
    @ModelAttribute("user")
    public User user(){
        User u = new User(12,"小保安",20);
        return u;
    }@ModelAttribute
    public void abc(Model model) {
        model.addAttribute("age", 28);
        model.addAttribute("uname", "黄老师");
        model.addAttribute("adlist", 28);
        model.addAttribute("age", 29);
    }@RequestMapping(value = {"/helloWorld","/hello"})
    public String helloWorld() {
        return "hello";
    }@GetMapping("/ok")
    public String ok(){
        return "hello";
    }

访问地址:http://localhost:8080/hello?name=老六

http://localhost:8080/ok?name=老六

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

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

相关文章

第七章 环境软件的安装

1、nodeJS安装 node -v node版本 安装多个node版本 pnpm i nvm -g nvm -v nvm ls 查看当前安装的版本 nvm install 18.7.0 安装指定的版本 nvm use 18.6.0 切换到别的版本 安装pnpm npm i pnpm -g pnpm -v 安装VSCode 官网直接下载 安装好后 需要配置 按住 CMD +…

基于单片机的老人防摔倒的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过LCD1602液晶显示屏显示当前的经纬度及时间的信息&#xff1b;温度传感器采集当前体温&#xff1b;通过GPS接收模块获得当前位置的位置的经度、纬度、时间和高度等信息&#xff1b;通过ADXL345检测老人摔倒的一瞬间重力加速度通…

[解决Github 克隆错误] unable to access ‘xxx‘: Recv failure: Connect

1.错误描述&#xff1a; 从GitHub上克隆仓库到本地&#xff0c;出现错误&#xff1a; unable to access https://github.com/xxxx: Recv failure: Connection was reset。 克隆失败。 2.第一次解决此问题&#xff1a;从终端输入&#xff1a; git config --global http.sslVer…

Liunx下的消费者与生产者模型与简单线程池的实现

文章目录 前言1.消费者与生产者模型2.信号量1.信号量的接口2.使用环形队列模拟生产者消费者模型 3.简单实现线程池4.补充说明 前言 本文主要会结束消费者生产者模型&#xff0c;以及简单线程池的实现。 1.消费者与生产者模型 之前我们学了条件变量和互斥等概念。条件变量本质…

vETSTStudio - CAPL - CAN报文未使用位

目录 ChkStart_PayloadGapsObservation 代码示例 ChkStart_PayloadGapsObservationTx 代码示例 ChkStart_PayloadGapsObservationRx 代码示例 我们在做CAN&CANFD通信或者CAN&CANFD网络管理的时候&#xff0c;就会测试到DBC中报文各种信号和位的使用状态&#xff…

从数据采集到智能控制,探寻锂电卷绕机的自动化之路

在锂电池制造过程中&#xff0c;卷绕机被视为关键设备之一。它负责将正负极材料和隔膜按照设计要求卷绕成电芯&#xff0c;是确保锂电池性能和质量的重要环节。为了提高生产效率、确保产品质量&#xff0c;锂电池行业越来越注重引入智能化技术和设备。 图.锂电池生产&#xff0…

spring boot+MySQL福聚苑社区团商品购系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9

尚硅谷Linux学习笔记

文章目录 1. Linux概述2. Linux目录结构3. Linux操作命令3.1 vim编辑命令3.1.1 一般模式3.1.2 编辑模式3.1.3 指令模式 3.2 网络相关命令3.3 系统管理3.4 帮助命令3.4.1 man 获得帮助信息3.4.2 help 获得 shell 内置命令的帮助信息3.4.3 常用快捷键 3.5 文件目录类3.5.1 pwd、e…

ROS:rosbag的使用

目录 一、背景二、概念及作用三、rosbag命令行四、rosbag程序实现4.1C实现4.2Python实现 一、背景 机器人传感器获取到的信息&#xff0c;有时我们可能需要时时处理&#xff0c;有时可能只是采集数据&#xff0c;事后分析&#xff0c;比如: 机器人导航实现中&#xff0c;可能…

基于 BPF 的 Linux 系统自动调优工具:Oracle 开发了 “bpftune”

导读Oracle 开源了一个基于 BPF 的 Linux 参数自动调优工具 “bpftune”&#xff0c;这是一个自动配置器&#xff0c;可以监控 Linux 系统的工作负载并自动设置正确的内核参数值。 Oracle 开源了一个基于 BPF 的 Linux 参数自动调优工具 “bpftune”&#xff0c;这是一个自动配…

U盘写流程USB协议抓包分析

U盘写流程USB协议抓包分析 因好奇于操作系统在对U盘这个块设备是如何进行读写传递数据包&#xff0c;笔者通过抓包测试&#xff0c;做了一个简单分析。安装了wireshark的usbPcap即能抓取主机USB接口上的usb包。 A、基本包信息分析 让我们先从读流程开始分析一下USB包的包结构…

音视频技术开发周刊 | 301

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 微软、谷歌、亚马逊&#xff0c;打响大模型时代的云战争 过去数月&#xff0c;云巨头们砸下真金白银&#xff0c;研发大模型、战略投资、自研 AI 芯片……大模型的时代方兴…

ArcGIS Pro中的模型构建器演示

前言 ArcGIS Pro的模型构建器在功能上相较于大致没有什么改动,主要是界面上变得相对漂亮,流程中使用了一些半透明的效果,相较于arcmap中的模型构建器,可以说是颜值进化很大了。 实战 首先我们来看一下演示效果,怎么样,是不是很方便 先建立一个模型 对于模型构建器我一直…

java main 方法的理解

文章目录 理解命令行参数用法举例IDEA工具配置参数&#xff08;了解&#xff09; 理解 由于JVM需要调用类的main()方法&#xff0c;所以该方法的访问权限必须是public&#xff0c;又因为JVM在执行main()方法时不必创建对象&#xff0c;所以该方法必须是static的&#xff0c;该…

python爬虫_selenuim登录个人markdown博客站点

文章目录 ⭐前言⭐selelunim⭐博客站点&#x1f496; 自动填充账号密码登录 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享python使用selenuim登录个人markdown博客站点。 该系列文章&#xff1a; python爬虫_基本数据类型 python爬虫_函数的使用 python爬虫…

接口中的默认方法和静态方法

接口中的默认方法和静态方法 接口中的默认方法 package cn.tedu.inter; //1.定义接口 public interface Inter1 {/*1.接口中默认方法的修饰符public可以省略*///2.定义接口中的默认方法public default void play(){System.out.println("我是接口中的默认方法&#xff0c;…

OSPFv2基础03_综合实验

目录 1.创建OSPF进程 2.创建OSPF区域 3.使能OSPF 4.创建虚连接&#xff08;可选&#xff09; 5.OSPF常用命令 6.实验配置步骤 7.实验效果 1.创建OSPF进程 OSPF是一个支持多进程的动态路由协议&#xff0c;OSPF多进程可以在同一台路由器上运行多个不同的OSPF进程&#x…

ES6基本知识点

目录 1.对象优化 1.1 新增API 1.2 object.assign方法的第一个参数是目标对象&#xff0c;后面的参数都是源对象 1.3 声明对象简写 1.4 对象的函数属性简写 1.5 对象拓展运算符 2.map和reduce 2.1 数组中新增的map和reduce方法 3 promise 3.1 promise封装异步操作 4.模…

C# PaddleInference OCR 验证码识别

说明 C# PaddleInference OCR 验证码识别 自己训练的模型&#xff0c;只针对测试图片类型&#xff0c;准确率99% 效果 项目 VS2022.net4.8OpenCvSharp4Sdcb.PaddleInference 测试图片 代码 using OpenCvSharp; using Sdcb.PaddleInference.Native; using Sdcb.PaddleInfer…

mac笔记本安装java环境以及idea设置

系列文章目录 文章目录 系列文章目录安装java环境一、安装jdk二、下载安装IntelliJ IDEA三、安装maven四、安装git五、安装tomcat六、安装appenv配置文件七、有关idea的设置1、快捷键设置2、新建类的命名3、字体的大小&#xff0c;有关菜单栏的大小4、框内的tab最多能有多少个窗…