![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Изучаю SpringMVC, пишу некое подобие блога.
1) Есть PostController, который выбирает из базы пост и комменты к нему, затем все это отображается на страничке. Там же есть поле для добавления комментария. Как лучше организовать этот процесс? а именно: - Должен ли быть контроллер, который обрабатывает комментарии обязательно FormController, так как сам комментарий мы получаем из формы. Или же это может быть обычный AbstractController, а текст комментария просто получать из запроса. (Валидацию можно возложить на javascript) - Когда сабмичу комментарий нужно как-то указать к какому посту этот комментарий принадлежит, хотя мы явно понимаем какому, но это же надо как-то указать и приложению. Тут я вижу два пути - передавать сам объект типа Post с jsp странички, который мы раньше получили и отобразили, или же передавать id этого поста и уже в контроллере по id выбирать пост и назначать его комментарию. Если втрой вариант, то id можно передать hidden полем в форме, а если первый, как то как передать объект Post? Просто в скриплете положить в запрос или в сессию? Может есть более красивое решение? Может есть какие теги спринговые полезные или еще есть вариант? 2) Добавление комментариев лучше производить в отдельном контроллере или же в PostControlelr? 3) Предположим мы добавили комментарий, если это произошло в отдельном контроллере (CommentController), то как нам потом форварднуться на PostController, чтобы заново выбрать и отобразить уже пост с обновленными комментариями? 4) Если форварднемся на PostController, то опять будет происходить выборка того же поста и тех же комментариев + 1 новый. Не есть хорошо. Можно конечно же деалть через аджакс, но аджакс пока прикручивать я не тороплюсь. Короче вот такая цепочка вопросов. ![]() |
|||
|
||||
Vasay |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2097 Регистрация: 8.3.2006 Репутация: 18 Всего: 73 |
garbuz,
ИМХО Плохая идея. Валидация ВСЕГДА должна быть на стороне сервера и опционально на клиенте, поскольку, js на клинте может работать не корректно, или просто не работать - откуда Вы знаете с какого устройства будут смотреть Ваш блог. Кроме того, любой "кулхацкер" сможет подправив код страницы, обойти Вашу JS валидацию.
ИМХО - в отдельном.
Думаю, id в хидден поле.
ИМХО, это тот случай, когда грамотная реализация ajax будет лучшим выбором, а пока - "выборка того же поста и тех же комментариев + 1 новый" -------------------- Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны. |
||||||||
|
|||||||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Vasay, спасибо за ответы!
Полностью согласен, но на первое время думал обойтись без серверной валидации. Смотрите, если же передавать не id а объект Post, то этот объект можно потом передать в Post контроллер и тогда нам останется подтацить только комменты. Т.е. что лучше будет? Потаскать объект через контроллеры или сделать + 1 запрос к базе? Отсюда вытекает вопрос, который есть в первом моем посте - как передать объект правильнее и как потом с этим объектом форварднуться на другой контроллер? |
|||
|
||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Следующий вопрос.
Создание нового поста лучше производить в отдельном контроллере или же в этом же? Большинство небольших примеров что я видел, работали по правилу один запрос - один контроллер. Правильно ли это? Я думаю сейчас делать все в одном контроллере, например в PostController будет работа с потами (типа просмотр, создание, удаление, редактирование и т.п.) Рулить собираюся всем через параметр action, в контроллере перебираю его через if и в зависимости от значения выполняю действия. Такой подход нормальный? Или же лепить много контроллеров на каждое действие? |
|||
|
||||
goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: нет Всего: 9 |
id в хиден поля можно не класть
использую к примеру SimpleFormController и добавив атрибут в настройке контроллера sessionForm = true (в таком случае контроллер в formBackingObject будет заходить только один раз, но там есть подводные камни) и еще пытайтесь всегда использовать для форм SimpleFormController (ну и еже с ними Wizard и тд, но не AbstractController и MultiactionController) в конечном итоге это очень сильно сэкономит время ![]() Добавлено через 2 минуты и 36 секунд валидацию форм тоже проводите в отдельных классах имплементирующих интерфейс Validator Добавлено через 4 минуты и 1 секунду
зря... делается она придельно просто и красиво с помощью спринга -------------------- SCJP 6 |
|||
|
||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
goodday1941, спасибо за советы, учту. А вот что на счет последнего вопроса?
|
|||
|
||||
goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: нет Всего: 9 |
я делаю обычно так:
форма - 100% SimpleFormController с Validator (даже если нечего валидировать ![]() что то визардовое (пошаговое) - соответственно WizardController ну и далее действие относящиеся к одной сущности (например показать список пользователей, удалить пользователя) - MultiactionController AbstractController использую очень редко но бывают ситуации рулить через параметр экшин ИМХО недопустимо.... if - else это из розряда функционального программирования ) легко запутаться лучше иметь 10 простых классов по 100 строк чем один на 1000 Это сообщение отредактировал(а) goodday1941 - 13.5.2009, 17:41 -------------------- SCJP 6 |
|||
|
||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
goodday1941, еще раз спасибо за советы. Про formController приму к сведению, даже наверно постараюсь переделать то, что уже есть.
Недавно читал про MultiactionController. Там идея понятна, если конечно сведения из моей книги не устарели ![]() Допустим будет что-то типа такого
В случае отображения, как я понимаю урл должен быть типа /post.htm?action=show&postId=x В случае create, как я понимаю урл должен быть типа /post.htm?action=create В случае delete, как я понимаю урл должен быть типа /post.htm?action=delete&postId=x Естественно, что действие удаления поста будет доступно только для админов, но обычный пользователь тоже сможет написать такой урл и отправить его серверу и тогда произойдет удаление поста, который не следует удалять. Как быть в такой ситуации? Добавлено через 7 минут И как быть если у нас один котроллер должен быть Multiaction, а так же должен обрабатывать данные от формы? От какого екстендиться предпочтительнее? |
|||
|
||||
goodday1941 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: нет Всего: 9 |
нет урл зависит от того что прописано в маппинге... например при SimpleUrlHandlerMapping будем иметь урлы = названию метода тоесть
так же можно явно указывать какой урл соответствует какому методу, думаб в вашей книге это есть ) если конечно ваша книга называется Spring in Action ) Добавлено через 3 минуты и 26 секунд
тут будет два контроллера почитай про asegi - это приблуда на спринг для аутентификации, ну или более простой вариант повесить фильтр на урл доступ к которому имеют только одмины Добавлено через 5 минут фильтр проверяет залогинен ли пользователь если нет то редиректит запрос на страницу с логином -------------------- SCJP 6 |
||||
|
|||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
А можно примерчик, если есть конечно. Книга Spring in Action, но первое издание. Посмотрел во втором, там про Multiaction не написано вообще, точнее написано, а примера нет. |
|||
|
||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
Итак. С самого начала начал лепить практически везде abstract контроллеры. Ну что же, первый блин как всегда. Решил все переделать с самого начала, но сперва решил еще раз посоветоваться. Вот что я решил:
1) HomePageController ext AbstractController - выводит на главную страницу все посты и информацию к ним (дату, теги, автора). 2) PostController ext MultiactionController - показывает конкретный пост с коментариями и удаляет посты, принимает в качестве параметра postId. 3) CreatePostController ext SimpleFormController - создает и редактирует пост, так как там тоже все на формах. А возможно в этом контроллере проводит вякую валидацию и создание объекта, а потом с этим объектом редиректиться на PostController и там уже в соответствующих метода записывать объект в базу? Или так не стоит делать? 4) CommentController ext SimpleFormController - создает новый комментарий, который приходит из формы, хотя в форме всего одно поле. (думаю что удаление и редактирование комментариев не нужно вовсе, хотя удаление может быть...) ну что? Кто что думает на счет таког подхода? Теперь осталось разобраться как всем эти рулить. Нашел в оф доках ParameterMethodNameResolver, который выбирает метод в зависимости от значения указанного параметра, например action=create, action=edit. Так же нашел PropertiesMethodNameResolver, который, как я понял, биндит урл на конкретный метод. Там же в обоих примерах упоминается некий делегат, которому, как я понял, мы можем делегировать нек методы. Вопрос для чего? Не проще ли все объявленные методы в контроллере реализовать? Зачем еще делегат? Короче вот как-то так, жду ответов ![]() ![]() |
|||
|
||||
_and |
|
|||
![]() Java-developer ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 6.8.2004 Где: Новокузнецк Репутация: 1 Всего: 4 |
garbuz, советую посмотреть на сэмплы спринга типа jpetstore и остальные(обычно лежат в архиве спринга) половина вопросов отпадут сами собой
этого точно не стоит делать, каждое действие должно лежать в своем классе можно добавить поля имя автора камента и мыло. Удаления камента сделаь для админа и автора поста взято из сэмпла по спрингу petclinic
|
|||
|
||||
goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: нет Всего: 9 |
этого лучше не использовать.. нужно ж и про SEO думать, а поисковикам урлы с параметрами не нравятся валидацью можно проводить и в этом классе но лучше написать отдельный класс валидатор.. в интернете примеров валом есть как это делается создание объекта - что имеется ввиду? -------------------- SCJP 6 |
|||
|
||||
garbuz |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 677 Регистрация: 22.1.2008 Репутация: 8 Всего: 11 |
||||
|
||||
goodday1941 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: нет Всего: 9 |
я использую SimpleUrlHandlerMapping и не указую резолвера когда создаю спринг бины тогда например название метода в MultiactionController'е будет соответствовать урлу, а для остальных что пропишем при маппинге то и получим но это дело вкуса многие прописывают для мультиэкшн контроллера PropertiesMethodNameResolver -------------------- SCJP 6 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |