我正在使用带有Spring MVC和Hibernate的Web Flow 2.0.7。
我的问题是我的转换器中的自定义类型和数据库连接的自定义转换器。
假设我有一个 Person 类型,而 Person 有一个我的自定义类型 Title 的字段,以及所有标题< / em>已经在我的数据库中。现在我有一个html表单,用户可以在其中填充 Person 实例,包括在选择下拉框中选择 Title 。
在流程定义中,我从数据库中获取所有标题,并使用自定义转换器在下拉框中显示它们,将标题转换为 String 以及后来回到 Title 。
我的问题是关于从 String (这是我在元素上设置为值的数据库ID)转换回正确的 Title 对象的过程我的数据库。基本上:怎么做?
到目前为止,我无法将一个titleManager注入到我的转换器中以访问数据库。这个方案在Spring Web Flow Forum中得到了评论。另一种解决方案可能是在呈现视图之前缓存标题,并在表单发布后以某种方式获取内存中的标题。
我真的很感激,如果有人能够启发我,如何处理这种数据绑定。到目前为止,我无法使其工作,因此,我从其他令人敬畏的网络流程中获得最少的使用。
我已经发布了a thread on the Web Flow Board,但仍然缺少一个我自己无法找到的最佳实践。
非常感谢你!
钨
答案 0 :(得分:1)
我习惯这样做。 基本上我加载标题列表并将其放在我的表单模型中。在表单模型中,我还有一个currentTitleId或selectedTitleId变量来存储所选项的值。该字段名称在spring组合框的“path”中设置,titleList在“items”中设置。然后,要绑定的值在“itemValue”中设置,并在“itemLabel”中为该值显示该文本。就是这样。
在我的表单模型中:
private int currentTitleId;
public long getCurrentTitleId() { return this.currentTitleId; }
public void setCurrentTitleId(long currentTitleId) { this.currentTitleId = currentTitleId; }
List titleList = getTitlesFromMyDatabaseHereOrSomewhereElse();
在我的jsp中:
<form:label path="currentTitleId">Title</form:label>
<form:select path="currentTitleId" items="${formModel.titleList}" itemLabel="titleDescription" itemValue="titleId" />
我假设您的Title类将是这样的:
class Title {
public long getTitleId() { return this.titleId; }
public long getTitleDescription() { return this.titleDescription; }
}
您还可以更加自定义组合框:
<form:select path="currentPhoneNumberId">
<form:option value="">-</form:option>
<c:forEach items="${formModel.phoneList}" var="phone">
<form:option value="${phone.phoneNumberId}">${phone.phoneNumberId} - ${phone.description}</form:option>
</c:forEach>
</form:select>
答案 1 :(得分:0)
我不太确定Spring Web Flow,但是使用普通的Spring MVC就可以注册一个新的PropertyEditor,然后这个东西会自动运行
http://static.springframework.org/spring/docs/2.5.x/reference/mvc.html#mvc-ann-webdatabinder
所以我会创建一个新的PropertyEditor来获取一个服务或dao,它负责从数据库中获取数据,在PropertyEditor中你可以将id转换为你的key类型并从数据库中获取值并返回它。我只是没有一个正确的例子,但我希望你能得到主旨。