`
lovefly_zero
  • 浏览: 390028 次
  • 性别: Icon_minigender_1
  • 来自: 株洲
社区版块
存档分类
最新评论

Spring Json View之绑定

阅读更多

  

 

绑定-数据类型转换

 

1.用法说明

2.JsonStringWriter

       2.1.SojoJsonStringWriter

       2.2.JsonlibJsonStringWriter

3.比较

 

1. 用法说明

 

     Spring-Json View 当前提供了JSON-lib和SOJO的绑定支持。你可以从Spring Command或FormController中实现你已知的绑定方式。通常的做法是您在该控制器的initBinder方法内通过ServletRequestDataBinder注册一个CustomEditor。

 

 

     默认情况下,Spring-MVC提供通过Command bean 的属性绑定CustomEditors:

  • java.util.Date的普通数据类型
  • 支持CommonsBeanUtils语法的ComandBean属性 

@Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); CustomDateEditor editor = new CustomDateEditor(dateFormat, true); binder.registerCustomEditor(Date.class, editor); binder.registerCustomEditor(Date.class, "birthday", editor); }

 


 

2. JsonStringWriter

 

 

     JsonStringWriter 管理model/Command对象间值的转换,当然,还有生成Json字符串。JsonStringWriter能最大限度地保持着您在Spring MVC所知道的CustomEditors的注册方式。在已知的Json类库的数据转换约定并不完全支持我们需要的特性。另一方面,有些Json类库的一些特定方式的特性你也可以使用。所以你可以按照JsonStringWriter的实现一些不同的绑定支持。

    在下面的章节将告诉你它们将帮助你如何去选择合适的JsonStringWriter 

 

 

2.1 SojoJsonStringWriter - Sojo Json 支持

 

SojoJsonWriter Spring Json-View 的默认实现。它是一个通过Sojo Json 方式传输和非常接近默认Spring-MVC绑定行为的整合方案。 

      你可以绑定一个CustomEditors到:

  •    java.util.Date普通数据类型
  •    持CommonsBeanUtils语法的ComandBean属性
  •    可选:在类似它们的Model中的任意其它对象添加referenceData方法。

      可选:通过SojoJsonWriterConfiguratorTemplate可注册一个自定义“ SojoConfig ”对象。

 

2.2 JsonlibJsonStringWriter -  Json-Lib支持

 

JsonlibJsonStringWriter 提供了Json-Lib框架到Spring Json-View的集成。我发现它没有按CommensBeanUtils-Syntax匹配ComandBean实现本地化属性的方法。但是你可以通过注册一个JsonlibJsonWriterConfiguratorTemplate从而完全操纵Json-Lib框架。它是一个"net.sf.json.JsonConfig"对象的封装。更多信息请参见Json-lib 主页。

 

你可以绑定一个CustomEditors到:

 

   1. java.util.Date普通数据类型  (它显式转换成map model)
  

   可选:通过JsonlibJsonWriterConfiguratorTemplate注册一个自定义"net.sf.json.JsonConfig" 对象。 

 

3 比较

 

 

 

 

 

SojoJsonStringWriter

JsonlibJsonStringWriter

 类库支持

SOJO-0.5.0

JSON-lib-2.2.1

 默认写入器

ComandBean转换

 

 

转换类的类型

通过Commons BeanUtils语法定位属性

强类型Collection转换

其它Model Map属性转换

 

 

转换类的类型

可选

一直

通过Commons BeanUtils语法定位属性

可选

强类型Collection转换

JsonWriterConfiguratorTemplate

可选

可选

 

 

SojoJsonWriter - Sojo Json 支持

    1. 绪论
    2. 
简单绑定
    3.
绑定CommandBean属性

    4. 转换所有Model值
         1.
通过CustomEditor转换所有值到Model-Map

         2. 通过CustomEditor转换指定值到Model-Map

     5. 注册SojoJsonWriterConfiguratorTemplates

 

1. 绪论

SojoJsonWriter Spring Json-View 的默认实现。它是一个通过Sojo Json 方式传输和接近默认Spring-MVC绑定方式的整合方案。

 

你可以绑定一个CustomEditors到:

  •    java.util.Date普通数据类型
  •    持CommonsBeanUtils语法的ComandBean属性
  •    可选:在类似它们的Model中的任意其它对象添加referenceData方法。
  •  注意 
            Spring Json View
    不能绑定如下例BeanCollection类型中的属性:

           

            Spring提供的标准写法:

                 bean.list.property

                 这个语法是定义conllection中从0-n的所有属性


            Spring Json View则必须
    像下面这样使用解释型索引才能找出Collection-Beans的属性:

              bean.list[0].property

              bean.set[1].list[2].property

     

    2. 简单绑定 

     

    initBinder 源文件:
    =================

     

    @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); CustomDateEditor editor = new CustomDateEditor(dateFormat, true); binder.registerCustomEditor(Date.class, editor); }

     

    
    

     

    效果:
    =======

     

    {"command":{
                "birthday":"30-01-2008",
                "marriage":"30-01-2008",
                "placeofbirth":"Sydney"
    }}

     

    3. 绑定CommandBean属性

     

    CommonsBeanUtils语法定位CommandBean的属性

     

    initBinder 源文件:
    ==================

     

    @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); CustomDateEditor editor = new CustomDateEditor(dateFormat, true); binder.registerCustomEditor(Date.class, "birthday", editor); }

     

    
    

     

    效果:
    ======

     

    {"command":{
              "birthday":"30-01-2008",
              "marriage":"Wed Jan 30 00:00:00 GMT 2008",
              "placeofbirth":"Sydney"
    }} 

     

    4. 转换所有Model的值

     

    SojoJsonStringWriter可以为非CommandBean属性提供转换到Model Map。你可以通过在view.xmlJsonWriter- Bean设置convertAllMapValues 属性来激活这个特性。

     

    您可以通过注册CustomEditor的开始部分的字段以定位它们(非commandbean键)。

         * (name_in_model_map_key).property
         * (key).list[1].property 

     

    <beans> <bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView"> <property name="jsonWriter"><ref bean="jsonWriter"/></property> </bean> <bean name="jsonWriter" class="org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter"> <property name="convertAllMapValues"><value>true</value></property> </bean> </beans>

     

    
    

     

     

    4.1 通过CustomEditor转换所有值到Model-Map

     

     initBinder 源文件:
     ==================

     

    @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); CustomDateEditor editor = new CustomDateEditor(dateFormat, true); binder.registerCustomEditor(Date.class, editor); }

     

    
    

     

     

      效果:
      =======

     

      {"signdate":"30-01-2008",
        "command":{
                "birthday":"30-01-2008",
                "marriage":"30-01-2008",
                "placeofbirth":"Sydney"
       }}

     

     

    4.2 通过CustomEditor转换指定值到Model-Map

     

      initBinder 源文件:
      ==================

      

    @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); CustomDateEditor editor = new CustomDateEditor(dateFormat, true); binder.registerCustomEditor(Date.class, "birthday", editor); binder.registerCustomEditor(Date.class, "(signdate)", editor); }

     

    
    

       

      效果:
      =======

     

       {"signdate":"30-01-2008",
        "command":{
                "birthday":"30-01-2008",
                "marriage":"Wed Jan 30 00:00:00 GMT 2008",
                "placeofbirth":"Sydney"
        }}

     

     

      5. 注册SojoJsonWriterConfiguratorTemplates

     

     如果你想使用一个SojoJsonWriterConfiguratorTemplate,你必须要

    1. 在JsonlibJsonStringWriter中设置"enableJsonConfigSupport"属性。
    2. 实现SojoJsonWriterConfiguratorTemplate抽象类。
    3. 在JsonWriterConfiguratorTemplateRegistry中注册SojoJsonWriterConfiguratorTemplate。

      推荐把SojoJsonWriterConfiguratorTemplate注册在initBinder方法中,但前提您应有任意一个可以发送请求的控制器方法。这个方法甚至可以是一个纯控制器接口实现的handleRequest 方法。

     

      在spring配置文件中设置enableJsonConfigSupport属性

       

    <beans> <bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView"> <property name="jsonWriter"><ref bean="jsonlibJsonWriter"/></property> </bean> <bean name="jsonlibJsonWriter" class="org.springframework.web.servlet.view.json.writer.jsonlib.JsonlibJsonStringWriter"> <property name="enableJsonConfigSupport"><value>true</value></property> </bean> </beans>

     

    
    

     

      配置 : SojoConfig

     

     

    SojoConfig 属性 函数  允许值 默认值
    convertAllMapValues 见 4. 转换所有Model值 true, false false
    ignoreNullValues Model-Map中所有“null”值将被忽略其他如"属性":null将被自动转换为"null" true, false false
    excludedProperties 整个Model Map的属性都能被排除在外 像(name_in_model_map_key )属性一样的字符串数组
     commandbean属性

    String - Array

    interceptorList 增加注册Sojo WalkerInterceptor-Interface的实现,详见sojo主页 Sojo WalkerInterceptor的实现
    List

      

      注册SojoJsonWriterConfiguratorTemplates

     

     initBinder 源码:

     ================== 

     

    @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ JsonWriterConfiguratorTemplateRegistry registry = JsonWriterConfiguratorTemplateRegistry.load(request); registry.registerConfiguratorTemplate( new SojoJsonWriterConfiguratorTemplates(){ @Override public SojoConfig getJsonConfig() { SojoConfig config= new SojoConfig(); String[] excludes = new String[]{ "birthday" }; config.setExcludedProperties(excludes); return config; } } ); }

     

    
    

     

     效果:

      =======

         {
            "command":{
                                 "placeofbirth":"Sydney"
         }} 

     

     

     

    JsonlibJsonWriter - Json-Lib支持

       1. 绪论

       2. 使用
       3. 
    绑定

       4. 注册 JsonlibJsonWriterConfiguratorTemplates

     

    1. 绪论

       JsonlibJsonWriter的绑定能力相对较弱.

       1.你只能绑定公共值的类类型到一个CustomEditor,如 java.util.Date到整个Model Map。您不能具体指定单个的bean属性或一个Collection的索引属性!

       2. 你能通过注册JsonlibJsonWriterConfiguratorTemplate订制一个JsonConfig对象以完成"从model-map到JSON"的转换

        JsonlibJsonWriterConfiguratorTemplate 使你能够使用一些Json-Lib高级特性,比如你能使用过滤或者触发一些事件。

     

    注意:

        JsonlibJsonWriter会 注册一个自己的JsonValueProcessor 并用JsonValueProcessorMatcher匹配它。

         * JsonValueProcessor 使JsonlibJsonWriter 能够把CustomEditor注册到它的一个initBander方法里。

         * JsonValueProcessorMatcher 会匹配JsonValueProcessor所有的值。JsonValueProcessor能决定这些值是否已经转换。

         如果你想注册一个自定义的JsonValueProcessor或者 BeanProcessor,请记住,在某种程度上它并不能完全按你期望的可能来改变JsonlibJsonWriter 的行为,所以最好多测试你的程序。

         * 您注册的任何一个自定义行为都不会影响“从请求属性到CommandBean”之间的绑定和转换。

     

    2. 使用

       注册一个JsonlibJsonStringWriter-BeanJsonView

        

    <beans> <bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView"> <property name="jsonWriter"><ref bean="jsonlibJsonWriter"/></property> </bean> <bean name="jsonlibJsonWriter" class="org.springframework.web.servlet.view.json.writer.jsonlib.JsonlibJsonStringWriter"/> </beans>

     

    
    

     

    3. 绑定

      initBinder 源文件:
      =================

    @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); CustomDateEditor editor = new CustomDateEditor(dateFormat, true); binder.registerCustomEditor(Date.class, editor); }

     

    效果:
    =======

     

    {"signdate":"30-01-2008",
     "command":{
                "birthday":"30-01-2008",
                "marriage":"30-01-2008",
                "placeofbirth":"Sydney"
    }} 

     

     

    4. 注册JsonlibJsonWriterConfiguratorTemplates

    如果你想使用JsonlibJsonWriterConfiguratorTemplate,必须要

       1.   JsonlibJsonStringWriter设置"enableJsonConfigSupport"属性。
       2.  
    实现JsonlibJsonWriterConfiguratorTemplate抽象类。
       3.   
    注册JsonlibJsonWriterConfiguratorTemplateJsonWriterConfiguratorTemplateRegistry。

             推荐把JsonlibJsonWriterConfiguratorTemplate注册在initBinder方法中,但前提您应有任意一个可以发送请求的控制器方法。这个方法甚至可以是一个纯控制器接口实现的handleRequest 方法。

     

    4.1 

    Spring 配置文件里设置 "enableJsonConfigSupport"属性

    
    

     

     

    <beans> <bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView"> <property name="jsonWriter"><ref bean="jsonlibJsonWriter"/></property> </bean> <bean name="jsonlibJsonWriter" class="org.springframework.web.servlet.view.json.writer.jsonlib.JsonlibJsonStringWriter"> <property name="enableJsonConfigSupport"><value>true</value></property> </bean> </beans>

     

     

     

    4.2 注册 JsonlibJsonWriterConfiguratorTemplate

     

    initBinder 源文件:
    ==================

    @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception{ JsonWriterConfiguratorTemplateRegistry registry = JsonWriterConfiguratorTemplateRegistry.load(request); registry.registerConfiguratorTemplate( new JsonlibJsonWriterConfiguratorTemplate(){ @Override public JsonConfig getJsonConfig() { JsonConfig config = new JsonConfig(); // Exclude all date properties config.setJsonPropertyFilter( new PropertyFilter(){ public boolean apply( Object source, String name, Object value ) { if( value != null && Date.class.isAssignableFrom( value.getClass() ) ){ return true; } return false; } }); return config; } } ); }

     

    效果:
    =======

    {
     "command":{
                "placeofbirth":"Sydney"
    }} 

     

     

     

        

    
    

     

    
    

     


     

    分享到:
    评论

    相关推荐

      ext + spring Json view + springMVC + Freemaker

      "ext + spring Json view + springMVC + Freemaker"的组合提供了一种强大的解决方案,它整合了多种技术,以实现丰富的用户界面、灵活的数据处理和高效的视图渲染。下面我们将深入探讨这些技术及其相互作用。 1. **...

      springmvc-json-view需要的jar

      2. 配置Spring MVC的视图解析器,例如使用`MappingJackson2JsonView`或`JacksonJsonView`(如果使用Jackson库)来处理JSON视图。 3. 在控制器方法上使用`@RequestMapping`和`@ResponseBody`注解,指定处理HTTP请求并...

      spring mvc json&&jackson jquery js

      Spring MVC还提供了`@JsonView`注解来控制JSON响应中的数据粒度,以及`@JsonProperty`和`@JsonIgnore`来控制哪些字段应包含在JSON中。 **jQuery和JavaScript** jQuery是一个流行的JavaScript库,简化了DOM操作、...

      springmvc加入json支持

      在实际开发中,你可能还需要处理JSON安全问题,例如使用`@JsonView`来限制返回的字段,或者使用`@JsonFormat`来控制日期格式等。同时,随着版本的更新,确保始终使用最新的稳定版本以获取最佳性能和安全性。

      四. Spring MVC 3 支持json及 常见错误解决

      3. **视图解析器**:如果你的返回类型是`ModelAndView`,你可以配置一个`MappingJackson2JsonView`,这样视图会自动将模型数据转换为JSON。 4. **JSON与Ajax**:Spring MVC 3与jQuery或其他JavaScript库配合,可以...

      json在spring中的应用

      8. **自定义JSON视图**:如果需要对JSON的生成进行更精细的控制,可以创建自定义的`JsonView`,并在返回类型上指定该视图。 总之,JSON在Spring中的应用是多方面的,它简化了数据交换,提高了开发效率。无论是简单...

      spring—mvc -json

      在实际开发中,还可以利用Spring Data REST自动创建RESTful服务,或者使用`@JsonInclude`和`@JsonView`等注解控制JSON序列化的细节。通过深入理解和掌握这些知识点,开发者能够更高效地构建和维护JSON接口。

      spring web 4.1处理json

      当JSON绑定失败时,Spring默认会返回一个HTTP 400 Bad Request错误。可以通过自定义异常处理器,如`HandlerExceptionResolver`,来优雅地处理这些错误,提供详细的错误信息。 总之,Spring Web 4.1处理JSON的能力...

      springMVC+ajax+json

      Spring MVC、Ajax 和 JSON 是现代Web开发中的关键技术,它们共同构建了高效、动态的用户界面。下面将详细解释这三个技术及其在实际应用中的结合。 **Spring MVC** Spring MVC 是 Spring 框架的一部分,用于构建基于...

      Spring MVC参数自动绑定List的解决方法

      Spring MVC 参数自动绑定 List 的解决方法 Spring MVC 参数自动绑定 List 的解决方法是一个常见的问题,在实际项目中,我们经常需要传入一组对象,而不是单个...* Spring MVC 中的高级特性,例如 @JsonView 注解的使用

      springmvc + jquery + ajax + json 异步传递数据

      SpringMVC是Spring框架的一部分,是一个强大的MVC(Model-View-Controller)架构,用于构建企业级的Web应用。它提供了一个灵活的模型绑定,数据验证,以及异常处理机制,使得开发者可以更专注于业务逻辑,而不是底层...

      Android JSON获取 解析显示 附带Springboot -JSON服务器

      3. 将解析出的数据绑定到UI组件,展示给用户。 4. Springboot作为服务器端,创建RESTful API,返回JSON格式的响应数据。 以上就是Android应用获取、解析和显示JSON数据,以及使用Springboot构建JSON服务器的基本...

      Struts2+spring2.5+EXT+json实例

      Struts2、Spring2.5、EXT和JSON是四个在Web开发中至关重要的技术,它们共同构建了高效、灵活和可扩展的Web应用程序。这里,我们深入探讨这四个技术及其在实际项目中的应用。 首先,Struts2是一个基于MVC(Model-...

      springmvc+mybatis+jquery easyui+json+log4j

      1. Spring MVC:Spring MVC 是 Spring 框架的一个模块,专门用于构建 MVC(Model-View-Controller)架构的 Web 应用程序。它提供了一个灵活的模型绑定、数据验证、本地化和异常处理机制,使得开发者能够更加专注于...

      java开发常用架包,sturts2,spring,json,druid架包

      标题中的"java开发常用架包,sturts2,spring,json,druid架包"提到了几个在Java开发中非常关键的框架和技术。这里我们将深入探讨这些技术及其在Java Web开发中的应用。 1. **Struts2**:Struts2是基于MVC(Model-...

      spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE

      Spring框架是Java开发中最常用的开源框架之一,它极大地简化了企业级应用的开发工作。Spring Web模块和Spring Web MVC模块是Spring框架中的两个关键组成部分,它们在构建Web应用程序时起着至关重要的作用。 Spring ...

      最全最经典spring-mvc教程

      Spring MVC还支持数据绑定,自动将请求参数绑定到Java对象,这极大地简化了表单提交的处理。对于验证,Spring MVC提供了BindingResult和Validator接口,用于校验模型数据的正确性。 另外,Spring MVC与Spring框架的...

      ajax向springmvc传递json

      总结来说,Ajax向Spring MVC传递JSON涉及的主要步骤包括前端的数据序列化、Ajax请求的发起、服务器端的参数绑定、业务处理及响应的JSON化。理解并熟练掌握这一流程对于进行高效的前后端数据交互至关重要。在实际项目...

      Struts2 Spring2.5 Hiberante3.3.2 +ExtJS(Struts2-json)做的CRUD

      Struts2、Spring2.5、Hibernate3.3.2以及ExtJS是Java Web开发中的四大核心技术,它们共同构建了一个强大的MVC(Model-View-Controller)架构,用于实现高效、灵活的企业级应用。这个DEMO是将这些技术集成在一起,以...

      最新spring官网下载jar包 spring-4.2.4(免费)

      在4.2.4版本中,Spring MVC对RESTful服务的支持得到了加强,通过`@RestController`注解可以轻松创建JSON或XML响应的控制器。此外,模型绑定和数据验证也得到了改进,增强了用户体验。 Spring AOP(面向切面编程)是...

    Global site tag (gtag.js) - Google Analytics