Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > данные от пользователя + EJB.


Автор: polosatij 15.4.2007, 14:52

в бине EJB можно увидеть следующее:

Код

    @Length(min=1, max=32)
    @Column(name="USERNAME", nullable=false, unique=true)
    public String getUsername() {
        return this.username;
    }
    
    public void setUsername(String username) {
        this.username = username;
    }


а значит, длинна Username не может быть меньше чем 1 и больше чем 32..

вопрос..

со страницы приходят данные от пользователя (input и form).. если попробовать добавить эти данные в EJB, возможно будет кинут Exception, т.к. например, юзер может поле вообще не заполнить.. как вернуться назад на страницу и показать именно то поле, в котором был брошен Exception? Можно как вариант писать <javascript> для валидации. Oднако чем больше страниц, тем больше нужно перерабатывать скрипта.. Данные со страницы приходят в Servlet, если валидировать их там, опять-таки проблема => слишком много всего, да и зачем, если правила установлены в EJB? как и где решить проблему валидации данных?  smile 


Автор: Mikamj 16.4.2007, 08:20
Цитата(polosatij @ 15.4.2007,  14:52)
как и где решить проблему валидации данных?  smile

Валидацию нужно производить в веб-слое. Например так:
У вас есть класс UserInfo, который представляет собой оболочку над данными пользователя (простой JavaBean). В сервлете вы извлекаете данные, которые ввел пользователь, и кладете их в объект UserInfo.
Далее вызываете на нем метод, например validate. Если он вернул false - открываем эту же страницу с выводом сообщения об ошибке, без обращения к EJB-слою.
Чтобы сервлет не был огромный, рекомендую написать для каждого действия (например, отображение формы для добавления, собственно добавление и т.д.) отдельный класс-action, который вызывается из сервлета.

Автор: polosatij 16.4.2007, 13:23


угу.. ты говоришь это, поскольку работаешь со Struts  smile 

а зачем нужна двойная валидация данных?  smile  может быть как-нибудь только одну валидацию можно красиво сделать?  smile 

Автор: Mikamj 17.4.2007, 07:13
Цитата(polosatij @ 16.4.2007,  13:23)
угу.. ты говоришь это, поскольку работаешь со Struts  smile 

а зачем нужна двойная валидация данных?  smile  может быть как-нибудь только одну валидацию можно красиво сделать?  smile

Нет, со Struts я не работаю.
Двойная валидация конечно не нужна.
Просто уберите ограничение из EJB.

Автор: polosatij 17.4.2007, 13:32
Цитата(Mikamj @  17.4.2007,  07:13 Найти цитируемый пост)
Просто уберите ограничение из EJB. 



хм... нет..  smile  этого делать я 1. не могу (т.к. по этим ограничениям EJB строит таблицы в базе данных), 2. не буду - т.к. там сразу видно что и где, и практически нельзя пропустить ошибку (!)

Добавлено через 5 минут и 49 секунд


странно, что никто не может мне с этим помочь.. неужели никто для веба не использует EJB? smile 

Автор: Mikamj 17.4.2007, 19:03
Я нигде не видел, чтобы валидация данных производилась в EJB. Во всех фреймворках предусмотрена валидация в вебе.
Что если вам нужно будет валидировать не только длину строки? Тут аннотации не помогут...

Автор: polosatij 17.4.2007, 19:05
Цитата(Mikamj @  17.4.2007,  19:03 Найти цитируемый пост)
Я нигде не видел, чтобы валидация данных производилась в EJB.


валидация данных в EJB нужна для того, чтоб не писать ерунду в БД..  smile 


Цитата(Mikamj @  17.4.2007,  19:03 Найти цитируемый пост)
Что если вам нужно будет валидировать не только длину строки? Тут аннотации не помогут... 


ещё как помогут  smile 
пожалуйста почитайте EJB 3.0  smile

Добавлено через 2 минуты и 14 секунд


я думаю так.. придётся писать javaScript для валидации на клиенте и оставлять EJB анотации для ДБ..  smile 

Автор: Mikamj 18.4.2007, 13:13
Вы гибернейт я так понял используете, а не Java Persistence API?
Я с ним не работал, не знаю какие там еще аннотации есть.
Валидация с помощью JavaScript бесполезна - пользователь может просто отключить его.

Автор: polosatij 18.4.2007, 15:20
Цитата(Mikamj @  18.4.2007,  13:13 Найти цитируемый пост)
Валидация с помощью JavaScript бесполезна - пользователь может просто отключить его. 



я знаю, однако в моём случае, при выключенном JS вообще нельзя будет загрузить страницу.. у меня всё построено на AJAX-е.. а если пользователь зайдёт на сайт и выключит JS, тогда он не сможет отослать сообщение вообще.. а если он сам сконфигурирует такое сообщение, то "плохие" данные не пустит парсер EJB в БД..  smile какие есть ещё варианты?

