深入解析@InitBinder注解的功能与应用

 更新时间:2023年10月10日 09:43:56   作者:LY破晓  
这篇文章主要介绍了深入解析@InitBinder注解的功能与应用,从字面意思可以看出这个的作用是给Binder做初始化的,被此注解的方法可以对WebDataBinder初始化,webDataBinder是用于表单到方法的数据绑定的,需要的朋友可以参考下

一、注解作用

从字面意思可以看出这个的作用是给Binder做初始化的,被此注解的方法可以对WebDataBinder初始化。webDataBinder是用于表单到方法的数据绑定的! @InitBinder只在@Controller中注解方法来为这个控制器注册一个绑定器初始化方法,方法只对本控制器有效。

二、代码演示

1.对数据绑定进行设置

WebDataBinder中有很多方法可以对数据绑定进行具体的设置:比如我们设置name属性为非绑定属性(也可以设置绑定值setAllowedFields):

在Controller中添加一个方法:

     @InitBinder
        public void initBinder(WebDataBinder binder) {
            binder.setDisallowedFields("name");
        }

然后运行:

在这里插入图片描述

添加:

在这里插入图片描述

看后面那个name值就没有绑定成功!

(具体作用视频举了个例子来阐述其某个作用:比如表单中有多选按钮,对应的是JaveBean中的一个集合属性,然而选择的是id,而集合保存的确实类,这里我们就不能任SpringMVC自动绑定,需要我们手动绑定,所以就关闭其的自动绑定,不然会报错!)

2.注册已有的编辑器

WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再set进去!Spring自己提供了大量的实现类(如下图所示的在org.springframwork.beans.propertyEditors下的所有editor),诸如CustomDateEditor ,CustomBooleanEditor,CustomNumberEditor等许多,基本上够用。 在平时使用SpringMVC时,会碰到javabean中有Date类型参数,表单中传来代表日期的字符串转化为日期类型,SpringMVC默认不支持这种类型的转换。我们就需要手动设置时间格式并在webDateBinder上注册这个编辑器!

在这里插入图片描述

实现代码

现在在student类中加上一个类型为Date的birth属性、setter和getter,新增带有birth所有属性的构造函数。(代码略)

list.jsp(所有学生信息页面)加一列显示生日的:${stu.birth}

input.jsp(添加信息界面):

    <br>
    birth(format=yyyy-mm-dd):<form:input path="birth"/>
    <br>

然后再控制器中该掉之前的@InitBinder代码:

        @InitBinder
        public void initBinder(WebDataBinder binder) {
            //binder.setDisallowedFields("name");
            CustomDateEditor editor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true);
            binder.registerCustomEditor(Date.class, editor);
        }
        //编辑器构造函数
        public CustomDateEditor(DateFormat dateFormat, boolean allowEmpty) 
    //注册编辑器函数
    public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor)

然后运行

在这里插入图片描述

添加成功

3.注册自定义编辑器

使用自定义编辑器就是在第二个的基础上添加个自定义编辑器就行了,自定义的编辑器类需要继承

  • org.springframework.beans.propertyeditors.PropertiesEditor;

并重写其setAsText和getAsText两个方法就行了!

比如下面这个DoubleEditor:

    public class DoubleEditor extends PropertyEditorSupport {
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            if (text == null || text.equals("")) {
                text = "0";
            }
            setValue(Double.parseDouble(text));
        }
        @Override
        public String getAsText() {
            return getValue().toString();
        }
    }

然后在InitBinder方法中注册就行。

4.设置属性的前缀可以实现参数绑定

代码所示:

jsp:
    <form action="/testBean" method="post">
        name: <input type="text" name="u.name"> <br>
        age: <input type="text" name="u.age"> <br>
        name: <input type="text" name="s.name"> <br>
        age: <input type="text" name="s.age"> <br>
        <input type="submit">
    </form>

controller:

      @InitBinder("user")
        public void init1(WebDataBinder binder) {
            binder.setFieldDefaultPrefix("u.");
        }
        @InitBinder("stu")
        public void init2(WebDataBinder binder) {
            binder.setFieldDefaultPrefix("s.");
        }
        @RequestMapping("/testBean")
        public ModelAndView testBean(User user, @ModelAttribute("stu") Student stu) {
            System.out.println(stu);
            System.out.println(user);
            String viewName = "success";
            ModelAndView modelAndView = new ModelAndView(viewName);
            modelAndView.addObject("user", user);
            modelAndView.addObject("student", stu);
            return modelAndView;
        }

@InitBinder(“user”)括号内的参数为类的首字母小写(默认命名规则),也可以用@ModelAttribute(“stu”)做限定.

到此这篇关于深入解析@InitBinder注解的功能与应用的文章就介绍到这了,更多相关@InitBinder注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中Console对象实例代码

    Java中Console对象实例代码

    这篇文章主要介绍了Java中Console对象实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Spring init-method与destroy-method属性的用法解析

    Spring init-method与destroy-method属性的用法解析

    这篇文章主要介绍了Spring init-method与destroy-method属性的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 深入了解JAVA数据类型与运算符

    深入了解JAVA数据类型与运算符

    这篇文章主要介绍了Java基本数据类型和运算符,结合实例形式详细分析了java基本数据类型、数据类型转换、算术运算符、逻辑运算符等相关原理与操作技巧,需要的朋友可以参考下
    2021-07-07
  • Ehcache简介_动力节点Java学院整理

    Ehcache简介_动力节点Java学院整理

    这篇文章主要介绍了Ehcache简介,使用Spring的AOP进行整合,可以灵活的对方法的返回结果对象进行缓存
    2017-07-07
  • 连续调用多个外部系统写接口保证数据一致性的思路

    连续调用多个外部系统写接口保证数据一致性的思路

    今天小编就为大家分享一篇关于连续调用多个外部系统写接口保证数据一致性的思路,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • SpringBoot3解决跨域请求的方案小结

    SpringBoot3解决跨域请求的方案小结

    解决跨域请求,主要有JSONP,iframe,window.name,CORS等方式,其中CORS方式是最常用的跨域实现方式,而且是对各种请求方法、各种数据请求类型都是完美支持的,本文介绍了SpringBoot3解决跨域请求的方案小结,需要的朋友可以参考下
    2024-07-07
  • Java图形用户界面设计(Swing)的介绍

    Java图形用户界面设计(Swing)的介绍

    看到多数人提到 Java 就以为是网络开发,其实不是这样的,Java 也可以开发应用程序,而且可以开发出漂亮的图形用户界面的应用程序,因此,我写下这篇文章,希望能带你进入 Java 图形用户界面设计之门。
    2016-07-07
  • Java多线程使用阻塞队列实现生产者消费者模型详解

    Java多线程使用阻塞队列实现生产者消费者模型详解

    这篇文章主要介绍了Java多线程使用阻塞队列实现生产者消费者模型详解,主要讲解阻塞队列的特性、实际开发中常用的到的生产者消费者模型,以及生产者消费者模型解耦合、削峰填谷的好处,需要的朋友可以参考下
    2023-07-07
  • Springboot如何设置静态资源缓存一年

    Springboot如何设置静态资源缓存一年

    这篇文章主要介绍了Springboot如何设置静态资源缓存一年,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法

    导入项目出现Java多个工程相互引用异常A cycle was detected in the build path o

    今天小编就为大家分享一篇关于导入项目出现Java多个工程相互引用异常A cycle was detected in the build path of project的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12

最新评论