gpt4 book ai didi

java - 对如何验证 spring mvc 表单感到困惑,我有哪些选择?

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:38 25 4
gpt4 key购买 nike

最新的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;
}

}

现在,如果我的表单直接映射到表单,这就有效了,但在我的情况下,我有:

  1. 不映射到任何特定模型的表单字段,它们具有来自 2 个模型的一些属性。

  2. 在验证发生之前,我需要手动创建 2 个模型,设置表单中的值,并手动设置一些属性:

  3. 在两个模型(模型 1、模型 2)上调用验证,并将这些错误消息附加到错误集合中,如果事情不起作用,我需要将其传回同一 View 页面。

    <
  4. 提交表单时,我必须执行一些数据库调用,并且根据这些结果可能需要向错误集合中添加其他消息。

谁能告诉我如何进行这种验证?

伪代码如下:

   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 中有一个方法可以 refineprepare (只是名字)model你已经填充了这一点。基于异常(exception)或任何其他适合您的机制,您可以使用 bindingResult再次返回错误。

作为另一个建议,您也可以利用 Spring interceptors如果你想要更多的 DI/IoC 方式来做到这一点。但是这样,你应该提取MyModel来自 ModelAndView在拦截和继续。

希望对您有所帮助。

关于java - 对如何验证 spring mvc 表单感到困惑,我有哪些选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10015782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com