- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
最新的spring mvc,使用freemarker。
希望有人能告诉我在使用 spring mvc 验证表单方面我有哪些选择,以及推荐的方法是什么。
我有一个不直接映射到模型的表单,它有输入字段,在发布时将用于初始化 2 个模型对象,然后我需要验证这些对象,如果它们通过,我将保存它们。
如果他们失败了,我想返回到表单,用用户输入的内容预填充值并显示错误消息。
我在这里和那里阅读了大约 2 种方法,其中一种我已经完成并了解它是如何工作的:
@RequestMapping(...., method = RequestMethod.POST)
public ModelAndView myMethod(@Valid MyModel, BindingResult bindingResult) {
ModelAndView mav = new ModelAndView("some/view");
mav.addObject("mymodel", myModel);
if(bindingResult.hasErrors()) {
return mav;
}
}
现在,如果我的表单直接映射到表单,这就有效了,但在我的情况下,我有:
不映射到任何特定模型的表单字段,它们具有来自 2 个模型的一些属性。
在验证发生之前,我需要手动创建 2 个模型,设置表单中的值,并手动设置一些属性:
在两个模型(模型 1、模型 2)上调用验证,并将这些错误消息附加到错误集合中,如果事情不起作用,我需要将其传回同一 View 页面。
<提交表单时,我必须执行一些数据库调用,并且根据这些结果可能需要向错误集合中添加其他消息。
谁能告诉我如何进行这种验证?
伪代码如下:
Model1 model1 = new Model1();
Model2 model2 = new Model2();
// manually or somehow automatically set the posted form values to model1 and model2.
// set some fields manually, not from posted form
model1.setProperty10(GlobalSettings.getDefaultProperty10());
model2.setProperty11(GlobalSettings.getDefaultProperty11());
// db calls, if they fail, add to errors collection
if(bindingResult.hasErrors()) {
return mav;
}
// validation passed, save
Model1Service.save(model1);
Model2Service.save(model2);
redirect to another view
更新
我现在已经在我的模型上使用了 JSR 303 注释,如果我仍然可以使用它们就好了。
更新二
请阅读下面的赏金说明,了解我正在寻找的内容的摘要。
最佳答案
基于类似的经验,我会提出以下建议,同时我对您要采用的方法的最后一步发表评论。我使用您的步骤编号列表。
Step 1: Form Bean
有两种方法。简单的方法是定义一个表单 bean(我假设您已经完成):
class MyModel {
private Model1 model1;
private Model2 model2;
// standard Java bean stuff
}
更精确的方法是实际定义 MyModel
这样我只从 Model1
借用需要的字段和 Model2
但我不确定这是否适合您。
Step 2: Data Binding
如果你有这样的 form
,Spring 会为你做这件事您认为的结构:
<form:form modelAttribute="myModel">
<form:input path="model1.somePropertyToBeSet" />
</form:form>
Step 3: Validation
使用 Spring custom validations ,您可以定义自定义约束:
@interface Model1Constraint {}
@interface Model2Constraint {}
class MyModel1 {
@Model1Constraint
private Model1 model1;
@Model2Constraint
private Model2 model2;
// ...
}
然后为自定义约束注册您的自定义 validator :
class Model1ConstraintValidator implements ConstraintValidator<Model1Constraint, Model1> {
// implementation of isValid and initalize
}
对于Model2Constraint
也是如此.使用自定义 validator ,您可以检查在 MyModel
之前需要确保哪些逻辑被传递到请求处理方法。我还假设您使用过 <mvc:annotation-driven />
让 Spring 注册 validator ;否则,您应该配置它们。
Step 4: Custom model processing before request processing
您最初的想法是为这项工作使用一些数据绑定(bind)器。在您的描述中,您还提到此数据处理不依赖于来自表单数据的数据。
关于设计和模块化,我认为数据绑定(bind)器不是实现此目的的好地方。其次,由于对表单没有数据依赖性,您的主要原因是允许数据绑定(bind)错误处理。
所以,我的建议是假设现在您在 public ModelAndView myMethod(@Valid MyModel model, BindingResult bindingResult)
.据推测,您可以在这里访问其他服务 bean。所以,你可以在一些服务 bean 中有一个方法可以 refine
或 prepare
(只是名字)model
你已经填充了这一点。基于异常(exception)或任何其他适合您的机制,您可以使用 bindingResult
再次返回错误。
作为另一个建议,您也可以利用 Spring interceptors如果你想要更多的 DI/IoC 方式来做到这一点。但是这样,你应该提取MyModel
来自 ModelAndView
在拦截和继续。
希望对您有所帮助。
关于java - 对如何验证 spring mvc 表单感到困惑,我有哪些选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015782/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!