Spring Forms和验证的问题

时间:2014-03-28 19:53:31

标签: spring validation spring-mvc spring-form

我比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。我可以让它们显示正常,但是如果表单验证在返回到该页面时失败,我将丢失我的角色和国家/地区对象,除非在返回视图名称之前将它们重新添加到模型中。我在这里遗漏了什么或是那种常态。它是一个请求对象,所以我想这是有道理的,但每次都必须重新添加它们似乎很乏味。

1 个答案:

答案 0 :(得分:1)

  

到目前为止,我的理解是当你使用你的表格时   由bean支持,这意味着您必须向JSP提供bean。

我说大多数都是真的。该表单由bean支持,但Spring JSTL标记知道如何基于set modelAttribute获取bean。除非您将模型属性设置为在会话中,否则bean将生活在您认为的“页面”范围内。无论哪种方式,如果您使用的是Spring JSTL标签,它们都会去一个或另一个地方来获取它。

  

您也可以使用展台HTML表单,但必须手动完成   检索控制器中的请求参数。

不正确。您可以“模拟”Spring JSTL标记正在执行的操作。了解JSTL标记与宏非常相似。它们只是将一些预先确定的代码块复制到输出中,并带有一些非常基本的条件语句。 Spring MVC需要在Controller端连接Model属性的关键位是namevalue,它们很容易解释这些生成/连接的方式。

  

然而,当提交表单时,验证失败,因为它期望   要出现的密码。

您可以创建“DTO”或“数据传输对象”,它基本上是从UI获取值并在Controller / Service层中转换为后端上的真实Model对象的中间人。或者,如果你像我一样懒惰,请将User放入会话范围,在这种情况下,您不必发布值,因为Spring将会退出会话并更新您发布的一个或两个字段。不要发布密码,Spring不会设置密码。

  

我现在的想法是创建一个中间对象然后   将数据从该数据转换为我的bean。

是的,这是我提到的DTO。您只需要在需要的地方进行操作。

  

我不确定什么是最好的方法,或者我是否考虑过   正确的轨道。

在编码中可能有数千种方法可以做任何事情,有些方法比其他方式更正确或更错误。我知道一些设计纳粹的开发人员会说你应该总是这样或那样做,但我不是那些人之一。我认为只要你保持一致,并且你没有完全斩首,你就走在了正确的轨道上。我写的所有代码的第一个问题是可维护性。我

  1. 不想花20小时试图重新学习我6mo前做过的事情,所以我倾向于选择更简单的选项
  2. 讨厌重复代码,所以我倾向于选择更多的模块设计
  3. 仇恨不得不花费20个小时试图重新学习我6mo前所做的事情,所以倾向于大量使用JavaDoc和评论,我发现代码很棘手(很多循环,做一些奇怪的事情等)
  4.   

    我一直在努力解决的另一个问题是拥有多个对象   在表格上需要。

    有几种方法可以解决这个问题。我从来没有使用它,但你实际上可以有多个与同一表单和Controller处理程序相关联的模型属性。我认为你使用<spring:bind>标签或其他东西。我看过周围的样品,所以如果你认为你需要它就谷歌吧。

    我的方法通常是在会话中放置一些东西或者建立一个DTO来保存我需要的所有东西。第一个我使用更多的东西,如列表来驱动构建视图,例如,如果我有一个来自一个表的国家下拉。我会有一份列入会议的国家名单,只是从那里使用它们,这样我只会一次又一次地完成它们。

    我使用DTO方法(有些人可能称之为Form Bean)当我有一堆复杂的东西我需要一次性改变时,但事情并不一定是直接连接的。只是要指出:您可以在模型属性中使用嵌套对象,并在Spring JSTL标记中使用它们。你也可以在你的模型属性中有集合(列表,集合,映射),也可以使用它们,尽管Spring不能很好地处理嵌套集合。

    希望有所帮助。