Проверка компонентов JSR 303 + проверка Javascript на стороне клиента - PullRequest
43 голосов
/ 25 марта 2010

Каков наилучший способ выполнить проверку формы на стороне клиента с использованием Javascript (с минимальным дублированием кода) при использовании проверки bean-компонента JSR 303 на стороне сервера? В настоящее время я использую Spring 3 и Hibernate Validator .

Ответы [ 7 ]

5 голосов
/ 14 июня 2012

Я нашел этот проект с открытым исходным кодом, но он выглядит мертвым, может быть, стоит воскресить.

http://kenai.com/projects/jsr303js/pages/Home

Эта библиотека обеспечивает проверку на стороне клиента HTML-формы на основе аннотаций JSR-303 и Hibernate Validator, интегрированных с Spring MVC. Библиотека предоставляет базу кода для проверки JavaScript, которая обрабатывает базовое взаимодействие с формами HTML, а также функции JavaScript, реализующие аннотации проверки, поддерживаемые Hibernate Validator (в том числе не из спецификации JSR-303). Эту базу кода JavaScript можно включить в страницу с помощью предоставленной библиотеки тегов или путем извлечения файла JavaScript из фляги и включения его с помощью тега. После того как эта кодовая база была включена в страницу, вторая библиотека тегов используется для генерации кода JavaScript для проверки HTML-формы. Вы также можете предоставить объект JSON в теле тега, чтобы указать дополнительную информацию о конфигурации.

5 голосов
/ 25 марта 2010

Я бы посоветовал вам взглянуть на Spring JS, который сильно зависит от Dojo. Учебное пособие можно найти здесь .

Самый простой способ начать играть с ним - загрузить Spring Roo , создать пример приложения petclinic с одним из примеров-скриптов (это займет у вас 5 минут), а затем поэкспериментировать JavaScript интегрирован. Spring Roo создает приложение с тем же технологическим стеком, который вы используете (Spring + hibernate + реализация jsr 303)

4 голосов
/ 13 сентября 2012

Вот как я это делаю, используя Spring MVC + JQuery + Bootstrap , частично основанный на недавнем сообщении в блоге на SpringSource :

AddressController.java

@RequestMapping(value="/validate")
public @ResponseBody ValidationResponse processForm(Model model, @Valid AddressForm addressForm, BindingResult result) {
    ValidationResponse res = new ValidationResponse();
    if (result.hasErrors()) {
        res.setStatus("FAIL");
        for (ObjectError error : result.getAllErrors()) {
            if (error instanceof FieldError) {
                FieldError fieldError = (FieldError) error;
                res.addError(fieldError.getField(), fieldError.getDefaultMessage());
            }    
        }
    }
    else {
        res.setStatus("SUCCESS");
    }
    return res;
}

AddressForm.java

public class AddressForm {
    @NotNull
    @Size(min=1, max=50, message="Address 1 is required and cannot be longer than {max} characters")
    private String address1;

    @Size(max=50, message="Address 2 cannot be longer than {max} characters")
    private String address2;

    // etc
}

ValidationResponse.java:

public class ValidationResponse {
    private String status;
    private Map<String,String> errors;
    // getters, setters
}

address.jsp:

<f:form commandName="addressForm">
    <div class="control-group">
        <label for="address1">Address 1</label>
        <div class="controls">
            <f:input path="address1" type="text" placeholder="Placeholder Address 1" class="wpa-valid" />
            <span class="help-inline"></span>
        </div>
    </div>
    <!-- etc -->
    <div class="form-actions">
        <button type="submit" class="btn btn-primary">Save</button>
        <button type="button" class="btn">Cancel</button>
    </div>
</f:form>

<script type="text/javascript">
function collectFormData($fields) {
    var data = {};
    for (var i = 0; i < $fields.length; i++) {
        var item = $($fields[i]);
        data[item.attr("id")] = item.val();
    }

    return data;
}

function clearErrors($fields) {
    for (var i = 0; i < $fields.length; i++) {
        var item = $($fields[i]);
        $("#"+item.attr("id")).parents(".control-group").removeClass("error");
        $("#"+item.attr("id")).siblings(".help-inline").html("");
    }
}

