SpringMVC基本注解的使用和理解

news2025/1/16 2:10:17

SpringMVC基本注解的使用和理解

RequestParam注解

使用在方法入参位置,用于指定请求参数名称,将该请求参数绑定到注解参数位置。
属性:name:指定要绑定的请求参数名称; name属性和value属性互为别名。
required 和:指定请求参数是否必传; true:表明必须提交参数,true默认值, 没有400
defaultValue:指定当没有传入请求参数时的默认取值;
注意: 如果required 和 defaultValue 都存在, required属性失效。

在做案例测试时请务必进行下述配置:

在这里插入图片描述

**注意:**如果是想要根据文章想要基础学习的可以沿用上次发布的文章的maven和spring配置(https://blog.csdn.net/m0_56245143/article/details/130095359?spm=1001.2014.3001.5501)

示例:

创建一个实体类:Student.java

示例代码:

 index.jsp

<form action="testController/t01" method="post">
<%--        当都能通过name="un"传值过去,那么后端能获取到页面传回去的数据,否则是默认值--%>
        <%--        账号<input type="text" name="un"><br>--%>
        <input type="submit">
    </form>

TestController.java

//RequestParam注解使用
    @RequestMapping(value = "t01" , method = {RequestMethod.POST})
    public String t01(@RequestParam(name = "un",required = true,defaultValue = "李四") String username){
        System.out.println(username);
        return "main";
    }

运行结果:当页面没有传值给到name="un"注入给username,那默认显示的时defaultValue设置的值

在这里插入图片描述

RequestHeader注解

这个可以做一个了解

注解在方法入参位置,用于获取请求头信息。
属性:
value:指定头的名称;
name:和value属性会别名
require:是否是必须, true,必须传递, 没传递。400
defaultValue: 如果前台没传递头信息, 指定默认值。 require冲突。

示例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="test/t02" method="post">
        <%--账号:<input type="text" name="un"><br>--%>
        <input type="submit">
    </form>
</body>
</html>
    
@RequestMapping(value = "t02",method = {RequestMethod.POST})
public String t02(@RequestHeader(name = "Upgrade-Insecure-Requests") String data) {
    System.out.println(data);
    return "main";
}

RequestBody注解

用于方法入参位置,获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。get 请求方式不适用。通常用于将json格式字符串绑定到bean对象中;

示例代码:

index.jsp

 		<form action="testController/t03" method="post">
            账号:<input type="text" name="username"><br>
            密码:<input type="password" name="password"><br>
            <input type="submit">
        </form>
        
        TestController.java
        
     //RequestBody注解使用
    @RequestMapping(value = "t03" , method = {RequestMethod.POST})
    public String t03(@RequestBody String data){
        System.out.println(data);
        return "main";
    }

运行结果:通过注解RequestBody可以拿到页面提交的所有数据并且以字符串的方式输出(直接获取请求体内容)

在这里插入图片描述

将json格式请求参数绑定到指定对象bean中:

示例代码:

index.jsp
        <script>
        $(function (){
            $("#btn").click(function (){
                $.ajax({
                    url:"test/04",
                    type:"post",
                  data:'{"sid":1,"name":"mary","gender":"女","age":18,"email":"dsfdmdairn@qq.com"}',
                    contentType:"application/json",
                    success:function (resp){
                        alert(resp);
                    }
                });
            });
        });
    </script>
    
    <input type="button" value="测试" id="bth">

@RequestMapping(value = "t04",method = {RequestMethod.POST})
public String t04(@RequestBody Student student) {
    System.out.println(student);
    return "main";
}

注意: 使用json 需要引入json的解析器~ 
	<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.9</version>
    </dependency>
    
静态文件无法加载?需配置如下内容:
<mvc:default-servlet-handler></mvc:default-servlet-handler>

CookieValue注解

用于方法入参位置,把指定 cookie 名称的值传入控制器方法参数。 

回顾: Cookie 会话。 
客户端技术: cookie ,浏览器当中, 不安全。 
服务端技术: session,服务器端, 安全。 
原生cookie的获得: 
       Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            String name = cookie.getName();
            if(name.equals("JSESSIONID")){
                //获得cookie的值: 
                String value = cookie.getValue();
            }
        }

