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

我的问题是,要选择的列表不是持久的,键对象,它们是来自服务的业务模型,没有基于包含的数据来检索它们的合理方法。以下是一些伪代码,其中在页面上提供了Foo的列表,我们可以轻松地将on提交给 Controller 。SubmitFoo的名称,但是如果还有其他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(); }
如果有许多需要具有编码值的选择,则可能要创建一个类,对这些值进行编码和解码以集中代码。

10-04 17:03