【问题标题】:DataBinding for an arbitrary Model object in SpringSpring中任意模型对象的数据绑定
【发布时间】:2015-02-26 10:08:25
【问题描述】:

我有一个包含状态代码列表的枚举(例如Status),我想在页面上显示这些状态的有意义的字符串(将Status 绑定到一个字符串)。

我还有 Project 对象,它具有 Status 引用,并且当Project 是表单上的命令对象时,我成功地使用 CustomPropertyEditorStatus 绑定到 String

但是当我想在页面上显示不属于任何形式的Projects 列表时,如何将Status 绑定到有意义的String

下面的代码在显示Status对象时总是使用默认的枚举字符串:

<c:forEach items="${projects}" var="project" varStatus="row">
    <tr>
        <td><c:out value="${project.status}" />
    </tr>
</c:forEach>

【问题讨论】:

    标签: java spring data-binding


    【解决方案1】:

    我这样做的方式是使用spring的MessageSource

    <c:forEach items="${projects}" var="project" varStatus="row">
        <tr>
            <td><spring:message code="status.code.${project.status}" />
        </tr>
    </c:forEach>
    

    那么你需要在messages_en.properties(或其他语言文件)中有对应的键:

    status.code.Foo=The status is foo
    status.code.Bar=The status is bar
    

    你的枚举中的 Foo 和 Bar 蜜蜂。

    【讨论】:

    • 这绝对是我会做的。对我来说,枚举是应用程序域模型的一部分,因此绝不能与特定于 UI 的方面(例如语言环境感知)相关联。您已经演示了从枚举值获取特定于语言环境的表示的正确方法。这样,不同的应用程序关注点被分开,使应用程序更易于管理和维护。
    【解决方案2】:

    假设您已将Status 声明为public enum Status&lt;c:out value="${project.status}" /&gt; 将调用Status.toString()。进一步假设您没有覆盖 Status 枚举中的方法 toString,则使用来自 java.lang.Enum.toString() 的默认实现(java.lang.Enum 是所有枚举的基类)。 java.lang.Enum.toString() 只是返回 Enum.name

    您可以在Status 枚举中覆盖toString() 方法,返回一个对用户更有意义的值,或者您可以在表示层中调用枚举类的任何方法。例如,如果您有方法Status.getTitle(),则可以将其用作&lt;c:out value="${project.status.title}" /&gt;

    【讨论】:

    • 实际上我想支持多语言,所以如果我按照你的方式做,我必须更改域对象(例如实现MessageSourceAware),这是我不喜欢的。为什么我们不能在这种情况下重用CustomPropertyEditor
    • 顺便说一句,我在控制器方法中的Model 中添加了项目列表,但在@InitBinder 方法中我在WebRequest 中找不到它们?据我所知,所有模型属性都将嵌入网络请求中?如果我错了,请纠正
    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2013-06-13
    • 2013-02-14
    相关资源
    最近更新 更多