Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring MVC: AJAX-валидация данных формы 
:(
    Опции темы
MaxPayneC
Дата 10.4.2010, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Имеется такой класс (взят из примера, выложенного авторами Spring):
Код

package org.springframework.samples.mvc.basic.account;

import java.math.BigDecimal;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;

import javax.validation.constraints.Future;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.format.annotation.NumberFormat.Style;

public class Account {
    
    private Long id;
    
    @NotNull
    @Size(min=1, max=25)
    private String name;
    
    @NotNull
    @NumberFormat(style=Style.CURRENCY)
    private BigDecimal balance = new BigDecimal("1000");
    
    @NotNull
    @NumberFormat(style=Style.PERCENT)
    private BigDecimal equityAllocation = new BigDecimal(".60");

    @DateTimeFormat(style="S-")
    @Future
    private Date renewalDate = new Date(new Date().getTime() + 31536000000L);

    public Long getId() {
        return id;
    }

    void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getBalance() {
        return balance;
    }

    public void setBalance(BigDecimal balance) {
        this.balance = balance;
    }

    public BigDecimal getEquityAllocation() {
        return equityAllocation;
    }

    public void setEquityAllocation(BigDecimal equityAllocation) {
        this.equityAllocation = equityAllocation;
    }

    public Date getRenewalDate() {
        return renewalDate;
    }

    public void setRenewalDate(Date renewalDate) {
        this.renewalDate = renewalDate;
    }
    
    Long assignId() {
        this.id = idSequence.incrementAndGet();
        return id;
    }
    
    private static final AtomicLong idSequence = new AtomicLong();
    
}

На некоторые его поля, как можно видеть, повешены ограничения - @NotNull, @Future и т.п.

Есть контроллер:
Код

package org.springframework.samples.mvc.basic.account;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping(value="/account")
public class AccountController {

    private Map<Long, Account> accounts = new ConcurrentHashMap<Long, Account>();
    
    @RequestMapping(method=RequestMethod.GET)
    public String getCreateForm(Model model) {
        model.addAttribute(new Account());
        return "account/createForm";
    }
    
    @RequestMapping(method=RequestMethod.POST)
    public String create(@Valid Account account, BindingResult result) {
        if (result.hasErrors()) {
            return "account/createForm";
        }
        this.accounts.put(account.assignId(), account);
        return "redirect:/account/" + account.getId();
    }
    
    @RequestMapping(value="{id}", method=RequestMethod.GET)
    public String getView(@PathVariable Long id, Model model) {
        Account account = this.accounts.get(id);
        if (account == null) {
            throw new ResourceNotFoundException(id);
        }
        model.addAttribute(account);
        return "account/view";
    }

}

Данный подход к организации работы контроллера показался мне очень удобным (аннотациями определяем, какие конкретно урлы на какие методы контроллера идут, и возвращаем соответствующие имена вьюх). Хотелось бы как-то научиться проводить валидацию полей формы на сервере, без "реальной" отправки данных. С использованием фреймворка Struts (для сравнения) это делалось путем отправки на сервер по урлу того же самого экшна сериализованной формы с двумя прилепленными параметрами, экшн проводил валидацию (в соответствии с хмл-файлом, аннотациями или методом validate()) и возвращал текстом JSON-описание возникших ошибок. Если их не было, происходила реальная отправка формы. Данный механизм был мне очень удобен, и поэтому хотелось бы с использованием Spring сделать что-то подобное.

Буду признателен за описание или ссылку на описание процесса валидации форм с помощью AJAX, и возможно советы по улучшению подхода к созданию контроллера. Заранее спасибо smile
PM   Вверх
MaxPayneC
Дата 13.4.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Ап. Что, никто не делал валидацию на AJAX?
PM   Вверх
afon
Дата 13.4.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



Я делал. Немного не так как у вас, на обычных xml-описанных бинах, но все-таки. 

В общем, отдельный контроллер, на который шлется ajax-request с объектом command и который проверяет валидность данных. Этот контроллер возвращает вьюху в которой только один результат true|false; форма, сделав ajax вызов методами jquery, парсит результат, и если он true - делает обычный javascript-овый this.form.submit(). 
Примерно так. 

PS: или вы хотели прикрутить обычный org.springframework.validation.Validator ? Не думаю что там будет сильно сложнее, наверное в случае ошибки шлете в свою вьху какой-нибудь error объект  и всех делов. Если же все success, возворащаете в форму true и редиректите страницу куда надо. Я бы сделал так. 

Это сообщение отредактировал(а) afon - 13.4.2010, 15:36
PM MAIL WWW   Вверх
MaxPayneC
Дата 13.4.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



А если мне нужны подробности по каждому полю, вызвавшему ошибку? Сериализацию/десериализацию в xml или json надо писать руками, и разбор его на клиенте соответственно, или есть что-то готовое?
PM   Вверх
afon
Дата 14.4.2010, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 5.4.2008
Где: Украина, Киев

Репутация: нет
Всего: 1



xstream к примеру,  или flexjson. 
Достаточно поискать "spring json view" и можно найти на свой вкус несколько разных методов преобразования и возврата данных. 

Я xstream-ом пользуюсь - http://xstream.codehaus.org/json-tutorial.html. Простая вьюха jsonview, которая вынимает объект (какого нибудь константного имени) из мапы модели и конвертит его, а потом возвращает. Ну а на самой страничке уже jquery работает по разбору json объекта. Примеры тоже есть в массовом количестве smile
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.