示例代码:

    //CookieValue注解使用
    @RequestMapping(value = "t05",method = {RequestMethod.GET})
    public String t05(@CookieValue("JSESSIONID") String data){
        System.out.println(data);
        return "main";
    }

    @RequestMapping(value = "t06",method = {RequestMethod.GET})
    public String t06(@CookieValue("JSESSIONID") Cookie cookie){
        System.out.println(cookie.getName()+":"+cookie.getValue());
        return "main";
    }

ModelAttribute注解

该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。

示例代码:

<a href="test/t08">测试</a>

    //ModelAttribute注解使用
    @RequestMapping("param")
    public String t07(){
        System.out.println("这是ModelAttribute注解的方法");
        return "hello word";
    }

    @RequestMapping(value = "t08",method = {RequestMethod.GET})
    public String t08(@ModelAttribute("param") String data){
        System.out.println(data);
        return "main";
    }

SessionAttributes注解

注解在类上,作用将请求域中的参数存放到session域中,用于参数共享。

示例代码:

<%--SessionAttributes注解的使用--%>
    <a href="session/s01">测试1</a>
    <a href="testController/t09">测试2</a>
    
    //SessionAttributes注解使用
    @RequestMapping(value = "t09" , method = {RequestMethod.GET})
    public String t09(){
        return "main";
    }
    
    package com.etime.controller;

import com.etime.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/session")
@SessionAttributes("student")
public class SessionController {

    @RequestMapping("s01")
    public ModelAndView s01(ModelMap modelMap){
        ModelAndView modelAndView = new ModelAndView();
        modelMap.addAttribute("student",new Student(1,"cc","男",22,"ajhif@qq.com"));
        modelAndView.setViewName("main");
        return modelAndView;
    }

}

Rest风格

restfuul?

​ 一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

restful的优点:

它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。

restful的特性:

体现形式1: 
资源:http://localhost:8080/user/ URL:统一资源定位符。

传统请求url:
新增:http://localhost:8888/user/add      POST
修改:http://localhost:8888/user/update   POST
删除:http://localhost:8888/user/deleteById?id=1   GET
查询:http://localhost:8888/user/findById?id=1     GET
查询:http://localhost:8888/user/findAll     GET

REST风格请求: 通过不同的请求动词(get post put delete )区分执行不同的操作; 
新增:http://localhost:8888/user        POST
修改:http://localhost:8888/user        PUT
删除:http://localhost:8888/user/1      DELETE 
查询:http://localhost:8888/user/1      GET
查询:http://localhost:8888/user        GET

体现形式2: 
http://localhost:8888/user/id  
id作为了url地址的一部分。

PathVariable注解

	该注解用于绑定 url 中的占位符。例如:请求 url 中/annotation/test9/{id},这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
	value:用于指定 url 中占位符名称。
	required:是否必须提供占位符。
	
	前端: 
	localhost:8080/user/findUser/1001 
	后端: 
	@RequestMapping("findUser/{uid}") 
	
    参数: 
    PathVariable("uid") Integer id

示例代码:

<%--    PathVariable注解的使用--%>
<%--    添加--%>
    <form action="studentController/add" method="post">
        编号:<input type="text" name="sid"><br>
        姓名:<input type="text" name="name"><br>
        性别:<input type="text" name="gender"><br>
        年龄:<input type="text" name="age"><br>
        邮件:<input type="text" name="email"><br>
        <input type="submit">
    </form>

<%--    修改--%>
    <form action="studentController/update" method="post">
        <input type="hidden" name="_method" value="PUT">
        编号:<input type="text" name="sid"><br>
        姓名:<input type="text" name="name"><br>
        性别:<input type="text" name="gender"><br>
        年龄:<input type="text" name="age"><br>
        邮件:<input type="text" name="email"><br>
        <input type="submit">
    </form>

<%--    删除--%>
    <form action="studentController/delete" method="post">
        <input type="hidden" name="_method" value="DELETE">
        编号:<input type="text" name="id"><br>
        <input type="submit" value="删除">
    </form>

<%--    查询--%>
    <a href="/studentController/1">获取学生信息</a>

控制层:

package com.etime.controller;

import com.etime.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/studentController")
public class StudentController {

