【问题标题】:Best ways of performing server side validations on data using Java使用 Java 对数据执行服务器端验证的最佳方法
【发布时间】:2012-11-13 15:53:36
【问题描述】:

有人可以指导我解决这个基本问题:使用 Java 对数据执行服务器端验证的最佳方式是什么?

我想知道是否有可用的开源库来执行服务器端验证。

感谢任何帮助。

【问题讨论】:

  • 这取决于您要验证的内容。您要验证数据格式是否正确、发件人是否有效或您想要什么?
  • 最好使用 DWR 进行任何框架的任何服务器端验证。 write once reuse any where 概念可以使用 DWR 在验证中实现。

标签: java validation server-side


【解决方案1】:

这取决于您使用的 Web 开发框架。


原始 JSP Servlet

如果您使用的是简单的 jsp servlet,那么我建议为每个表单/jsp 屏幕添加一个验证器包/jar。并在传递给服务之前从控制器验证它。


JSF

如果您使用的是 JSF,那么提供了精心设计的验证阶段,您可以使用现成的验证器(您可以在表单字段上添加注释并完成),或者您也可以创建自己的验证器。


Spring MVC

如果你使用的是 Spring MVC,它也有一个saperate layer for validation


支柱

Struts 也有saperate layer for validation

【讨论】:

  • 我正在使用原始 JSP。我想我会使用第一个建议。感谢您的回复
  • @Jigar:除了一个验证器,还有其他替代方案吗?我将所有(调查)表单属性(如 question1 question2 等)存储在一个集合对象中。我也使用同一个集合对象来生成 XML。因此,如果我可以使用接受集合对象而不是 Beans 的东西会很好。
【解决方案2】:

如果您想验证 POJO,可以查看 Oval 框架 http://oval.sourceforge.net/

如果您的应用是基于 pojos 或 beans 设计的,JSR-303(及其实现)也可能会有所帮助

以下是 OVal 中的示例自定义验证: 假设您必须验证 SomeValueClass 中的变量映射并确保键“greeting”的值始终存在。

public class SomeValueClass {

@FormCollection
Map variables;


public static void main(String[] args) {
    SomeValueClass svc1 = new SomeValueClass();
    svc1.variables = new HashMap();
    svc1.variables.put("greeting", "");

    Validator validator = new Validator();
    List<ConstraintViolation> violations = validator.validate(svc1);
    System.out.println("svc1 violations.size() = " + violations.size());
}

“映射变量”上的@FormCollection 注释;是一个自定义验证器,如下所示:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@net.sf.oval.configuration.annotation.Constraint(checkWith = FormCollectionCheck.class)
public @interface FormCollection {
  String message() default "Some errors in the form";
}

约束检查类将如下所示:

public class FormCollectionCheck extends AbstractAnnotationCheck<FormCollection> {
  public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context, Validator validator) {
    Map vars = (Map) valueToValidate;
    return !(vars.get("greeting")==null || ((String)vars.get("greeting")).length()<=0);
  }
}

希望对您有所帮助, 干杯

【讨论】:

  • @aldrin :这是否意味着我可以验证集合对象?例如,我将 Web 表单的属性存储在集合对象中。关键是提出的问题,价值是用户的反应。我正在使用这个集合对象,以便生成 XML。如果这个框架可以验证集合对象中的值,那就太好了。我确实看过你的链接,但不相信。你能给我举几个例子吗?
  • @Khushroo 您将需要使用自定义验证器。我已经用一个可能对你有帮助的例子更新了我的答案。
  • @aldrin:感谢您的及时帮助。我很感激。不幸的是我不是会员,所以我不能增加计数器。再次感谢您。
  • @aldrin:快速提问 aldrin:在 isSatisfied() 中,目前您只检查 Map 中的一个值,因此这种方法看起来非常简洁。但是,如果您要检查十个值,则需要非常广泛地使用 if...else 条件,我不是很喜欢。有什么解决方法吗?再次感谢。
  • @Khushroo 如果您必须检查地图中的所有值,那么您必须遍历它。那里没有太多选择。如果对所有项目都进行相同的检查,则可以使用循环。
【解决方案3】:

然后您选择提供内置验证的框架,例如 struts 等。这些将为您提供验证组件。它也是一个开源项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 2018-03-24
    • 2011-11-19
    • 2010-09-09
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    相关资源
    最近更新 更多