SpringMVC学习笔记(三)

简介: SpringMVC学习笔记

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

  1. 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>


相关文章
|
设计模式 前端开发 Java
SpringMVC系列(一)之SpringMVC入门详细介绍
SpringMVC系列(一)之SpringMVC入门详细介绍
|
6月前
|
前端开发 Java 应用服务中间件
|
XML 前端开发 Java
SpringMVC之入门
SpringMVC之入门
60 0
|
缓存 前端开发 Java
|
前端开发 Java fastjson
|
前端开发 Java
|
前端开发 Java 应用服务中间件
一文带你入门SpringMVC
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。 Spring MVC的特点: 轻量级,简单易学 高效 , 基于请求响应的MVC框架 与Spring兼容性好,无缝结合 约定优于配置 功能强大:RESTful、数据验证、格式化、本地化、主题等 简洁灵活
136 1
一文带你入门SpringMVC