powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC: использование @ModelAttribute, биндеров, валидаторов
5 сообщений из 5, страница 1 из 1
Spring MVC: использование @ModelAttribute, биндеров, валидаторов
    #37849512
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу скажу - раньше не юзал, с недавнего времени стал, но исключительно из-за "чистоты кода", думал, не понимаю, поиспользую и пойму. Не понял. Прошу помощи, может, не туда смотрю?

Допустим, есть форма из 2-ух элементов (по минимуму, для теста). Процедура:
1. Создаем модель формы:
Код: java
1.
2.
3.
4.
5.
public class LoginForm {
	private String login;
	private String password;
	//getters/setters
}


2. Создаем валидатор:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class LoginFormValidator implements Validator {
	@Override
	public boolean supports(Class<?> candidate) {
		return LoginForm.class.isAssignableFrom(candidate);
	}
	@Override
	public void validate(Object object, Errors errors) {
		LoginForm form = (LoginForm) object;
		//разные условия верификации
			errors.rejectValue("login", "value.from.property.file");
	}
}


Причем, хочу заметить, в валидатор прийдется заинжектить DAO, так как некоторые проверки зависят от значений в базе.
3. Используем тэги неймспейса <form: в jsp-представлении. Причем, стандартный вывод ошибок "по-спринговски" меня не устраивает. Даже используя <form:errors path="*"/>, потому что я, скажем, хочу выводить их не в спане, а в разных дивах или списке. Для этого уже надо использовать <spring:bind ...> и обрабатывать ошибки вручную.
4. Настраиваем "предконтроллер" перед страницей с нашей формой:
Код: java
1.
2.
3.
4.
5.
@RequestMapping(value = "/test")
public ModelAndView test(HttpServletRequest request, ModelMap model) throws Exception {
	model.addAttribute("loginForm", new LoginForm());
	return new ModelAndView("/pages/testpage.jsp", model);
}


5. Настраиваем контроллер:
Код: java
1.
2.
3.
4.
5.
6.
@RequestMapping(value = "/testform", method = RequestMethod.POST)
public ModelAndView testform(@ModelAttribute("loginForm") LoginForm loginForm, BindingResult result) throws Exception {
	new LoginFormValidator().validate(loginForm, result);
	if (result.hasErrors()) return new ModelAndView("/pages/testpage.jsp", "loginForm", loginForm);
	return new ModelAndView("/pages/aftertestpage.jsp");
}


Так, очень по-скромному. Если я хочу отослать форму динамически (скажем, через популярный плагин к jQuery ajaxForm), то надо вытащить из result ошибки и скинуть их, скажем, в json. Или вернуть положительный ответ/ссылку/прочее.


Второй вариант. Я назвал его "на коленках". Та же форма (только без form:), тот же контроллер. Шаги 1-4 опускаются, остается контроллер:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@RequestMapping(value = "/testform", method = RequestMethod.POST)
public ModelAndView testform(HttpServletRequest request) throws Exception {
	String login = request.getParameter("login");
	String password = request.getParameter("password");
	//тут фактически идут тютелька-в-тютельку такие же проверки, как были в валидаторе и складываются в коллекцию
	//и пара строк, чтобы возвращало значения в контролы, и то, если вызов не через ajax
	if (!errorCollection.isEmpty()) return new ModelAndView("/pages/testpage.jsp", "errors", errorsToJson);
	return new ModelAndView("/pages/aftertestpage.jsp");
}



Вот и спрашивается - нафига козе баян? Фактически, 2-ух повторяющихся форм в проекте нет, 40 форм - 40 моделей и 40 валидаторов. Да, с валидаторами и моделями как бы "солиднее" и "кошерней", чего только стоят методы у ValidationUtils ... И если при перезагрузке той же страницы при ошибках это немного добавляет автоматизма, то при динамической отправке формы на сервере прирост автоматизма мизерный, а на клиенте все равно разгребать все самому.

Может, у меня для этого слишком простой проектик? - Страницы, формочки, переходы ... И просто я сам себе создал проблему, связавшись с высокоуровневой реализацией MVC? Но как-то для меня на первых двух местах идут секьюрити и дизайн (+ юзабилити + клиентский функционал), а эта автоматизация (которая под вопросом) - как-то не очень ... тем более, если надо выкручивать мозг, придумывая, как обыграть вывод ошибок в том виде и дизайне, который задуман.

Не подумайте, не ругаю. Просто может я действительно чего-то не понимаю? И все это придумано для чего-то более крупного, совершенного. Или наоборот, когда страницы в стиле стандартных спринговских (логина, например) - все белое, элементы стандартные - автоматизация наше все?
...
Рейтинг: 0 / 0
Spring MVC: использование @ModelAttribute, биндеров, валидаторов
    #37849866
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в общем то да, у меня были примерно такие же вопросы. В итоге делаю так - если на форме до 6-7 полей - использую наколеночный вариант, правда параметры инжектаются прямо в метод через @RequestParam, на большем количестве - уже проще через биндер, валидатор и т.п.
...
Рейтинг: 0 / 0
Spring MVC: использование @ModelAttribute, биндеров, валидаторов
    #37850002
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не выход ... например, если чекбокс не выбрать, но ловить параметр через RequestParam, выдаст исключение - такого параметра в запросе не окажется.
...
Рейтинг: 0 / 0
Spring MVC: использование @ModelAttribute, биндеров, валидаторов
    #37850066
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все же - пару слов, к "в теме" ... плиз.
...
Рейтинг: 0 / 0
Spring MVC: использование @ModelAttribute, биндеров, валидаторов
    #37850197
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IDVsbruck,

Первая схема позволяет отделить логику от представления, на коленке - в одном методе и jsp и логика.
Лучше использовать 1-й способ.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring MVC: использование @ModelAttribute, биндеров, валидаторов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]