мне одно не нравится, если писать отдельный JS для страниц, значит можно точно где-то что-то забыть.. хм.. может написать тоолсу, чтоб сама JS из анотаций EJB генерировала?  smile 

Автор: Mikamj 18.4.2007, 15:55
Пользователь, если найдется умник какой-нибудь, может отредактировать ваш JavaScript для валидации данных как ему угодно и отправить запрос на сервер с некорректными данными.

Автор: chief39 18.4.2007, 16:15
Цитата(polosatij @  15.4.2007,  14:52 Найти цитируемый пост)
т.к. например, юзер может поле вообще не заполнить.. 

Цитата(polosatij @  15.4.2007,  14:52 Найти цитируемый пост)
@Length(min=1, max=32)

Дык... тогда, я так понимаю, для возможности незаполненных полей надо писать мин=0 smile 

Цитата(polosatij @  15.4.2007,  14:52 Найти цитируемый пост)
как вернуться назад на страницу и показать именно то поле, в котором был брошен Exception?

А каков характер ксепшна(я просто не юзал) Имя поля не фигурирует?

Насчёт двойной проверки - а если у нас ещё ограничение и в БД длиной поля и индеском некое - дык вообще тройная проверка smile))
Но это, не так страшно, если БД автосоздаётся из еджиби.


Лично я делал так(еджиби 2.1) - в сешн бине проверял вручную нужные поля и наверх кидал ксепшн с дополнительными переменными о поле, характере ошибки и проч. А веб клиент тянул по таким готовым ксепшнам нужные сообщения.

Если саовцы задумали сразу такое ограничение - или доп. проверка а-ля юник индекс в базе, или нормальный механизм с коллбэком(какой, всё-таки, ксепшн кидает?).
Если первое - лучше проверять самому в бине.

Кста... сервлеты с энтити директли работают??? я бы порекомендовал сешн бин в качестве сешн фасада.... smile 
Раз уж еджиби есть в проекте - то надо уж использовать его преимущества...

Добавлено через 4 минуты и 32 секунды
Цитата(Mikamj @  18.4.2007,  15:55 Найти цитируемый пост)
Пользователь, если найдется умник какой-нибудь, может отредактировать ваш JavaScript для валидации данных как ему угодно и отправить запрос на сервер с некорректными данными. 

Кста, такую проверку мы добавляли по возможности третьим слоем(кроме БД ограничений и логики фасада) в джаваскрипт. Житропопозакрученый юзер, конечно, может поправить js... smile Но! дальше фаскада такое хитрожопство не пройдёт. Да и страницы разные могут фасад трогать.
А сделали зачем? да просто для того, чтоб для 99% юзеров не перегружать страничку, а тут же показывать ошибки. Конечно, в случаях, когда заранее известно что ограничение не будет меняться раз в месяц и не придётся везде его поддерживать...

Автор: polosatij 18.4.2007, 20:01
Цитата(Mikamj @  18.4.2007,  15:55 Найти цитируемый пост)
Пользователь, если найдется умник какой-нибудь, может отредактировать ваш JavaScript для валидации данных как ему угодно и отправить запрос на сервер с некорректными данными. 



пожалуйста почитайте EJB 3.0  smile 


Цитата(chief39 @  18.4.2007,  16:15 Найти цитируемый пост)
Дык... тогда, я так понимаю, для возможности незаполненных полей надо писать мин=0


можно просто required=true  smile 


Цитата(chief39 @  18.4.2007,  16:15 Найти цитируемый пост)
А каков характер ксепшна(я просто не юзал) Имя поля не фигурирует?



вроде бы нет, но надо бы посмотреть ещё раз..  smile  однако я не смогу пересылать пользователя из EJB обратно на страницу, слишком много гимороя  smile 

Цитата(chief39 @  18.4.2007,  16:15 Найти цитируемый пост)
а если у нас ещё ограничение и в БД длиной поля и индеском некое


нет.. это анотации решают  smile 

Цитата(chief39 @  18.4.2007,  16:15 Найти цитируемый пост)
я бы порекомендовал сешн бин в качестве сешн фасада.... smile 


угу.. всех в топку, кто неправилъно заполнит.. нефиг сервер грузить.. пусть сразу отсеиваются  smile 
однако, представляешь, ето на каждую форму JS писать.. это же х.. туча  smile 

может как-нибудь генирировать JS можно? ню, я имею ввиду, не писать очередной велосипед  smile 

угу.. это я ещё не успел посмотреть, тока осваиваю EJB 3.0  smile однако, насколько я понял, сессион беан будет сохранять именно один приходящий случай.. или я не прав?  smile 

 


Цитата(chief39 @  18.4.2007,  16:15 Найти цитируемый пост)
Кста, такую проверку мы добавляли по возможности третьим слоем(кроме БД ограничений и логики фасада) в джаваскрипт.


Автор: polosatij 19.4.2007, 06:38
нашёл такой велосипед:

http://forum.vingrad.ru/topic-36336.html

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)