Spring MVC从入门到精通—SpringMVC获取请求参数

第一种方式:方法的形参上给一个和请求参数同名的参数

1.获得普通类型的参数值

示例代码


    /**
     * 第1种获得请求参数的方式:在方法的形参上给一个和请求参数同名的参数,
     *  之后SpringMVC会帮我们自动注入参数值
     * @param username
     * @param model
     * @return
     */
    @RequestMapping(value = "/welcome")
    public String welcome(String username, Model model){

        System.out.println("用户名:"+username);
        model.addAttribute("username",username);
        return "success";
    }
2.获得POJO类型的值

示例代码
新建Book.java以及Address.java两个POJO
Book.java

package com.xzy.bean;

public class Book {

    private String name;
    private Double price;
    private Integer stock;   //库存
    private Integer sales;   //销量
    private String author;
    private Address address;  //地址

    //省略getter、setter方法,并且重写toString()方法
}

Address.java

package com.xzy.bean;

public class Address {

    private String province;
    private String county;
    private String city;

    //省略getter、setter方法,并且重写toString()方法

写一个简单的表单:
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SpringMvc获取参数</title>
</head>
<body>
<center>
    <h3>录入书籍信息</h3>
    <form action="book" method="post">
        书名:<input type="text" name="name" placeholder="输入书名..."/><br/>
        作者:<input type="text" name="author" placeholder="输入作者..."/><br/>
        价格:<input type="text" name="price" placeholder="输入价格..."/><br/>
        库存:<input type="text" name="stock" placeholder="输入库存..."/><br/>
        销量:<input type="text" name="sales" placeholder="输入销量..."/><br/>
        <input type="text" name="address.province" />省&nbsp;
        <input type="text" name="address.city" />市&nbsp;
        <input type="text" name="address.county" />(区/县)&nbsp;<br/>
        <button type="submit">提交信息</button>
    </form>
</center>
</body>
</html>

提交后的页面:
book.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"
    import="com.xzy.bean.*"
%>
<html>
<head>
    <title>SpringMVC获取参数</title>
</head>
<body>

<center>
    <div style="height: 200px;width: 100%">
        <h3>提交的书籍的信息:</h3>
        <table border="1px" width="50%">
            <tr><th>书名</th><td>${book.name}</td></tr>
            <tr><th>作者</th><td>${book.author}</td></tr>
            <tr><th>价格</th><td>${book.price}</td></tr>
            <tr><th>库存</th><td>${book.stock}</td></tr>
            <tr><th>销量</th><td>${book.sales}</td></tr>
            <tr><th>地区</th><td>${book.address}</td></tr>
        </table>
    </div>
</center>
</body>
</html>

提供一个控制器:
BookContorller.java

package com.xzy.controller;

import com.xzy.bean.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;

@Controller
public class BookContorller {

    /**
     * SprningMVC帮我们自动注入参数到POJO类型中,而且还可以级联注入
     * @param book
     * @param request
     * @return
     */
    @RequestMapping("/book")
    public String addbook(Book book, HttpServletRequest request){

        //打印得到的book信息
        System.out.println(book);
        request.setAttribute("book",book);

        return "book";
    }
}

测试结果:
Alt text
Alt text

第二种方式:使用SpringMVC提供的注解

1. 使用@RequestParam 获取参数

@RequestParam的源码:

public @interface RequestParam {
    //默认值就是它,表示请求参数的key
    @AliasFor("name")
    String value() default "";  
      
    //请求参数的值
    @AliasFor("value")
    String name() default "";  
    
   //设置这个参数是否必须,required=false表示这个参数不是必须的
    boolean required() default true;   
    
    //参数的默认值
    String defaultValue() default       "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";    
}

示例代码:

    /**
     * RequestParam设置获取参数的key为user,required=false表示这个参数不是必须的,
     * defaultValue是这个参数的默认值
     * @RequestParam(value = "user", required = false, defaultValue = "") String username;
     * 等价于以前写的:
     * String user=null!=request.getParameter("user")?request.getParameter("user"):"";
     * @param username
     * @param model
     * @return
     */
    @RequestMapping("/welcome3")
    public String welocme3( @RequestParam(value = "user", required = false) String username, Model model) {
        System.out.println("用户名:" + username);
        model.addAttribute("username", username);
        return "success";
    }
2.使用@RequestHeader获得请求的头部信息

@RequestHeader@ReuqestParma的实现方式如出一辙,使用方法也基本相同。
示例代码1:使用RequestHeader注解获得浏览器的信息

 /**
     *  @RequestHeader(value = "User-Agent",required = false,defaultValue = "") String userAgent
     *  获取请求头中的值,相当于以前写的:
     *  String header=null!=request.getHeader("User-Agent")?      request.getHeader("User-Agent"):"";
     * @param username
     * @param userAgent
     * @param model
     * @return
     */
    @RequestMapping("/welcome4")
    public String welocme4(
            @RequestParam(value = "user", required = false) String username,
            @RequestHeader(value = "User-Agent") String userAgent,
            Model model) {
        System.out.println("用户名:" + username);
        System.out.println("User-Agent"+userAgent);
        model.addAttribute("userAgent",userAgent);
        model.addAttribute("username", username);
        return "success";
    }

示例代码2:使用RequestHeader注解获取请求头部的Cookie信息

 /**
     * 使用RequestHeader获得请求头中的Cookie的全部信息
     * @param username
     * @param cookie
     * @param model
     * @return
     */
    @RequestMapping("/welcome5")
    public String welocome5(
            @RequestParam(value = "user", required = false) String username,
            @RequestHeader(value = "Cookie",required = false) String cookie,
            Model model){
        System.out.println("用户名:" + username);
        model.addAttribute("cookie",cookie);
        model.addAttribute("username", username);
        return "success";
    }
3.使用@CookieValue获得请求头部的JSESSIONID

示例代码:

/**
     * 使用SpringMVC提供的@CookieValue注解,可以只获的JSESSIONID的值
     * @param username
     * @param cookie
     * @param model
     * @return
     */
    @RequestMapping("/welcome6")
    public String welocome6(
            @RequestParam(value = "user", required = false, defaultValue = "") String username,
            @CookieValue(value = "JSESSIONID" ,required = false,defaultValue = "") String cookie,
            Model model){

        System.out.println("用户名:" + username);
        model.addAttribute("cookie",cookie);
        model.addAttribute("username", username);

        System.out.println("cookie:"+cookie);

        return "success";
    }
4. 使用@RequestBody接收前端传给后端的JSON格式的数据

       由于GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性。
使用示例;

    /**
     * 发表评论
     *
     * @param comment 评论信息
     */
    @ResponseBody
    @PostMapping(value = "/publish", produces = "application/json;charset=UTF-8")
    public Result publishComment(@RequestBody UserComment comment) {
        Result result = new Result();
        result.setMessage("您还未登陆,请登录后重试!");
        //登录用户就是发评论者,如果没有登录不可以发评论
        if (Objects.nonNull(comment) && Objects.nonNull(comment.getCommentSend()) && Objects.nonNull(comment.getCommentReceived())) {
            //更新文章的评论数
            executor.execute(() -> {
                Article article = new Article();
                article.setArticleId(comment.getArticleId());
                article.setArticleCommentNum(1);
                articleService.updateSelective(article);
            });
            int re = commentService.save(comment);
            if (re > 0) {
                result.setSuccess(true);
                result.setMessage("评论保存成功!");
            }
        }
        return result;
    }

留言区

还能输入500个字符