`
Adan-Chiu
  • 浏览: 21959 次
社区版块
存档分类
最新评论

spring mvc的数据转换和格式化

 
阅读更多

      

spring mvc的数据转换和格式化

      前面介绍了spring mvc的各个组件,spring mvc通过注解便可以让控制器得到丰富的参数类型,那么它是如何做到的呢,其实它是spring mvc的消息转换机制完成的。

       处理器在http请求到达控制器之前能够对http的各类消息进行处理。首先当一个请求到达DispatcherServlet的时候,需要找到对应的HandlerMapping,然后根据HandlerMapping去找到对应的HandlerAdapter执行处理器。处理器在要调用的控制器之前,需要先获取http发送过来的信息,然后将其转变为控制器的各种不同类型的参数,这就是各类注解能够得到丰富类型参数的原因。它首先用http的消息转换器(HttpMessageConverter)对消息转换,但这是一个比较原始的转换,它是String类型和文件类型比较简易的转换,它还需要进一步转换才能转换为POJO或者其它丰富的参数类型。为了拥有这样的能力,Spring 4提供了转换器和格式化器,这样通过注解的信息和参数的类型,它就能够把http发送过来的各种消息转换成为控制器所需要的各类参数了。

       当处理器完成了这些参数的转换,它就会进行验证(数据校验),下一步就是调用开发者提供的控制器了,将之前转换成功的参数传递进去,进而完成控制器的逻辑,返回结果后,处理器如果可以找到对应处理结果类型的HttpMessageConverter的实现类,它就会调用对应的HttpMessageConverter的实现方法对控制器返回的结果进行http转换,这一步不是必须的,可以转换的前提是能够找到对应的转换器。

        接下来就是关于视图解析和视图解析器的流程了。有时候要自定义一些特殊的转换规则,比如和第三方合作,第三方可能提供的并不是一个良好的json格式,而是一些特殊的规则,这时候就需要使用自定义的消息转换规则,把消息转为对应的java类型,从而简化开发。

对于spring mvc,在xml配置了<mvc:annotation-driven>,或者java配置的注解上加入@EnableEebMvc的时候,spring IoC容器会自定义生成一个关于转换器和格式化器的类实例-----FormattingConversionServiceFactoryBean,这样就可以从spring IoC容器中获取这个对象了,它是一个工厂,通过它可以获得DefaultFormattingConversionService类对象,它实现了转换器与格式化器的注册机(即ConverterRegistry与FormatterRegistry),我们可以通过它注册转换器与格式化器,SpringMvc默认已经注册了一些常用的转换器与处理器。

一对一转换器(Converter)

      Converter是一对一的转换器,先看看Converter的源码:

 

import org.springframework.lang.Nullable;
/**
 * 转换接口
 * @param <S>源类型
 * @param <T>目标类型
 */
@FunctionalInterface
public interface Converter<S, T> {
	@Nullable
	T convert(S source);
}

        spring mvc所提供的功能,能够满足一般的要求,但是有时候我们需要自定义实现转换器,此时只需要实现Converter接口,然后注册给转换服务类(FormattingConversionServiceFactoryBean类,实际是注册到DefaultFormattingConversionService类中)。

         jsp页面提交的privileges类型为String[]

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="${pageContext.request.contextPath }/control/role/save" method="post">
		<label>角色名称:</label><input type="text" name="name" required="required"/><br/>
		<input type="checkbox" name="privileges" value="departmentsave"/>部门添加
		<input type="checkbox" name="privileges" value="departmentremove"/>部门删除
		<input type="checkbox" name="privileges" value="departmentedit"/>部门编辑
		input type="checkbox" name="privileges" value="departmentlist"/>部门查看
		<br/>
		<input type="checkbox" name="privileges" value="rolesave"/>角色添加
		<input type="checkbox" name="privileges" value="roleremove"/>角色删除
		<input type="checkbox" name="privileges" value="roleedit"/>角色编辑
		<input type="checkbox" name="privileges" value="rolelist"/>角色查看
		<br/>
		<input type="submit"/>
	</form>
</body>
</html>

    相关 POJO类:

 

package com.wise.tiger.pojo;

import java.util.HashSet;
import java.util.Set;

public class Role {
	private Integer id;
	private String name;
        //角色所拥有的权限
	private Set<Privilege> privileges = new HashSet<Privilege>();
	//***********************setter and getter **************//
}

package com.wise.tiger.pojo;

public class Privilege {
	private Integer id;
	private String name;
	
	public Privilege() {}
	
	public Privilege(String name) {
		this.name = name;
	}
	//***********************setter and getter **************//
}

    Controller:

package com.wise.tiger.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wise.tiger.pojo.Role;

@Controller
@RequestMapping("control/role")
public class RoleManageController {
	@RequestMapping("/save")
	public String saveRole(Role role) {
		role.getPrivileges().forEach(pri->System.out.println(pri.getName()));
		return "role_list";
	}
	
	@RequestMapping("/saveUI")
	public String saveUI() {
		return "role_add";
	}
}

自定义一对一类型转换器

package com.wise.tiger.web.converter;
//*****************import****************//
/**
 * @Description:将http请求中的字符串数组转为pojo属性的Set<Privilege> 
 * @author: <a href="mailto:1020zhaodan@163.com">Adan</a> 
 * @date: 2019年5月31日  上午11:29:25
 * @version:1.0-snapshot
 */
public class StringArray2SetRoleConverter  implements Converter<String[], Set<Privilege>>{
	@Override
	public Set<Privilege> convert(String[] source) {
		if(source == null) return null;
		var ret = new HashSet<Privilege>();
		for(var privilegeName : source) {
			ret.add(new Privilege(privilegeName));
		}
		return ret;
	}
}

      注册转换器:在xml配置了<mvc:annotation-driven>,或者java配置的注解上加入@EnableEebMvc的时候,spring IoC容器会自定义生成一个关于转换器和格式化器的类实例-----FormattingConversionServiceFactoryBean,通过它可以生成一个ConversionService接口,实际为DefaultFormattingConversionService对象。

 

  • xml方式
<!--首先在mvc:annotation-driven元素上指定转换服务类,然后通过配置其属性加载对应的转换器 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
       <set>
          <bean class="com.wise.tiger.web.converter.StringArray2SetRoleConverter"/>
       </set>
    </property>
</bean>
  •  java配置
    @Configuration
    @ComponentScan(basePackages = "com.wise.tiger.web")
    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
    	@Override
    	public void addFormatters(FormatterRegistry registry) {
    		registry.addConverter(new StringArray2SetRoleConverter());
    	}
    	
    }

数组和集合转换器GenericConverter

      上面的转换器是一种一对一的转换,它只能从一种类型转换成另一种类型,不能进行一对多转换,为了克服这个问题,Spring core还加入了另外一个转换器GenericConverter。

    

使用格式化器

      有些数据需要格式化,比如日期、金额等,为了支持这些场景,Spring Context提供了相关的Formatter。它需要实现一个接口Formatter,而Formatter又扩展了两个接口Printer和Parser

       通过print方法能将结果按照一定的格式输出字符串,通过parse方法能够将满足一定格式的字符串转换为对象,它的内部实际是委托给Converter机制去实现的,需要自定义的场景不多(了解用法即可),这里介绍两个注解

  • @DateTimeFormat:进行日期格式的转换
  • @NumberFormat:进行数字的格式转换

 

@Controller
@RequestMapping("/convert")
public class ConvertController{
    @RequestMapping("/format")
    public String format(@DateTimeFormat(ios=ISO.DATE)Date date,
                         @NumberFormat(pattern="#,###.##")Double amount){
        ..........
    }
}
   参数可以是一个POJO,而不单单是一个日期或者数字,只是要给POJO加入对应注解:
public class FormatPojo{
	@DateTimeFormat(iso = ISO.DATE)
	private LocalDate date1;
	@NumberFormat(pattern = "##,###.00")
	private BigDecimal amount;
}	
 
@RequestMapping("/format")
public String format(FormatPojo){      
    ..........   
}
 

 

  • 大小: 6.4 KB
分享到:
评论

相关推荐

    Spring MVC 数据转换和格式化.docx

    在Spring MVC框架中,数据转换和格式化是一个关键部分,它允许我们处理各种类型的输入和输出数据,确保数据能够在客户端和服务器之间正确地传递。HttpMessageConverter是Spring MVC中的核心组件,负责处理HTTP请求和...

    Mastering Spring MVC 4(2015.09)源码

    Spring MVC 是一个强大的Java Web开发框架,它是Spring框架的一部分,专为构建高度可扩展和模块化的Web应用程序而设计。在2015年的版本中,Spring MVC 4已经相当成熟,提供了许多特性来简化开发流程并提高开发效率。...

    Spring MVC 学习笔记 九 json格式的输入和输出

    然后,在Spring的配置文件中,我们可以通过`&lt;mvc:annotation-driven&gt;`标签启用HTTP消息转换器支持,这样Spring MVC会自动处理JSON的序列化和反序列化。 3. **模型绑定和JSON输入** 当前端向后端发送JSON数据时,...

    spring mvc 整合包

    11. **转换器和格式化器(Converter & Formatter)**:处理请求参数和模型属性之间的类型转换,使数据绑定更加灵活。 12. **MessageSource**:处理国际化和本地化,提供多语言支持。 13. **异常处理**:通过@...

    Spring MVC数据绑定大全.rar

    11. **前后端分离场景下的数据绑定**:在RESTful API的设计中,虽然不直接使用视图,但数据绑定依然重要,因为它影响着JSON数据的序列化和反序列化。 通过深入理解并熟练运用上述知识点,开发者能够更高效地构建...

    Spring mvc5.0.3 所有jar包

    14. **MessageConverter**: Spring MVC使用MessageConverter处理HTTP请求和响应的转换,支持JSON、XML等多种格式。 15. **模板引擎**: Spring MVC支持多种模板引擎,如FreeMarker、Thymeleaf等,这些引擎可以将模型...

    spring MVC 对 ResponseBody返回json数据进行脱敏处理

    在Spring MVC框架中,开发Web应用时经常需要将对象转换为JSON格式的数据并返回给客户端。然而,在处理敏感数据时,我们可能希望对这些数据进行脱敏,即隐藏或替换某些字段,以保护用户隐私或者确保数据安全性。本文...

    spring mvc json&&jackson jquery js

    2. **配置Jackson**:在Spring配置文件中启用Jackson并配置其属性,如日期格式化。 3. **实体类注解**:在Java实体类中使用Jackson注解,如`@JsonProperty`,控制JSON序列化和反序列化。 4. **前端页面**:创建HTML...

    jQuery Spring MVC

    1. **Ajax通信**:Spring MVC 提供了`@ResponseBody`和`@RestController`注解,可以将后端处理的结果直接转换为JSON或XML格式返回给前端。jQuery 的`$.ajax()`或`$.get()`、`$.post()`方法可以发送Ajax请求,接收并...

    spring mvc

    这种做法有利于项目的模块化和维护。 #### 十七、Spring MVC 获取 Spring 管理的 Bean 在 Spring MVC 中,可以通过 `@Autowired` 注解自动注入 Spring 容器中的 Bean。此外,也可以使用 `ApplicationContext` 对象...

    第二章 Spring MVC 增改查实例

    **第二章 Spring MVC 增改查实例** Spring MVC 是 Spring 框架的一个模块,专为构建基于 Web 的应用程序而...通过实例化的增删改查操作,我们可以深入了解其工作原理,并结合源码分析,进一步掌握 Spring MVC 的精髓。

    spring-mvc-官方中文文档

    15. **国际化和本地化**:Spring MVC 支持 i18n 和 l10n,通过 MessageSource 和 LocaleResolver 实现多语言支持。 通过阅读《Spring MVC 官方中文文档》,开发者可以全面了解并掌握 Spring MVC 的使用,从而更有效...

    Spring MVC.pptx

    详细的Spring MVC教程,内容包括控制器 重定向 保存并获取属性参数 拦截器 表单标签和验证表单 视图和视图解析器 上传文件 数据转换和格式化

    Expert Spring MVC

    - 支持类型转换、数据格式化等功能。 4. **国际化支持**:通过 MessageSource 接口实现多语言的支持。 - 可以根据用户的语言设置返回相应的消息资源。 5. **文件上传/下载**:内置 Commons FileUpload 组件支持...

    Spring MVC 学习笔记 十二 PDF/Excel格式输出

    在Spring MVC中,Model代表业务逻辑和数据,View负责数据的展示,而Controller处理用户请求,协调Model和View之间的交互。这个设计模式有助于实现代码的分离,提高可维护性和可测试性。 首先,让我们从配置开始。...

    spring mvc(整合了json)

    2. **配置 Spring MVC**:在 Spring MVC 的配置文件中,我们需要添加 `Jackson` 的转换器,使得 Spring MVC 能够解析和生成 JSON 数据。例如,在使用 XML 配置时,可以添加以下配置: ```xml &lt;bean class="org....

    Spring MVC 切换数据源

    - 在Spring MVC中,我们可以使用Jackson或Gson库将数据转换成JSON格式,便于前端展示或API调用。 - 创建一个`@Controller`,使用`@ResponseBody`注解的方法来返回JSON对象。这些对象可以从数据源查询得到,然后...

    spring mvc 参数绑定漏洞

    1. **类型转换异常**:当用户提交的数据不符合预期的数据类型时,Spring MVC会尝试进行类型转换。如果转换失败,可能会抛出异常,暴露敏感信息或导致应用逻辑错误。 2. **未校验输入**:如果没有对用户输入进行适当...

    Spring MVC A Tutorial Second Edition

    书中内容从Spring框架的基础知识讲起,逐步深入到Spring MVC的各个特性,包括如何使用注解和XML配置来开发MVC应用程序,如何处理数据绑定和验证,以及如何利用转换器和格式化器来优化数据处理。通过本书的学习,读者...

    spring mvc异常处理

    在RESTful API开发中,通常需要返回统一的JSON响应格式,包括状态码、消息和数据。异常处理可以用来确保即使发生错误,响应格式也保持一致。 总结,Spring MVC的异常处理机制提供了多种方式来优雅地处理程序中的...

Global site tag (gtag.js) - Google Analytics