java - Spring MVC - 下拉对象选择 - 无主标识符

标签 java spring jsp spring-mvc

一个相当常见的用例发生在有 Java 对象列表的情况下,可以在 Web 表单上从中进行选择 - 通常您会使用对象的主键作为值,以便 Controller 可以执行查找,或者只是将键绑定(bind)到创建/更新的任何对象。

我的问题是要从中选择的列表不是持久的、键控的对象,它们是来自服务的业务模型,无法根据包含的数据来检索它们。下面是一些伪代码,其中给页面提供了 Foo 的列表,我们可以很容易地与 Controller 通信 onSubmit Foo 的名称,但是如果 Foo 的其他字段需要提交呢?

Controller :

referenceData() {
    ...
    List foos = fooService.getFoosForBar( bar )
    return { 'foos', foos }
}

jsp:

<form>
   ...
<spring:bind path="formData.foo">
    <select name="<c:out value="${status.expression}" />">
        <c:forEach items="${foos}" var="foo">
            <option value="<c:out value="${foo.name}"/>">
                <c:out value="${foo.name}"/>
            </option>
        </c:forEach>
    </select>
</spring:bind>
   ...
</form>

一些示例解决方案是使用隐藏字段来提交 Foo 的其他属性,并在选择更改时使它们保持同步,但我不喜欢在这种可能会增加困惑的情况下使用 JavaScript。当然还有其他方法可以做到这一点。

我的问题是是否存在任何标准做法来实现这一点?还是我应该想出自己的方法?如果可能的话,我宁愿不重新发明轮子,这似乎很常见,以至于仅仅依靠它可能不是最好的方法。

最佳答案

根据您的限制,您必须将 foos 的其他数据成员编码为选项的值。
<option label="${foo.name}" value="${foo.encodedValues}"/>
encodedValues方法可能看起来像这样:


    private String SEPARATOR = ",";

    public String getEncodedValues()
    {
        final StringBuffer returnValue = new StringBuffer();

        returnValue.append(field1);
        returnValue.append(SEPARATOR);
        returnValue.append(field2);
        returnValue.append(SEPARATOR);
        returnValue.append(field3);

        return returnValue.toString();
    }

如果您有许多选择需要编码值,您可能需要创建一个类来对这些值进行编码和解码以集中代码。

关于java - Spring MVC - 下拉对象选择 - 无主标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4155381/

相关文章:

java - Java RMI 是基于哪种技术实现的?

java - 来自数据库和内存中的 NotesDocument 对象之间的区别?

java - Spring 启动 2x。休息 API。将失败的字符串转换为日期

java - jboss的Maven + Spring架构

javascript - 按键事件的奇怪行为如果 "return false;"丢失,页面会重新加载,否则它不会让我键入任何字符

jquery - 更改文本框的颜色

java - 通过传递变量使 <a href> 标签可下载?

java.net.SocketException : Connection Reset

java - GAE 应用程序在本地运行,但上传到谷歌服务器时无法运行

java - 将 Spring Security 移至 Java Config,authentication-success-handler-ref 去哪儿了?