SpringMVC常见注解的使用

文章目录

    • 1. RequestParam:
    • 2. RequestBody:
    • 3. PathVariable:
    • 4. ModelAttribute:

1. RequestParam:

解决请求参数绑定时 请求参数名 不一致的情况。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Titletitle>
head>
<body>
    <%-- 前台这里用的 是 uname--%>
    <a href="${pageContext.request.contextPath}/anno/testRequestParam?uname=xptx">testRequestParama>
body>
html>

package com.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 *  常见的注解
 */

@Controller
@RequestMapping("/anno")
public class AnnotionController {

    /**
     *  前台 jsp 页面参数名称是 uname ,如果后台用 username 是无法绑定成功的,
     *  所以需要用 @RequestParam 注解进行绑定一下。
     * @param username
     * @return
     */
    @RequestMapping("/testRequestParam")
    public String testRequestParam(@RequestParam(name="uname") String username) {
        System.out.println("执行了。。。。。");
        System.out.println(username);
        return "success";
    }
}

在这里插入图片描述

2. RequestBody:

获取请求体的内容:

  • ​ 必须是 post 请求,get 请求会报 400 的错误。

SpringMVC常见注解的使用_第1张图片

    <form action="${pageContext.request.contextPath}/anno/testRequestBody" method="post">
        用户名:<input type="text" name="username"> <br>
        密码: <input type="password" name="password"> <br>
        <input type="submit" value="提交">
    form>
    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String body) {

        System.out.println(body);

        return "success";
    }

SpringMVC常见注解的使用_第2张图片

3. PathVariable:

拥有**绑定 url 中的 占位符**。例如: url 中有 /delete/{id},{id} 就是占位符。

一般都和 RestFul 风格结合起来使用。

<a href="${pageContext.request.contextPath}/anno/testPathVariable/18">testRequestParama>
    @RequestMapping("/testPathVariable/{sid}")
    public String testPathVariable(@PathVariable(name="sid") String id) {

        System.out.println(id);

        return "success";
    }

在这里插入图片描述

4. ModelAttribute:

作用 :

  • 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。可以修饰没有返回值的方法,也可以修饰有返回值的方法。
  • 出现在参数上,获取指定的数据给参数赋值。

应用场景: :

  • 当表单提交数据不是完整的实体数据时,保证没有提交数据的字段使用数据库原来的字段。
  • 例如:我们在编辑一个用户时,用户拥有一个创建信息的字段,该字段的值是不允许被修改的,在提交表单数据是必然没有此字段的内容,一旦更新后会把该字段内容设置为 null,当遇到类似的问题时,就可以使用该注解来解决问题。
    <form action="${pageContext.request.contextPath}/anno/testModelAttribute" method="post">
        用户名:<input type="text" name="studentName"> <br>
        年龄: <input type="text" name="studentAge"> <br>
        <input type="submit" value="提交">
    form>
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute() {
        System.out.println("执行了。。。。。");
        return "success";
    }

    @ModelAttribute
    public void showUser() {
        System.out.println("执行了showUser 方法");
    }

在这里插入图片描述

可以看到,控制器先执行了 @ModelAttribute 的方法。

当表单提交的数据不完整时:

SpringMVC常见注解的使用_第3张图片

可以看到, birth 的值是 null。

带返回值的 @ModelAttribute 方法:

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(Student student) {
        System.out.println("执行了。。。。。");
        System.out.println(student);
        return "success";
    }

    @ModelAttribute
    public Student showUser(String studentName) {

        // 根据 studentName 从数据库中拿到数据(模拟)
        Student student = new Student();
        student.setStudentName(studentName);
        student.setStudentAge(18);
        student.setBirth(new Date());

        return student;
    }

在这里插入图片描述

不带返回值的 @ModelAttribute 方法:

    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(@ModelAttribute("abc") Student student) {
        System.out.println("执行了。。。。。");
        System.out.println(student);
        return "success";
    }

    /**
     *  当没有返回值时,需要提供一个 Map 集合,存储对象,然后与上述方法相对应
     * @param studentName
     * @param map
     */
    @ModelAttribute
    public void showUser(String studentName, Map<String,Student> map) {

        // 根据 studentName 从数据库中拿到数据(模拟)
        Student student = new Student();
        student.setStudentName(studentName);
        student.setStudentAge(18);
        student.setBirth(new Date());

        map.put("abc",student);
    }

在这里插入图片描述

你可能感兴趣的:(Spring)