我比Spring更新,之前我曾在PHP和Python工作过。我有一些问题需要了解Spring表单的工作方式和验证方式。到目前为止,我的理解是,当您使用时,您的表单由bean支持,这意味着您必须向JSP提供bean。您也可以使用标准HTML表单,但是您必须在控制器中手动检索请求参数。
这是我遇到的问题。我有一个使用Hibernate Validator的User bean,我为用户添加,编辑页面。问题是我不希望密码字段显示在编辑页面上,密码将无论如何都是垃圾,因为它使用BCrypt。但是,提交表单时验证失败,因为它希望密码存在。似乎无论如何使用Spring Form进行部分bean实现。
我想尽可能使用Spring Form,因为它减少了重复的验证代码,并且它总是很适合处理对象。我现在的想法是创建一个中间对象,然后将数据从那里转换为我的bean。看似单调乏味,可以导致创建许多对象的方式。我的另一个想法是只使用普通的旧HTML表单并自己拉取params并在对象中设置值。
我不确定什么是最好的方法,或者我是否想在正确的轨道上思考。 Spring Forms和验证提供似乎很好,但似乎它不是特别灵活。就像我说的那样,我是Spring的新手,所以我可能只是缺少一些东西或者没有理解。
我一直在努力解决的另一个问题是表单上需要多个对象。假设我有一个User bean,它具有以下属性。
私人角色; 私人国家;
所以我需要将User,List和List传递给我的JSP。我可以让它们显示正常,但是如果表单验证在返回到该页面时失败,我将丢失我的角色和国家/地区对象,除非在返回视图名称之前将它们重新添加到模型中。我在这里遗漏了什么或是那种常态。它是一个请求对象,所以我想这是有道理的,但每次都必须重新添加它们似乎很乏味。
答案 0 :(得分:1)
到目前为止,我的理解是当你使用你的表格时 由bean支持,这意味着您必须向JSP提供bean。
我说大多数都是真的。该表单由bean支持,但Spring JSTL标记知道如何基于set modelAttribute获取bean。除非您将模型属性设置为在会话中,否则bean将生活在您认为的“页面”范围内。无论哪种方式,如果您使用的是Spring JSTL标签,它们都会去一个或另一个地方来获取它。
您也可以使用展台HTML表单,但必须手动完成 检索控制器中的请求参数。
不正确。您可以“模拟”Spring JSTL标记正在执行的操作。了解JSTL标记与宏非常相似。它们只是将一些预先确定的代码块复制到输出中,并带有一些非常基本的条件语句。 Spring MVC需要在Controller端连接Model属性的关键位是name
和value
,它们很容易解释这些生成/连接的方式。
然而,当提交表单时,验证失败,因为它期望 要出现的密码。
您可以创建“DTO”或“数据传输对象”,它基本上是从UI获取值并在Controller / Service层中转换为后端上的真实Model对象的中间人。或者,如果你像我一样懒惰,请将User放入会话范围,在这种情况下,您不必发布值,因为Spring将会退出会话并更新您发布的一个或两个字段。不要发布密码,Spring不会设置密码。
我现在的想法是创建一个中间对象然后 将数据从该数据转换为我的bean。
是的,这是我提到的DTO。您只需要在需要的地方进行操作。
我不确定什么是最好的方法,或者我是否考虑过 正确的轨道。
在编码中可能有数千种方法可以做任何事情,有些方法比其他方式更正确或更错误。我知道一些设计纳粹的开发人员会说你应该总是这样或那样做,但我不是那些人之一。我认为只要你保持一致,并且你没有完全斩首,你就走在了正确的轨道上。我写的所有代码的第一个问题是可维护性。我
我一直在努力解决的另一个问题是拥有多个对象 在表格上需要。
有几种方法可以解决这个问题。我从来没有使用它,但你实际上可以有多个与同一表单和Controller处理程序相关联的模型属性。我认为你使用<spring:bind>
标签或其他东西。我看过周围的样品,所以如果你认为你需要它就谷歌吧。
我的方法通常是在会话中放置一些东西或者建立一个DTO来保存我需要的所有东西。第一个我使用更多的东西,如列表来驱动构建视图,例如,如果我有一个来自一个表的国家下拉。我会有一份列入会议的国家名单,只是从那里使用它们,这样我只会一次又一次地完成它们。
我使用DTO方法(有些人可能称之为Form Bean)当我有一堆复杂的东西我需要一次性改变时,但事情并不一定是直接连接的。只是要指出:您可以在模型属性中使用嵌套对象,并在Spring JSTL标记中使用它们。你也可以在你的模型属性中有集合(列表,集合,映射),也可以使用它们,尽管Spring不能很好地处理嵌套集合。
希望有所帮助。