第一种方式:方法的形参上给一个和请求参数同名的参数
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" />省
<input type="text" name="address.city" />市
<input type="text" name="address.county" />(区/县) <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";
}
}
测试结果:
第二种方式:使用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;
}