Spring MVC 注解及相关属性
- @Controller [ 默认属性为 value ]
在类定义处添加 注解 @Controller 结合spring的自动扫描配置,将其注册到 Spring 容器中,使其成为 Spring Web MVC 控制器,可以接收客户端的请求。
- @ResponseBody
在业务方法上添加 注解 @ResponseBody,Spring MVC 会将业务方法的返回值直接响应给客户端。如果没有添加该注解,Spring MVC 会将业务方法的返回值传递给 DispatcherServlet,由其调用视图解析器进行解析,最后映射到一个 JSP 资源。
- @RestController
注解 @RestController 是在类定义处添加的,它可以简单的理解为注解 @Controller 和注解 @ResponseBody 的结合。
- @RequestMapping 及其属性
注解 @RequestMapping 可以将传入的 Web 请求映射到适当的控制器或控制器方法。
类型级的 @RequestMapping 注解将请求映射到适当的控制器。
方法级的 @RequestMapping 注解将请求映射到指定控制器类的特定方法。
属性 | 功能 |
---|---|
value | 指定了映射到控制器或控制器方法的请求路径。 |
method | 指定了由控制器和控制器方法处理的 HTTP 请求。 常用 HTTP 请求方法的枚举值有:GET,POST,PUT,DELETE 等 。 |
params | 指定请求中必须存在的请求参数的名称和值。 |
consumes | 指定了控制器或控制器方法处理的请求的 MIME 类型。 |
produces | 指定了响应可接受的 MIME 类型。 |
headers | 指定了请求头的类型。 |
- @RequestParam 及其属性
注解 @RequestParam 完成 HTTP 请求参数与业务方法形参的映射,当请求参数与形参一致时可以不添加。
属性 | 功能 |
---|---|
value | 将 HTTP 请求中的指定的参数赋给形参。 |
required | 用于指定该参数是否必须。 |
defaultValue | 用于指定参数的默认值。 |
Spring MVC 数据绑定
简单:基本数据类型、包装类类型、数组的数据绑定
省略部分:pom.xml 导入相关依赖、web.xml 配置DispatcheServlet 和 CharacterEncodingFilter、springmvc.xml 开启基于注解的组件扫描并配置视图解析器。
- UserHandler.java 控制器类
package com.ored.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
@RestController
@RequestMapping("/user")
public class UserHandler {
// 基本数据类型的数据绑定
// 注解@RequestParam 将请求参数赋给方法的形参
// 请求路径:http://localhost:8080/user/baseType?uid=2
@RequestMapping(value = "/baseType",method = RequestMethod.GET)
public String baseType(@RequestParam("uid") int id){
return "请求参数为:" + id;
}
// 包装类的数据绑定 uid 可以为 Null 值
// 请求路径:http://localhost:8080/user/packageType?uid=4
@RequestMapping(value = "/packageType",method = RequestMethod.GET)
public String packageTeyp(@RequestParam("uid") int id){
return "请求参数为:" + id;
}
// 数组的数据绑定
// 请求路径:http://localhost:8080/user/array?name=zhangsan&name=lisi
@RequestMapping(value = "/array",method = RequestMethod.GET)
public String array(@RequestParam("name") String[] names){
return "请求参数为:" + Arrays.toString(names);
}
}
复杂:JavaBean、List、Map 类型的数据绑定。
演示案例,新增一个书店并展示。
- Book.java
package com.ored.domain;
import java.math.BigDecimal;
public class Book {
private String bookname;
private BigDecimal price;
// set and get methods not shown.
}
- BookStore.java
package com.ored.domain;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public class BookStore {
private Long bid; // 书店ID
private String name; // 书店名称
private String address; // 书店地址
private List<String> categories; // 图书类别
private Map<String,Book> books; // 图书价格
// set and get methods not shown.
}
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p><a href="/book/add">Add A BookStore.</a></p>
</body>
</html>
- 控制器类 BookController
package com.ored.controller;
import com.ored.domain.BookStore;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/book")
public class BookController {
// 跳转到表单页面
@RequestMapping(value = "/add")
public String add() {
return "add";
}
// 提交表单后展示
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(BookStore bookStore, Model model) {
model.addAttribute("bookstroe",bookStore);
return "details";
}
}
- 表单页 add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/book/save" method="post">
<fieldset>
<legend>Add a new bookstore</legend>
<p>
<lable for="bid">Bookstore ID:</lable>
<input type="text" id="bid" name="bid"/>
</p>
<p>
<lable for="name">Bookstore Name:</lable>
<input type="text" id="name" name="name"/>
</p>
<p>
<lable for="address">Bookstore Address:</lable>
<input type="text" id="address" name="address"/>
</p>
<p>
<%-- List 集合的数据绑定 --%>
Category:
<input type="checkbox" id="English" name="categories[0]" value="英语">
<label for="English">English</label>
<input type="checkbox" id="psychology" name="categories[1]" value="心理学">
<label for="psychology">psychology</label>
<input type="checkbox" id="philosophy" name="categories[2]" value="哲学">
<label for="philosophy">philosophy</label>
</p>
<%-- Map 集合的数据绑定 --%>
<p>The price of the book:</p>
<p>
<label for="bookname1">Book Name:</label>
<input type="text" id="bookname1" name="books['ISBN-001'].bookname">
<label for="price1">Price:</label>
<input type="text" id="price1" name="books['ISBN-001'].price" step="any"
placeholder="the book price in #.## format">
</p>
<p>
<label for="bookname2">Book Name:</label>
<input type="text" id="bookname2" name="books['ISBN-002'].bookname">
<label for="price2">Price:</label>
<input type="text" id="price2" name="books['ISBN-002'].price" step="any"
placeholder="the book price in #.## format">
</p>
<p>
<input type="reset" value="reset">
<input type="submit" value="submit">
</p>
</fieldset>
</form>
</body>
</html>
具体的效果:
- 展示页面 details.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>Bookstore ID:${bookstroe.bid}</p>
<p>Bookstore Name:${bookstroe.name}</p>
<p>Bookstore Address:${bookstroe.address}</p>
<p>Category:
<c:forEach items="${bookstroe.categories}" var="category">
${category}
</c:forEach>
</p>
<p>Books:</p>
<c:forEach items="${bookstroe.books}" var="book">
<tr>
<td>Book Name:${book.value.bookname}</td>
<td>Price:${book.value.price}</td>
</tr>
<br />
</c:forEach>
</body>
</html>
比较麻烦:Json 的数据绑定
1、在 WEB-INF/js 目录下将 JQuery 文件导入:jquery-3.3.1.min.js
2、在 web.xml 文件中添加以下配置,使 js 文件不被 DispatcherServlet 所拦截。
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
3、在 pom.xml 文件中导入相关依赖 fastjson 将 json 格式的数据转化为 Java Bean 对象。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.37</version>
</dependency>
- springmvc.xml 配置 FastJsonHttpMessageConverter
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
- 控制器 BookController.java
@RequestMapping(value = "/json")
@ResponseBody
// 注解 @RequestBody 将 Json 字符串转换为JavaBean对象[ 反序列化 ]
public Book json(@RequestBody Book book){
return book;
}
- json.jsp 发送异步请求
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script src="../../js/jquery-3.3.1.min.js" type="text/javascript"></script>
<script>
$(function () {
var book = {
"bookname": "English Grammer",
"price": 76
}
$.ajax({
url: "/book/json",
data: JSON.stringify(book),
type: "POST",
contentType: "application/json;charset=UTF-8",
dataType: "JSON",
success:function(data){
alert(data.bookname+"---"+data.price);
}
});
});
</script>
</head>
<body>
</body>
</html>