深入解析@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注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot中读取jar包中的resources目录下的文件的三种方式

    SpringBoot中读取jar包中的resources目录下的文件的三种方式

    这篇文章给大家总结了SpringBoot读取 jar 包中的 resources 目录下的文件的三种方式,文中有详细的代码示例供大家参考,,需要的朋友可以参考下
    2023-06-06
  • spring boot项目application.properties文件存放及使用介绍

    spring boot项目application.properties文件存放及使用介绍

    这篇文章主要介绍了spring boot项目application.properties文件存放及使用介绍,我们的application.properties文件中会有很多敏感信息,大家在使用过程中要多加小心
    2021-06-06
  • Spring boot配置文件加解密详解

    Spring boot配置文件加解密详解

    这篇文章主要给大家介绍了关于Spring boot配置文件加解密的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • List集合中对数据实现多重规则进行排序的案例

    List集合中对数据实现多重规则进行排序的案例

    今天小编就为大家分享一篇关于List集合中对数据实现多重规则进行排序的案例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Java中的枚举enum详细解读

    Java中的枚举enum详细解读

    这篇文章主要介绍了Java中的枚举enum详细解读,当我们使用enum关键字开发一个枚举类时,默认会继承Enum类,而且是一个final类,当有多个枚举对象时,使用逗号 ,隔开,最后一个用分号;结尾,需要的朋友可以参考下
    2024-01-01
  • 基于Java实现一个复杂关系表达式过滤器

    基于Java实现一个复杂关系表达式过滤器

    这篇文章主要为大家详细介绍了如何基于Java实现一个复杂关系表达式过滤器。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-07-07
  • java实现服务器巡查的代码

    java实现服务器巡查的代码

    接到上级领导任务,需要实现一个这样的需求,一大批服务器,需要检查服务器能否ping通,ssh密码是否正常,以及检查服务器的cpu,内存,硬盘占用情况,下面通过java代码实现服务器巡查功能,需要的朋友一起看看吧
    2021-12-12
  • Java中的List接口实现类解析

    Java中的List接口实现类解析

    这篇文章主要介绍了Java中的List接口实现类解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 使用Java实现通用树形结构构建工具类

    使用Java实现通用树形结构构建工具类

    这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Kryo序列化及反序列化用法示例

    Kryo序列化及反序列化用法示例

    这篇文章主要介绍了Kryo序列化及反序列化用法示例,小编觉得挺不错的,这里分享给大家,需要的朋友可以参考下。
    2017-10-10

最新评论