    //@RequestMapping(value = "add",method = {RequestMethod.POST})
    @PostMapping("add")
    public String add(Student student){
        System.out.println(student);
        return "main";
    }

    //@RequestMapping(value = "getStudent/{sid}",method = {RequestMethod.GET})
    @PostMapping("getStudent/{sid}")
    public String getStudent(@PathVariable("sid") int id){
        System.out.println(id);
        return "main";
    }

    //@RequestMapping(value = "update",method = {RequestMethod.PUT})
    @PutMapping("update")
    public String update(Student student){
        System.out.println(student);
        return "main";
    }

    //@RequestMapping(value = "delete",method = {RequestMethod.DELETE})
    @DeleteMapping("delete")
    public String delete(int id){
        System.out.println(id);
        return "main";
    }
}

请求方式转换过滤器

(1)form:实际上 post 
    hidden隐藏域: _method PUT | DELETE |  
(2)后端处理器:  
    @GetMapping 处理get请求。   查询操作。 
    @PostMapping 处理post请求。 新增操作
    @PutMapping  处理put请求。  修改操作。 
    @DeleteMapping 处理delete 请求, 删除操作。 
(3)请求方式转换过滤器: 
	<!--过滤请求方式:自动识别请求体中是否有_method数据,如果有,将其值设为当前请求方式,如果没有,直接放行-->
    <filter>
        <filter-name>hiddenMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

jsp只支持get,post,head类型请求,其他类型请求会有405错,我们不用管,以后不会用JSP

响应数据及结果视图

返回值类型为字符串

用于指定返回的逻辑视图名称;
控制器代码:
    @GetMapping("resp01")
    public String resp01() {
        return "main";
    }

void类型

通常使用原始servlet处理请求时,返回该类型;
控制器代码:
    @GetMapping("resp02")
    public void resp02(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.sendRedirect("../main.jsp");
    }

ModelAndView

   //ModelAndView
    @GetMapping("resp03")
    public ModelAndView resp03(ModelMap modelMap){
        ModelAndView modelAndView = new ModelAndView();
        modelMap.addAttribute("username","mch");
        modelAndView.setViewName("main");
        return modelAndView;
    }

返回值自定义类型

@Response注解:

引入依赖包:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>
</dependency>

ResponseBody注解:能够将bean List Map 转换成Json格式,异步响应到客户端浏览器

示例代码:

    //ResponseBody注解:能够将bean List Map 转换成Json格式,异步响应客户端浏览器
    @GetMapping("resp02")
    public void resp02(HttpServletRequest request,HttpServletResponse response) throws IOException {
        List<Student> list = new ArrayList<Student>();
        Student student1 = new Student(1,"mary","女",20,"jdfawrj@qq.com");
        Student student2 = new Student(2,"mark","男",23,"jdfawrj@qq.com");
        Student student3 = new Student(3,"jack","男",23,"jdfawrj@qq.com");
        list.add(student1);
        list.add(student2);
        list.add(student3);
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(list);
        PrintWriter out = response.getWriter();
        out.println(json);
        out.close();
    }

    //SpringMVC的方式:
    //对象
    @GetMapping("resp04")
    @ResponseBody
    public Student resp04(){
        Student student = new Student(1,"may","女",20,"ajdgiaie@qq.com");
        return student;
    }

    //单列集合:
    @GetMapping("resp05")
    @ResponseBody
    public List<Student> resp05(){
        List<Student> list = new ArrayList<Student>();
        Student student1 = new Student(1,"mary","女",20,"jdfawrj@qq.com");
        Student student2 = new Student(2,"mark","男",23,"jdfawrj@qq.com");
        Student student3 = new Student(3,"jack","男",23,"jdfawrj@qq.com");
        list.add(student1);
        list.add(student2);
        list.add(student3);
        return list;
    }

    //双列集合:
    @GetMapping("resp06")
    @ResponseBody
    public Map<String,Object> resp06(){
        List<Student> list = new ArrayList<Student>();
        Student student1 = new Student(1,"mary","女",20,"jdfawrj@qq.com");
        Student student2 = new Student(2,"mark","男",23,"jdfawrj@qq.com");
        Student student3 = new Student(3,"jack","男",23,"jdfawrj@qq.com");
        list.add(student1);
        list.add(student2);
        list.add(student3);
        Map<String,Object> map = new HashMap<String, Object>();
        map.put("students",list);
        return map;
    }

