zoukankan      html  css  js  c++  java
  • 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 }

       

  • 相关阅读:
    python os模块 常用命令
    将excel表格中的数据导入到SQL中
    临时数据表DataTable selected方法的使用
    ASP.NET数据库使用精典读取数据库中数据
    新兵开唱
    DropDownList控件的changed事件调用
    C# 读取Excel表格中的数据
    C# 强制类型转换示例
    用ADO.NET的ExecuteScalar方法返回单一值
    CentOS 6.3 桥接上网
  • 原文地址:https://www.cnblogs.com/wigginess/p/13447445.html
Copyright © 2011-2022 走看看