3、对需要校验的数据添加注解 @Validated
package cn.cqie.controller.e_validator; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.Errors; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; /** * Description: * Author: tiancx * Date: Created in 2021/11/23 21:30 */ @Controller public class UserController { @RequestMapping("save") public String save(@Validated User user, Errors errors, Model model){ System.out.println("UserController.save"); List<FieldError> fieldErrors = errors.getFieldErrors(); for( FieldError fieldError:fieldErrors){ System.out.println(fieldError.getField()+" "+fieldError.getDefaultMessage()); model.addAttribute(fieldError.getField()+"msg",fieldError.getDefaultMessage()); } if(fieldErrors.size()!=0) return "e"; return null; } }
4、在SpringMVC中注册校验器
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="cn.cqie.controller.e_validator"/> <mvc:annotation-driven validator="validator" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> </bean> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> </bean> </beans>
SpringMVC集成JSON
1、添加依赖
将对象或者集合转换成json
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.9.0</version> </dependency>
2、在方法上添加注解@ResponseBody
package cn.cqie.controller.f_ajax; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList; import java.util.List; /** * Description: * Author: tiancx * Date: Created in 2021/11/23 21:30 */ @Controller public class UserController{ @RequestMapping("list") @ResponseBody //返回的对象交给jackson-databind进行转json并输出的操作 public List<User> list(){ System.out.println("UserController.list"); List<User> list = new ArrayList<>(); list.add(new User("yx",26)); list.add(new User("tcx",20)); return list; } @RequestMapping("save") @ResponseBody public String save(@RequestBody User user){ System.out.println("UserController.save"); System.out.println(user); return "ok"; } }
要求页面传递数据格式为json
- data:JSON.stringify(jsonStr)
在Controller方法上添加注解@RequestBody
- public String save(@RequestBody User user)
因为默认按照键值对解析数据
- contentType:“application/json”
可以使用POSTMAN进行测试
f.jsp
<%-- Created by IntelliJ IDEA. User: admin Date: 2021/11/25 Time: 17:18 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> </head> <body> <form > <input type="text" name="name" id="name"> <input type="text" name="age" id="age"> <button id="btnSave">btnSave</button> </form> </body> <script> $(document).ready(function (){ $('#btnSave').click(function (){ var jsonStr = {'name':$('#name').val(),'age':$('#age').val()} alert(JSON.stringify(jsonStr)) $.ajax({ url : "save", type : "post", contentType : "application/json", data:JSON.stringify(jsonStr), success:function(data){ alert(data); } }); }); }); </script> </html>
postMan工具的使用
RESTful
RESTful概念
REST(英文:Representational State Transfer,简称REST)
表述性状态转移; 表现状态传输;
描述了一个架构样式的网络系统,比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,Roy Fielding是 HTTP 规范的主要编写者之一。
在目前主流的三种Web服务交互方案中,REST相比于SOAP(Simple Object Access protocol,简单对象访问协议)以及XML-RPC更加简单明了,无论是对URL的处理还是对Payload的编码,REST都倾向于用更加简单轻量的方法设计和实现。值得注意的是REST并没有一个明确的标准,而更像是一种设计的风格。
特点
RESTFUL特点包括:
1、每一个URI代表1种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。
RESTful资源设计规则
URI
URI 表示资源,资源一般对应服务器端领域模型中的实体类。
URI规范
不用大写;
用中杠-不用下杠_;
参数列表要encode;
URI中的名词表示资源集合,使用复数形式。
资源集合 vs 单个资源
URI表示资源的两种方式:资源集合、单个资源。
资源集合:
/zoos //所有动物园
/zoos/1/animals //id为1的动物园中的所有动物
单个资源:
/zoos/1 //id为1的动物园
/zoos/1;2;3 //id为1,2,3的动物园
避免层级过深的URI
/在url中表达层级,用于按实体关联关系进行对象导航,一般根据id导航。
过深的导航容易导致url膨胀,不易维护,如 GET /zoos/1/areas/3/animals/4,尽量使用查询参数代替路径中的实体导航,如GET /animals?zoo=1&area=3;
对Composite资源的访问
服务器端的组合实体必须在uri中通过父实体的id导航访问。
组合实体不是first-class的实体,它的生命周期完全依赖父实体,无法独立存在,在实现上通常是对数据库表中某些列的抽象,不直接对应表,也无id。一个常见的例子是 User — Address,Address是对User表中zipCode/country/city三个字段的简单抽象,无法独立于User存在。必须通过User索引到Address:GET /user/1/addresses
- Request
HTTP方法
通过标准HTTP方法对资源CRUD:
GET:查询
GET /zoos
GET /zoos/1
GET /zoos/1/employees
POST:创建单个资源。POST一般向“资源集合”型uri发起
POST /animals //新增动物
POST /zoos/1/employees //为id为1的动物园雇佣员工
PUT:更新单个资源(全量),客户端提供完整的更新后的资源。与之对应的是 PATCH,PATCH 负责部分更新,客户端提供要更新的那些字段。PUT/PATCH一般向“单个资源”型uri发起
PUT /animals/1
PUT /zoos/1
DELETE:删除
DELETE /zoos/1/employees/2
DELETE /zoos/1/employees/2;4;5
DELETE /zoos/1/animals //删除id为1的动物园内的所有动物
Controller.java
package cn.cqie.controller.g_rest; import cn.cqie.controller.f_ajax.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; /** * Description: * Author: tiancx * Date: Created in 2021/11/23 21:30 */ @Controller @RequestMapping("users") public class UserController { //get请求都是做查询操作 //使用get请求http://localhost:8080/projectname/users // @RequestMapping(method = RequestMethod.GET) @GetMapping public String findAll(){ System.out.println("UserController.findAll"); return null; } //使用get请求http://localhost:8080/projectname/users/1 // @RequestMapping(value = "{id}",method = RequestMethod.GET) @GetMapping(value = "{id}") public String findOne(@PathVariable Integer id){ System.out.println("UserController.findOne: "+id); return null; } //post请求做新增操作 // @RequestMapping(method = RequestMethod.POST) @PostMapping public String save(User user){ System.out.println("UserController.save: "+user); return null; } //put请求做修改操作 // @RequestMapping(method = RequestMethod.PUT) @PutMapping public String update(User user){ System.out.println("UserController.update: "+user); return null; } //delete请求做删除操作 // @RequestMapping(value = "{id}",method = RequestMethod.DELETE) @DeleteMapping(value = "{id}") public String delete(@PathVariable Integer id){ System.out.println("UserController.delete: "+id); return null; } }
g.jsp
<%-- Created by IntelliJ IDEA. User: admin Date: 2021/11/25 Time: 17:18 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" isELIgnored="false" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> </head> <body> <form action="users" method="post"> <input type="text" name="name"> <input type="text" name="age"> <button id="btnSave">btnSave</button> </form> <hr> <form action="users" method="post"> <!-- 如果要做put请求: 1.需要添加隐藏域,声明put请求 2.使用一个过滤器读取隐藏域信息,完成put请求 --> <input type="hidden" name="_method" value="put"> <input type="text" name="name"> <input type="text" name="age"> <button id="update">update</button> </form> <hr> <form action="users/9" method="post"> <input type="hidden" name="_method" value="delete"> <button id="delete">delete</button> </form> </body> </html>