Spring MVC之自定义数据转换器和REST

Spring MVC自定义数据转换器

数据转换器是指将客户端Http请求中的参数转换为业务方法中定义的形参,自定义表示开发者可以自主设计转换的方式,HandlerAdaptor已经提供了通用的数据转换的方式,HandlerAdapter已经提供了通用的转换,String转int、double,表单数据的封装等,但是在体术的业务场景下,HandlerAdapter无法进行转换,就需要开发者自定义转换器。

   

客户端输入String类型的数据"2020-08-04",自定义转换器将数据转化为Date类型的对象。

  • 创建DateConverter转换器,实现Conveter接口。

    1 package com.wiggin.converter;

    2 

    3 

    4 import org.springframework.core.convert.converter.Converter;

    5 

    6 import java.text.ParseException;

    7 import java.text.SimpleDateFormat;

    8 import java.util.Date;

    9 

   10 public class DateConverter implements Converter<String,Date> {

   11         private String pattern;

   12         public DateConverter(String pattern){

   13                 this.pattern = pattern;

   14         }

   15         @Override

   16         public Date convert(String s) {

   17                 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

   18                 Date date = null;

   19                 try {

   20                         date = simpleDateFormat.parse(s);

   21                 } catch (ParseException e) {

   22                         e.printStackTrace();

   23                 }

   24                 return date;

   25         }

   26 

   27 

   28 }

  • 在springmvc中配置转换器

    1         <!-- 配置转换器 -->

    2         <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">

    3                 <property name="converters">

    4                         <list>

    5                                 <bean class="com.wiggin.converter.DateConverter">

    6                                         <constructor-arg type="java.lang.String" value="yyy-MM-dd"></constructor-arg>

    7                                 </bean>

    8                         </list>

    9                 </property>

   10         </bean>

   11         <mvc:annotation-driven conversion-service="conversionService">

   12                 <mvc:message-converters register-defaults="true">

   13                         <bean class="org.springframework.http.converter.StringHttpMessageConverter">

   14                                 <property name="supportedMediaTypes" value="text/html;charset=UTF-8"></property>

   15                         </bean>

   16                         <!-- 配置fastjson -->

   17                         <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4"></bean>

   18                 </mvc:message-converters>

   19         </mvc:annotation-driven>

  • JSP

    1 <%--

    2     Created by IntelliJ IDEA.

    3     User: Administrator

    4     Date: 2020/8/4

    5     Time: 23:06

    6     To change this template use File | Settings | File Templates.

    7 --%>

    8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

    9 <html>

   10 <head>

   11         <title>Title</title>

   12 </head>

   13 <body>

   14         <form action="/converter/date" method="post">

   15                 请输入日期:<input type="text" name="date">{yyy-MM-dd}</br>

   16                 <input type="submit" value="提交">

   17         </form>

   18 </body>

   19 </body>

   20 </html>

原理:当Http提交数据,数据交给转换器处理,最后返回给Handler,再反给视图。

String转Student

StudentConverter

    1 package com.wiggin.converter;

    2 

    3 import com.wiggin.entity.Student;

    4 import org.springframework.core.convert.converter.Converter;

    5 

    6 public class StudentConverter implements Converter<String, Student> {

    7         @Override

    8         public Student convert(String s) {

    9                 String[] args = s.split("-");

   10                 Student student = new Student();

   11                 student.setId(Long.parseLong(args[0]));

   12                 student.setName(args[1]);

   13                 student.setAge(Integer.parseInt(args[2]));

   14                 return student;

   15         }

   16 }

Student

    1 package com.wiggin.entity;

    2 

    3 import lombok.Data;

    4 

    5 @Data

    6 public class Student {

    7         private long id;

    8         private String name;

    9         private int age;

   10 }

JSP

    1 <%--

    2     Created by IntelliJ IDEA.

    3     User: Administrator

    4     Date: 2020/8/5

    5     Time: 15:07

    6     To change this template use File | Settings | File Templates.

    7 --%>

    8 <%@ page contentType="text/html;charset=UTF-8" language="java" %>

    9 <html>

   10 <head>

   11         <title>Title</title>

   12 </head>

   13 <body>

   14         <form action="/converter/student" method="post">

   15                 请输入学生信息:<input type="text" name="student" />{id-name-age}

   16                 <input type="submit" value="提交">

   17         </form>

   18 </body>

   19 </html>

Handler

    1 @RequestMapping("/student")

    2 public String student(Student student){

    3         return student.toString();

    4 }

   

Spring MVC REST