function markErrors(errors) {
    $.each(errors, function(key, val) {
        $("#"+key).parents(".control-group").addClass("error");
        $("#"+key).siblings(".help-inline").html(val);
    });
}

$(document).ready(function() {
    var $form = $("form.validate");
    $form.bind("submit", function(e) {
        var $fields = $form.find(".validate");

        clearErrors($fields);
        var data = collectFormData($fields);

        var validationUrl = "validate";
        $.get(validationUrl, data, function(response) {
            $("#alert").removeClass();

            if (response.status == "FAIL") {
                markErrors(response.errors);

                $("#alert").addClass("alert alert-error");
                $("#alert").html("Correct the errors below and resubmit.");
            } else {
                $("#alert").addClass("alert alert-success");
                $("#alert").html("Success!");

                $form.unbind("submit");
                $form.submit();
            }
        }, "json");

        e.preventDefault();
        return false;
    });
});
</script>

Он может использовать некоторый рефакторинг, но это сделает ajax GET с данными формы и обновит страницу в зависимости от результата.

1 голос
/ 23 июня 2012

Richfaces поддерживает это. На их сайте есть небольшая демоверсия .

0 голосов
/ 05 декабря 2018

Edit:

Действительно, JSR 303 является лучшим способом (IMO) для обработки проверки на стороне клиента. Лучше всего то, что если у вас есть правильные библиотеки js на фронте, вы можете использовать ту же проверку (тот же код) на сервере (если вы используете node.js). Для этого я создал библиотеку @ stopopa / validation . Я проверяю формы, подобные этой (In React.js):

import React, { Component } from "react";
import ReactDOM from "react-dom";

import validator, {
  Collection,
  Required,
  Optional,
  NotBlank,
  Length,
  Email,
} from "@stopsopa/validator";

class App extends Component {
  constructor(...args) {
    super(...args);
    this.state = {
      data: {
        name: "",
        email: ""
      },
      errors: {},
      validate: false
    };
  }
  onSubmit = async e => {
    e.preventDefault();

    const errors = await validator(this.state.data, new Collection({
      name: new Required([
        new NotBlank(),
        new Length({min: 3}),
      ]),
      email: new Required([
        new NotBlank(),
        new Email(),
      ])
    }));
    this.setState({
      errors: errors.getFlat(),
      validate: true,
    });

    if ( ! errors.count()) {

      console.log('send data to server', this.state.data);
    }
  };
  onChange = (name, value) => {
    this.setState(state => ({
      ...state,
      data: { ...state.data, ...{ [name]: value } }
    }));
  };
  render() {
    const s = this.state;
    return (
      <form onSubmit={this.onSubmit}>
        <label>
          name:
          <input
            value={s.data.name}
            onChange={e => this.onChange("name", e.target.value)}
          />
        </label>
        {s.validate && s.errors.name && (
          <div className="error">{s.errors.name}</div>
        )}
        <br />
        <label>
          email:
          <input
            value={s.data.email}
            onChange={e => this.onChange("email", e.target.value)}
          />
        </label>
        {s.validate && s.errors.email && (
          <div className="error">{s.errors.email}</div>
        )}
        <br />
        <input type="submit" value="submit" />
      </form>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));

живой пример доступен здесь: https://codesandbox.io/s/ymwky9603j

0 голосов
/ 30 июля 2018

Вот альтернатива JSR-303 с открытым исходным кодом.

Это решение может выполнить всю проверку сообщения запроса, но кодирование без проблем не требуется.

https://github.com/ckpoint/CheckPoint

С Check-Point все проверки возможны без дополнительного кода, просто путем изменения аннотации метода Controller.

После этого все параметры проверки можно легко настроить на странице администратора.

Я думаю, что это видео поможет вам понять. https://youtu.be/I1aEIztXlhE

Экран настройки страницы администратора Check-Point

0 голосов
/ 28 августа 2013

Платформа проверки на стороне клиента PrimeFaces поддерживает проверку bean-компонентов.

http://blog.primefaces.org/?p=2874

...