春季展示格式与编辑格式

时间:2018-10-01 16:41:32

标签: java spring-mvc jsp formatting

背景

我有一个小型的Spring MVC Web项目(使用标准的JSP作为视图引擎),我决定,如果布尔值可以显示为“是”或“否”,那就太好了-我认为这看起来更友好而不是“ true”和“ false”。因此,我创建了一个自定义BooleanFormatter来为我执行此操作。到目前为止,一切都很好。

但是,当将布尔字段呈现为复选框时,Spring会执行以下操作来确定是否应选中该复选框:

  1. 将布尔值转换为“是”或“否”。
  2. 检查对此应用Boolean.valueOf的结果。

当然,Boolean.valueOf("yes")false,因此复选框永远不会显示为选中状态。

这是个问题。

我的问题

是否有一种方法可以告诉Spring在显示值时(而不是在呈现(或解析其值时))编辑器时仅使用格式化程序??

(我正在寻找类似于ASP.NET MVC的DisplayTemplate vs EditorTemplate或DisplayFormat.ApplyFormatInEditMode的东西)

或者,我是完全按照错误的方式来做这件事吗?

1 个答案:

答案 0 :(得分:0)

我研究了AbstractPropertyBindingResult的代码,以了解对Spring checkbox JSP Tag is broken when using Converter for type Boolean的答案为何起作用。这是呈现复选框/其他输入时使用的代码:

protected Object formatFieldValue(String field, @Nullable Object value) {
    String fixedField = fixedField(field);
    // Try custom editor...
    PropertyEditor customEditor = getCustomEditor(fixedField);
    if (customEditor != null) {
        customEditor.setValue(value);
        String textValue = customEditor.getAsText();
        // If the PropertyEditor returned null, there is no appropriate
        // text representation for this value: only use it if non-null.
        if (textValue != null) {
            return textValue;
        }
    }
    if (this.conversionService != null) {
        // Try custom converter...
        TypeDescriptor fieldDesc = getPropertyAccessor().getPropertyTypeDescriptor(fixedField);
        TypeDescriptor strDesc = TypeDescriptor.valueOf(String.class);
        if (fieldDesc != null && this.conversionService.canConvert(fieldDesc, strDesc)) {
            return this.conversionService.convert(value, fieldDesc, strDesc);
        }
    }
    return value;
}

在数据绑定期间,遵循类似的过程

  1. 尝试找到一个PropertyEditor
  2. 尝试查找Converter / Formatter

因此:

  • 要仅指定编辑者格式,请使用PropertyEditor
  • 要指定仅用于显示的格式,请使用FormatterConverter,但也可以使用PropertyEditor来执行默认行为。