SpringMVC 中的常用注解和用法

目录

什么是 Spring MVC?

MVC 介绍

SpringMVC 中的常用注解

@RequestMapping

指定 GET/POST 方法类型

@GetMapping 和 PostMapping

获取参数

传递单个参数

传递对象

​编辑传递多个参数

后端参数重命名

​编辑 @RequestParam

@RequestBody 接收JSON对象

获取URL中参数@PathVariable

上传文件@RequestPart

获取项目目录的几种方式:

获取Cookie/Session/header

获取 Cookie @CookieValue

获取 Header @RequestHeader

Session 存储和获取


什么是 Spring MVC?

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。正式名称“Spring Web MVC”来自其源模块(spring-webmvc)的名称,但更常见的名称是“Spring MVC”。

从上述定义我们可以得出两个关键信息:

1. Spring MVC 是⼀个 Web 框架。

2. Spring MVC 是基于 Servlet API 构建的。

MVC 介绍

SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring 的 Spring MVC 框架或集成其他 MVC 开发框架。

SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,已成为最优秀的 MVC 框架。


SpringMVC 中的常用注解

@RequestMapping

@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的。

路由映射:所谓的路由映射指的是,当用户访问⼀个 url 时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射。

@RequestMapping 基础使用:

@Controller
@RequestMapping("/p")
public class PersonController { 
    @RequestMapping("/index")
    public Object index(Person person) {
        // 获取参数
        System.out.println(person.getName() + ":" +
                person.getPassword());
        return "/index.html";
    }
}

 @RequestMapping 即可修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类 + 方法。@RequestMapping 也可以直接修饰方法,代码实现如下:

@Controller
@ResponseBody // 定义返回的数据格式为⾮视图(text/html)
public class UserController {
       @RequestMapping("/hi")
       public String sayHi(){
              return "<h1>Hi,Spring MVC.</h1>";
       }
}

指定 GET/POST 方法类型

我们可以显示的指定 @RequestMapping 来接收 POST 的情况,如下所示:

@Controller
@ResponseBody // 定义返回的数据格式为⾮⻚⾯
public class UserController {
        @RequestMapping(value = "/hi",method= RequestMethod.POST)
        public String sayHi(){
              return "<h1>Hi,Spring MVC.</h1>";
        }
}

@GetMapping 和 PostMapping

get 请求的 3 种写法:

// 写法1

@RequestMapping("/index")

// 写法2

@RequestMapping(value = "/index",method = RequestMethod.GET)

// 写法3

@GetMapping("/index")

post 请求的 2 种写法:

// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")

获取参数

传递单个参数

在 Spring MVC 中可以直接用方法中的参数来实现传参,比如以下代码:

@Controller
@ResponseBody // 定义返回的数据格式为⾮⻚⾯
public class UserController {

        @RequestMapping("/name")
        public Object method_1(String name){
            System.out.println("参数 name:"+name);
            return name;
        }
}

在浏览器中访问的结果:

idea里面获取到的结果 :

传递对象

并且 Spring MVC 可以自动实现参数对象的赋值,比如 Person 对象:

import lombok.Data;

@Data
public class Person {
    private String name;
    private String password;

}

传递对象代码实现:

@RequestMapping("/person")
public Object method_2(Person p){
       System.out.println("对象中的 name:"+p.getName());
       System.out.println("对象中的 password:"+p.getPassword());
       return p.getName()+":"+p.getPassword();
}

在浏览器中访问的结果:

在idea里面获取到的结果:

传递多个参数

@RequestMapping("/many")
        public Object method_3(String name, String pwd) {
            System.out.println("name 参数:" + name);
            System.out.println("pwd 参数:" + pwd);
            return name+" "+pwd;
        }

在浏览器中访问的结果:

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果。 

后端参数重命名

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,比如前端传递了⼀个 time 给后端,而后端又是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值。

后端实现代码:

@RequestMapping("/createtime")
public Object method_4(@RequestParam("time") String createtime) {
      System.out.println("时间:" + createtime);
      return createtime;
}

前端访问结果:

 @RequestParam

上面的例子,如果我们是前端传递⼀个非 time 的参数,就会出现程序报错的情况,如下图所示:

这是因为后端已经声明了前端必须传递⼀个 time 的参数,但是前端没有给后端传递,我们查看 @RequestParam 注解的实现细节就可以发现端倪,注解实现如下:

required:必须的意思,默认为true,不传参数就会报错

我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,具体实现如下:

@RequestMapping("/createtime")
public Object method_4(@RequestParam(value = "time",required = false) String createtime) {
       System.out.println("时间:" + createtime);
       return createtime;
}

@RequestBody 接收JSON对象

后端代码:

@RequestMapping(value = "/m5", method = RequestMethod.POST)
public Object method_5(@RequestBody Person person) {
       System.out.println("Person:" + person);
       return true;
}

此处用postman构造一个json请求:

获取URL中参数@PathVariable

后端代码:

@PostMapping("/m6/{name}/{password}")
public Object method_6(@PathVariable String name, @PathVariable String password) {
       System.out.println("name:" + name);
       System.out.println("password:" + password);
       return true;
}

 前端方法地址:

注意:{name}和{password}缺一不可

上传文件@RequestPart

@RequestMapping("/param")
public String param(String name, @RequestPart("myfile") MultipartFile file) throws IOException {
            // 获取⽂件后缀名
        String fileName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            // ⽂件保存地址
        String filePath = ClassUtils.getDefaultClassLoader().getResource("static").getPath() +
                    "/" + UUID.randomUUID() + fileName;
            // 保存⽂件
        file.transferTo(new File(filePath));
        return filePath + " 上传成功.";
}

获取项目目录的几种方式:

ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX).getPath();
new ClassPathResource("").getFile().getAbsolutePath();
ClassUtils.getDefaultClassLoader().getResource("").getPath();
ResourceUtils.getFile("classpath:static/").getPath();

获取Cookie/Session/header

获取 Cookie @CookieValue

@RequestMapping("/cookie")
@ResponseBody
public String cookie(@CookieValue("bite") String bite) {
       return "cookie:" + bite;
}

获取 Header @RequestHeader

@RequestMapping("/header")
@ResponseBody
public String header(@RequestHeader("User-Agent") String userAgent) {
     return "userAgent:"+userAgent;
}

Session 存储和获取

Session 存储和 Servlet 类似,是使用 HttpServletRequest 中获取的,如下代码所示:

@RequestMapping("/setsess")
@ResponseBody
public String setsess(HttpServletRequest request) {
        // 获取 HttpSession 对象,参数设置为 true 表示如果没有 session 对象就创建⼀个session
        HttpSession session = request.getSession(true);
        if(session!=null){
            session.setAttribute("username","java");
        }
        return "session 存储成功";
}

读取 Session 可以使用 HttpServletRequest,如下代码所示:

@RequestMapping("/sess")
@ResponseBody
public String sess(HttpServletRequest request) {
        // 如果 session 不存在,不会⾃动创建
        HttpSession session = request.getSession(false);
        String username = "暂⽆";
        if(session!=null && session.getAttribute("username")!=null){
            username = (String) session.getAttribute("username");
        }
        return "username:"+username;
}

获取 Session 更简洁的方式:

@RequestMapping("/sess2")
@ResponseBody
public String sess2(@SessionAttribute(value = "username",required = false) String username{
     return "username:"+username;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马可波罗.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值