转发和重定向

forward请求转发

示例代码:

    @GetMapping("resp02")
    public String resp02(){
        System.out.println("进来了");
        return "forward:../main.jsp";
    }

redirect重定向

示例代码:

 @GetMapping("resp02")
    public String resp02(){
        System.out.println("进来了");
        return "redirect:../main.jsp";
    }

nt2);
list.add(student3);
Map<String,Object> map = new HashMap<String, Object>();
map.put(“students”,list);
return map;
}


### 转发和重定向

#### forward请求转发

示例代码:

```java
    @GetMapping("resp02")
    public String resp02(){
        System.out.println("进来了");
        return "forward:../main.jsp";
    }

redirect重定向

示例代码:

 @GetMapping("resp02")
    public String resp02(){
        System.out.println("进来了");
        return "redirect:../main.jsp";
    }

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

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

相关文章

Java并发编程(8) —— AQS抽象同步队列详解

上一篇&#xff1a;Java并发编程(7) —— 锁的分类概述 在上一篇中我们提到并发包中的ReentrantLock类是一种可重入独占锁&#xff0c;其锁机制是基于AQS实现的。实际上&#xff0c;并发包java.util.concurrent.locks中的锁都是基于AQS 实现的。 一、AQS是什么 AbstractQueued…

13. unity粒子特效--发射模块、各种发射器形状、粒子渐变(颜色/大小)

1. 发射模块&#xff08;Emission&#xff09; 匀速发射&#xff1a; Rate over Time&#xff1a;每秒钟发射的粒子数 Rate over Distance&#xff1a;每移动一米发射的粒子个数 两者可指定其一&#xff1a;若仅指定Rate over Time&#xff0c;则粒子根据时间的变化进行发射&a…

第三节、语言模型

目录 0、介绍 1、N-gram 模型介绍 2、困惑度 3、N-gram 模型的文本评估 4、N-gram 模型的平滑 5、基于 N-gram 模型的文本生成 6、基于统计的语言模型的缺陷 7、实验总结 0、介绍 首先&#xff0c;我们来思考这样一个问题&#xff1a;随便给你一句话&#xff0c;如何判…

MongoDB中的索引

一、说明 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可能要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是…

Javaweb小练习---在JSP中使用Javabean访问数据库完成用户信息的简单添加

Javaweb小练习---在JSP中使用Javabean访问数据库完成用户信息的简单添加 目录 Javaweb小练习---在JSP中使用Javabean访问数据库完成用户信息的简单添加 0.创建数据库 1. 在resources目录下创建db.properties文件 2. /** * 获取链接与释放资源的工具类--JdbcUtil类 */ 3…

UE-Ueransim-5GC全链路开发记录

目录 1. 系统配置 1.1 Ueransim配置 1.2 UE配置 2. 启动 3. 实际演示 附录 代理1&#xff1a;ueransim-5gc 代理2 ue-ueransim TCPclient TCPserver 1. 系统配置 1.1 Ueransim配置 ueransim的yaml文件如下 version: 3.8 services:ueransim2:container_name: uera…

Ubantu docker学习笔记(六)容器数据卷

文章目录一、容器数据卷二、容器卷挂载2.1 在命令行挂载数据卷2.2 通过dockerfile挂载数据卷三、数据卷容器四、备份数据卷五、数据卷的恢复和迁移5.1 恢复数据卷5.2 迁移数据卷六、管理数据卷6.1 与容器关联&#xff08;1&#xff09;例子一&#xff08;2&#xff09;例子二&a…

【LeetCode】剑指 Offer(28)

目录 题目&#xff1a;剑指 Offer 54. 二叉搜索树的第k大节点 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 55 - I. 二叉树的深度 - 力…

MySQL运维11-MySQL的事务隔离级别

文章目录1、MySQL的事务隔离级别2、MySQL事务隔离级别的相关参数和命令2.1、查看事务隔离级别2.2、设置事务隔离级别2.2.1、在会话中设置事务隔离级别2.2.2、在配置文件中设置事务隔离级别3、MySQL的多版本并发控制(MVCC)4、总结1、MySQL的事务隔离级别 事务隔离级别越高&…

Qt5.12实战之规则DLL导出函数使用

1.创建基于MFC的规则DLL工程: 输入工程名,然后点击创建 选择使用共享MFC DLL的常规DLL 创建成功后,解决方案下会多出一个工程 增加导出函数声明 实现导出函数 在模块定义文件def文件中声明导出

YC-B09(原创)基于springboot,vue网上书城

(原创)基于springboot,vue网上书城定制版v4.0 本人原创作品&#xff0c;用户前台、系统管理员后台项目完整&#xff0c;无任何bug。 每行代码都是本人自己写&#xff0c;我在代码上面都写有详细注释 开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk…

代码随想录算法训练营第五十九天-单调栈2| 503.下一个更大元素II 42. 接雨水

503. Next Greater Element II 成环就用取模mod方法 import java.util.Arrays; import java.util.Stack;public class NextGreaterElement2 {public int[] nextGreaterElements(int[] nums) {//边界判断if(nums null || nums.length < 1){return new int[]{-1};}int size …

无需兔魔法!国内手机直接畅玩GPT!

为了用上ChatGPT很多同学都是经历一波三折&#xff0c;闯三关过五将&#xff01;因为使用ChatGPT的门槛很高&#xff0c;尤其是这个kx上网把很多人都挡在了门外&#xff01;有的同学说newbing呢&#xff0c;newbing如果你要用聊天功能&#xff0c;一样有这样门槛&#xff01;很…

Ubuntu docker 基本操作

安装docker&#xff1a; curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 也可以使用国内 daocloud 一键安装命令&#xff1a; curl -sSL https://get.daocloud.io/docker | sh 启动Docker命令&#xff1a; systemctl start docker 查看版本号&#xf…

NKCTF2023 babyrust

这道题目适合科普&#xff1a;rust逆向&#xff0c;xmm指令。 rust逆向的一些注意事项 rust题中&#xff0c;“ida给的main”里的第一个lea是“用户写的main”。 如下图&#xff0c;这是ida标记的main。而用户写的main其实是sub_1400012A0。姑且可以认为“ida给的main”里的…

初识springcloud

认识微服务 单体架构&#xff1a; 简单方便&#xff0c;高度耦合&#xff0c;扩展性差&#xff0c;适合小型项目&#xff0c;例如&#xff0c;学生管理系统。 分布式架构 松耦合&#xff0c;扩展性好&#xff0c;但架构复杂&#xff0c;难度大。适合大型互联网项目。如&#x…

【数据结构】解析队列各接口功能实现

目录 前言&#xff1a; 一、队列概述&#xff1a; 1.队列的概念&#xff1a; 二、队列的各种接口功能实现&#xff1a; 1.初始化队列&#xff1a; 2.入队&#xff08;尾插&#xff09;&#xff1a; 3.出队&#xff08;头删&#xff09;&#xff1a; 4.查看队头&#xf…

Zookeeper安装(Win和Linux)

Zookeeper安装 Zookeeper单机安装&#xff08;Windows&#xff09; 下载地址&#xff1a;Apache ZooKeeper 1.1 下载安装 下载好的文件进行解压缩得到apache-zookeeper-3.8.0-bin目录&#xff0c;创建zkdata及log目录&#xff0c;后续作为数据存放目录 1.2 配置启动 我们…

易点易动设备管理系统高效管理海量备品备件

纸质设备备品备件管理是企业运营中的重要环节&#xff0c;其管理效率和精度直接关系到企业的生产效率和经济效益。然而&#xff0c;传统的纸质管理方式存在诸多问题&#xff0c;如信息不透明、数据难以更新、易丢失等。为解决这些问题&#xff0c;易点易动设备管理系统应运而生…

webpack 之 Loader开发(一)

1. You may need an additional loader to handle the result of these loaders.&#xff08;我们可能还需要一个额外的加载器来处理当前加载器的结果&#xff09; 2. Loader可能经过一层层链路、又或者只有一层&#xff0c;最终的处理都是转化成 js&#xff0c;&#xff08;L…