RESTRepresentational State Transfer,资源表现层状态转换,是目前比较主流的一种互联网软件框架,它结构清晰、便准规范、易于理解、便于扩展。

  • 资源(Resource)

    网络上的一个实体,或者说网络存在的一个具体信息,文本,图片,歌曲,视频等等,总之是一个具体的存在,可以用一个URL(统一资源定位符)指向它,每个资源都有对应的一个URL,想获取资源只要访问对应的URL就可以了。

  • 表现层(Representation)

    资源具体呈现出来的形式,比如文本可以用txt格式表示,也可以用HTML、XML、JSON等格式来表示。

  • 状态转换(State Transfer)

    客户端如果希望操作服务器中某个资源,就需要通过某种方式让服务器发生状态转换器,而这种状态转换建立在表现层之上,所以叫做"表现层状态转换"

       

特点

  • URL更加简洁
  • 有利于不同的系统之间的资源共享,只要遵守一定的规范,不需要进行其他配置即可实现资源共享。

   

如何使用

REST具体操作就是HTTP协议中四个表现操作方式的动词分别对应的CRUD基本操作

GET -- 获取

POST -- 新建

PUT -- 修改

DELETE -- 删除

StudentRespository

    1 package com.wiggin.repository;

    2 

    3 import com.wiggin.entity.Student;

    4 

    5 import java.util.Collection;

    6 

    7 public interface StudentRepository {

    8         public Collection<Student> findAll();

    9         public Student findById(long id);

   10         public Student saveOrUpdate(Student student);

   11         public void deleteById(long id);

   12 

   13 }

StudentRespositoryImpl

    1 package com.wiggin.repository.impl;

    2 

    3 import com.wiggin.entity.Student;

    4 import com.wiggin.repository.StudentRepository;

    5 import org.springframework.stereotype.Repository;

    6 

    7 import java.util.Collection;

    8 import java.util.HashMap;

    9 import java.util.Map;

   10 

   11 @Repository

   12 public class StudentRepositoryImpl implements StudentRepository {

   13         private static Map<Long,Student> studentMap;

   14         static {

   15                 studentMap = new HashMap<>();

   16                 studentMap.put(1L,new Student(1L,"张三",22));

   17                 studentMap.put(2L,new Student(2L,"李四",23));

   18                 studentMap.put(3L,new Student(3L,"王五",24));

   19         }

   20         @Override

   21         public Collection<Student> findAll() {

   22                 return studentMap.values();

   23         }

   24 

   25         @Override

   26         public Student findById(long id) {

   27                 return studentMap.get(id);

   28         }

   29 

   30         @Override

   31         public Student saveOrUpdate(Student student) {

   32                 return studentMap.put(student.getId(),student);

   33         }

   34 

   35         @Override

   36         public void deleteById(long id) {

   37                 studentMap.remove(id);

   38         }

   39 }

Student

    1 package com.wiggin.entity;

    2 

    3 import lombok.AllArgsConstructor;

    4 import lombok.Data;

    5 import lombok.NoArgsConstructor;

    6 

    7 @Data

    8 @AllArgsConstructor

    9 @NoArgsConstructor

   10 public class Student {

   11         private long id;

   12         private String name;

   13         private int age;

   14 }

RESTHandler

    1 package com.wiggin.controller;

    2 

    3 import com.wiggin.entity.Student;

    4 import com.wiggin.repository.StudentRepository;

    5 import org.springframework.beans.factory.annotation.Autowired;

    6 import org.springframework.stereotype.Repository;

    7 import org.springframework.web.bind.annotation.*;

    8 

    9 import javax.servlet.http.HttpServletRequest;

   10 import javax.servlet.http.HttpServletResponse;

   11 import java.util.Collection;

   12 

   13 @RestController

   14 @RequestMapping("/rest")

   15 public class RESTHandler {

   16         @Autowired

   17         private StudentRepository studentRepository;

   18 

   19 

   20         @GetMapping(value = "/findAll")

   21         public Collection<Student> findAll(HttpServletResponse response){

   22                 response.setContentType("text/json;charset=UTF-8");

   23                 return studentRepository.findAll();

   24         }

   25 

   26         @GetMapping("/findById/{id}")

   27         public Student findById(@PathVariable("id") long id,HttpServletResponse response){

   28                 response.setContentType("text/json;charset=UTF-8");

   29                 return studentRepository.findById(id);

   30         }

   31 

   32         @PostMapping("/save")

   33         public void save(@RequestBody Student student){

   34                 studentRepository.saveOrUpdate(student);

   35         }

   36         @PostMapping("/update")

   37         public void update(@RequestBody Student student){

   38                 studentRepository.saveOrUpdate(student);

   39         }

   40         @DeleteMapping("/deleteById/{id}")

   41         public void deleteById(@PathVariable("id") long id){

   42                 studentRepository.deleteById(id);

   43         }

   44 

   45 }

   

posted @ 2020-08-06 17:02  wigginess  阅读(270)  评论(0编辑  收藏  举报