Spring MVC 使用介绍(八)—— 注解式控制器(三):类型转换

一、概述

二、PropertyEditor

1、基本介绍

PropertyEditor用于 String<--->Object 之间相互转换,spring内建了一些常用的PropertyEditor,如:

ClassEditor:  String<——>Class
FileEditor:  String<——>File
PatternEditor:  String<——>Pattern
URLEditor:  String<——>URL
ResourceEditor:  String<——>Resource

自定义的PropertyEditor须继承自PropertyEditorSupport,示例如下:

实体类

public class UserInfo {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

转换类

public class UserEditor extends PropertyEditorSupport  {

    public UserEditor() {
        System.out.println("UserEditor constructed");
    }

    @Override
    public String getAsText() {
        UserInfo userInfo = (UserInfo) this.getValue();
        return JSON.toJSONString(userInfo);
    }

    @Override
    public void setAsText(String text) throws java.lang.IllegalArgumentException {
        if (StringUtils.isEmpty(text)) {
            return;
        }

        UserInfo userInfo = JSON.parseObject(text, UserInfo.class);
        this.setValue(userInfo);
    }
}
@Controller
public class TestController5 {

    @RequestMapping("/type1")
    @ResponseBody
    public String testType1(@RequestParam("user") UserInfo userInfo) {
        System.out.println(userInfo.getName() + " " + userInfo.getAge());
        return "testType1";
    }

    @RequestMapping("/type2")
    @ResponseBody
    public String testType2() {     System.out.println("void");
        return "testType2";
    }
       // 注册UserEditor
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        UserEditor userEditor = new UserEditor();
        binder.registerCustomEditor(UserInfo.class, userEditor);
        System.out.println("initBinder invoked");
    }
}

web.xml与spring-mvc.xml配置略

启动后,先后访问:

http://localhost:8080/myweb/type1?user={"name":"matt","age":30}
http://localhost:8080/myweb/type2
http://localhost:8080/myweb/type1?user={"name":"matt","age":30}

输出:

UserEditor constructed
initBinder invoked
matt 30
void
UserEditor constructed
initBinder invoked
matt 30

从输出结果可以看出,处理方法若包含需要类型转换的参数,每次请求都会调用注册方法;处理方法如不包含则不会调用

2、自定义PropertyEditor的注册

自定义PropertyEditor的注册有三种级别:

  • 控制器级别,使用@InitBinder
  • web级别,使用WebBindingInitializer
  • 应用级别,自定义PropertyEditor与实体类同包,且命名为“实体名 + Editor”

i)控制器级别

控制器级别是在控制器类中使用@InitBinder注解来实现,注册范围为单个控制器,如上例所示

ii)web级别

web级别使用WebBindingInitializer来实现,注册范围为应用的所有控制器(即整个web层),示例:

WebBindingInitializer实现类

public class MyWebBindingInitializer implements WebBindingInitializer {

	public void initBinder(WebDataBinder binder, WebRequest request) {
		binder.registerCustomEditor(UserInfo.class, new UserEditor());
		System.out.println("initBinder invoked!");
	}
}

注册

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="cn.matt.convertor.MyWebBindingInitializer"/>
    </property>
</bean> 

注释上例控制器中的注册方法,即可测试

该注册方法的调用方式与控制器级别相同,即处理方法若包含需要类型转换的参数,每次请求都会调用注册方法;处理方法如不包含则不会调用

iii)应用级别(推荐)

应用级别的注册范围为spring层,使用方式:自定义PropertyEditor与实体类同包,且命名为“实体名 + Editor”,示例:UserInfoEditor

该注册方法在每次类型转换时均创建新的实例

原文地址:https://www.cnblogs.com/MattCheng/p/9183501.html

时间: 2024-08-02 10:57:23

Spring MVC 使用介绍(八)—— 注解式控制器(三):类型转换的相关文章

spring(6)--注解式控制器

6.1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated.   二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类. 并且提供了一组强大的注解: 需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controll

spring(7)--注解式控制器的数据验证、类型转换及格式化

7.1.简介 在编写可视化界面项目时,我们通常需要对数据进行类型转换.验证及格式化. 一.在Spring3之前,我们使用如下架构进行类型转换.验证及格式化: 流程: ①:类型转换:首先调用PropertyEditor的setAsText(String),内部根据需要调用setValue(Object)方法进行设置转换后的值: ②:数据验证:需要显示调用Spring的Validator接口实现进行数据验证: ③:格式化显示:需要调用PropertyEditor的getText进行格式化显示. 使用

注解式控制器

注解式控制器 Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated,建议不再使用了 Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类.并且提供了一组强大的注解: @Controller:用于标识是处理器类: @RequestMapping:请求到处理器功能方法的映射规则: @RequestParam:请求参数到处理器功能处理方法的方法参数上的绑定: @M

(六)注解式控制器详解

6.1.注解式控制器简介 一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated.   二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类. 并且提供了一组强大的注解:   需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器 AnnotationMethodHandlerAdapter来开启支持@Contr

SpringMVC入门之注解式控制器

上面一篇写的是配置式的控制器现在已经不推荐使用了,其实注解式控制器和它的差不多只不过 更简洁而已! 1.还是在web.xml中进行配置DispatcherServlet <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-para

spring mvc DispatcherServlet详解之一---前端控制器架构

前端控制器是整个MVC框架中最为核心的一块,它主要用来拦截符合要求的外部请求,并把请求分发到不同的控制器去处理,根据控制器处理后的结果,生成相应的响应发送到客户端.前端控制器既可以使用Filter实现(Struts2采用这种方式),也可以使用Servlet来实现(spring MVC框架). DispatcherServlet 作为前置控制器是web服务器的入口,是spring mvc最重要的一个类,通过它的生命周期可以加深对web服务器的理解. servlet的生命周期 首先我们回忆一下ser

Spring MVC 中的基于注解的 Controller【转】

原文地址:http://my.oschina.net/abian/blog/128028 终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响应请求.实际上,ControllerClassNameHandlerMapping, MultiActionController 和选择恰当的 methodNameResolver(如 InternalPathMetho

springmvc注解式控制器简介

一.Spring2.5之前,我们都是通过实现Controller接口或其实现来定义我们的处理器类.已经@Deprecated. 二.Spring2.5引入注解式处理器支持,通过@Controller 和 @RequestMapping注解定义我们的处理器类.并且提供了一组强大的注解: 需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和@RequestMapp

Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

一.控制器定义 控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现. 控制器解析用户的请求并将其转换为一个模型.在Spring MVC中一个控制器可以包含多个Action(动作.方法). 1.1.实现接口Controller定义控制器 Controller是一个接口,处在包org.springframework.web.servlet.mvc下,接口中只有一个未实现的方法,具体的接口如下所示: package org.springframework.web.servlet.

springMVC3学习 十 --注解式控制器

Spring2.5引入注解式处理器支持,通过@Controller和@RequestMapping注解定义 我们的处理器类.并且提供了一组强大的注解 需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter 来开启支持@Controller和@RequestMapping注解的处理器. @Controller:用于标识是处理器类: @RequestMapping:请求到处理器功能方法的映射规则: @