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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы по Spring MVC, жду советов и предложений. 
:(
    Опции темы
garbuz
Дата 8.5.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 новый. Не есть хорошо. Можно конечно же деалть через аджакс, но аджакс пока прикручивать я не тороплюсь.

Короче вот такая цепочка вопросов.  smile 
PM MAIL   Вверх
Vasay
Дата 8.5.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: 18
Всего: 73



garbuz

Цитата

(Валидацию можно возложить на javascript)


ИМХО Плохая идея. Валидация ВСЕГДА должна быть на стороне сервера и опционально на клиенте, поскольку, js на клинте может работать не корректно, или просто не работать - откуда Вы знаете с какого устройства будут смотреть Ваш блог.

Кроме того, любой "кулхацкер" сможет подправив код страницы, обойти Вашу JS валидацию.

Цитата

2) Добавление комментариев лучше производить в отдельном контроллере или же в PostControlelr?


ИМХО - в отдельном.

Цитата

- Когда сабмичу комментарий нужно как-то указать к какому посту этот комментарий принадлежит, хотя мы явно понимаем какому, но это же надо как-то указать и приложению. Тут я вижу два пути -  передавать сам объект типа Post с jsp странички, который мы раньше получили и отобразили, или же передавать id этого поста и уже в контроллере по id выбирать пост и назначать его комментарию. Если втрой вариант, то id можно передать hidden полем в форме, а если первый, как то как передать объект Post? Просто в скриплете положить в запрос или в сессию? Может есть более красивое решение? Может есть какие теги спринговые полезные или еще есть вариант?


Думаю, id в хидден поле. 


Цитата

4) Если форварднемся на PostController, то опять будет происходить выборка того же поста и тех же комментариев + 1 новый. Не есть хорошо. Можно конечно же деалть через аджакс, но аджакс пока прикручивать я не тороплюсь.


ИМХО, это тот случай, когда грамотная реализация ajax будет лучшим выбором, а пока - "выборка того же поста и тех же комментариев + 1 новый"


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
garbuz
Дата 8.5.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



Vasay, спасибо за ответы!

Цитата(Vasay @  8.5.2009,  18:35 Найти цитируемый пост)
ИМХО Плохая идея. Валидация ВСЕГДА должна быть на стороне сервера и опционально на клиенте,

Полностью согласен, но на первое время думал обойтись без серверной валидации.


Цитата(Vasay @  8.5.2009,  18:35 Найти цитируемый пост)
Думаю, id в хидден поле. 

Смотрите, если же передавать не id а объект Post, то этот объект можно потом передать в Post контроллер и тогда нам останется подтацить только комменты. Т.е. что лучше будет? Потаскать объект через контроллеры или сделать + 1 запрос к базе?  Отсюда вытекает вопрос, который есть в первом моем посте - как передать объект правильнее и как потом с этим объектом форварднуться на другой контроллер?

PM MAIL   Вверх
garbuz
Дата 13.5.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



Следующий вопрос.
Создание нового поста лучше производить в отдельном контроллере или же в этом же? Большинство небольших примеров что я видел, работали по правилу один запрос - один контроллер. Правильно ли это? Я думаю сейчас делать все в одном контроллере, например в PostController будет работа с потами (типа просмотр, создание, удаление, редактирование и т.п.) Рулить собираюся всем через параметр action, в контроллере перебираю его через if и в зависимости от значения выполняю действия. Такой подход нормальный? Или же лепить много контроллеров на каждое действие?
PM MAIL   Вверх
goodday1941
Дата 13.5.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



id в хиден поля можно не класть

использую к примеру SimpleFormController
и добавив атрибут в настройке контроллера sessionForm = true (в таком случае контроллер в formBackingObject будет заходить только один раз, но там есть подводные камни)

и еще пытайтесь всегда использовать для форм SimpleFormController (ну и еже с ними Wizard и тд, но не AbstractController и MultiactionController) в конечном итоге это очень сильно сэкономит время smile

Добавлено через 2 минуты и 36 секунд
валидацию форм тоже проводите в отдельных классах имплементирующих интерфейс Validator

Добавлено через 4 минуты и 1 секунду
Цитата(garbuz @  8.5.2009,  18:57 Найти цитируемый пост)
Полностью согласен, но на первое время думал обойтись без серверной валидации.

зря... делается она придельно просто и красиво с помощью спринга


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
garbuz
Дата 13.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



goodday1941, спасибо за советы, учту. А вот что на счет последнего вопроса?
Цитата

Создание нового поста лучше производить в отдельном контроллере или же в этом же? Большинство небольших примеров что я видел, работали по правилу один запрос - один контроллер. Правильно ли это? Я думаю сейчас делать все в одном контроллере, например в PostController будет работа с потами (типа просмотр, создание, удаление, редактирование и т.п.) Рулить собираюся всем через параметр action, в контроллере перебираю его через if и в зависимости от значения выполняю действия. Такой подход нормальный? Или же лепить много контроллеров на каждое действие? 

PM MAIL   Вверх
goodday1941
Дата 13.5.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я делаю обычно так:

форма - 100% SimpleFormController с Validator (даже если нечего валидировать smile, хотя что валидировать есть всегда)
что то визардовое (пошаговое) - соответственно WizardController
ну и далее действие относящиеся к одной сущности (например показать список пользователей, удалить пользователя) - MultiactionController
AbstractController использую очень редко но бывают ситуации


рулить через параметр экшин ИМХО недопустимо....  if - else это из розряда функционального программирования ) легко запутаться
лучше иметь 10 простых классов по 100 строк чем один на 1000


Это сообщение отредактировал(а) goodday1941 - 13.5.2009, 17:41


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
garbuz
Дата 13.5.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



goodday1941, еще раз спасибо за советы. Про formController приму к сведению, даже наверно постараюсь переделать то, что уже есть.
Недавно читал про MultiactionController. Там идея понятна, если конечно сведения из моей книги не устарели smile
Допустим будет что-то типа такого 
Код

public class PostController extends MultiActionController{
     private DAOFacade daoFacade;

    public void setDaoFacade(DAOFacade daoFacade) {
        this.daoFacade = daoFacade;
    }

    public ModelAndView create(request, response){
    // тут создаем новый пост 
    }

    public ModelAndView delete(request, response){
          // тут получаем id поста и удаляем его
    } 
}

В случае отображения, как я понимаю урл должен быть типа /post.htm?action=show&postId=x
В случае create, как я понимаю урл должен быть типа /post.htm?action=create
В случае delete, как я понимаю урл должен быть типа /post.htm?action=delete&postId=x

Естественно, что действие удаления поста будет доступно только для админов, но обычный пользователь тоже сможет написать такой урл и отправить его серверу и тогда произойдет удаление поста, который не следует удалять. Как быть в такой ситуации?

Добавлено через 7 минут
И как быть если у нас один котроллер должен быть  Multiaction, а так же должен обрабатывать данные от формы? От какого екстендиться предпочтительнее?
PM MAIL   Вверх
goodday1941
Дата 13.5.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(garbuz @  13.5.2009,  18:24 Найти цитируемый пост)
В случае отображения, как я понимаю урл должен быть типа /post.htm?action=show&postId=x
В случае create, как я понимаю урл должен быть типа /post.htm?action=create
В случае delete, как я понимаю урл должен быть типа /post.htm?action=delete&postId=x

нет

урл зависит от того что прописано в маппинге...
например при SimpleUrlHandlerMapping будем иметь урлы = названию метода
тоесть 
     
Код

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
            <props>
                <prop key="/test/*">multiController</prop>
              </props>
        </property>
    </bean>


так же можно явно указывать какой урл соответствует какому методу, думаб в вашей книге это есть ) если конечно ваша книга называется Spring in Action )

Добавлено через 3 минуты и 26 секунд
Цитата(garbuz @  13.5.2009,  18:24 Найти цитируемый пост)
И как быть если у нас один котроллер должен быть  Multiaction, а так же должен обрабатывать данные от формы? От какого екстендиться предпочтительнее? 

тут будет два контроллера


Цитата(garbuz @  13.5.2009,  18:24 Найти цитируемый пост)
Естественно, что действие удаления поста будет доступно только для админов, но обычный пользователь тоже сможет написать такой урл и отправить его серверу и тогда произойдет удаление поста, который не следует удалять. Как быть в такой ситуации?

почитай про asegi - это приблуда на спринг для аутентификации, 
ну или более простой вариант повесить фильтр на урл доступ к которому имеют только одмины

Добавлено через 5 минут
фильтр проверяет залогинен ли пользователь если нет то редиректит запрос на страницу с логином


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
garbuz
Дата 13.5.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



Цитата(goodday1941 @  13.5.2009,  19:19 Найти цитируемый пост)
так же можно явно указывать какой урл соответствует какому методу, думаб в вашей книге это есть ) если конечно ваша книга называется Spring in Action )

А можно примерчик, если есть конечно. Книга Spring in Action, но первое издание. Посмотрел во втором, там про Multiaction не написано вообще, точнее написано, а примера нет.
PM MAIL   Вверх
garbuz
Дата 13.5.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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, который, как я понял, биндит урл на конкретный метод. 
Там же в обоих примерах упоминается некий делегат, которому, как я понял, мы можем делегировать нек методы. Вопрос для чего? Не проще ли все объявленные методы в контроллере реализовать? Зачем еще делегат?

Короче вот как-то так, жду ответов smile Заранее спасибо!  smile 

PM MAIL   Вверх
_and
Дата 14.5.2009, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-developer
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 6.8.2004
Где: Новокузнецк

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



garbuz, советую посмотреть на сэмплы спринга типа jpetstore и остальные(обычно лежат в архиве спринга) половина вопросов отпадут сами собой

Цитата(garbuz @  14.5.2009,  03:33 Найти цитируемый пост)
3) CreatePostController ext SimpleFormController - создает и редактирует пост, так как там тоже все на формах. А возможно в этом контроллере проводит вякую валидацию и создание объекта, а потом с этим объектом редиректиться на PostController и там уже в соответствующих метода записывать объект в базу? Или так не стоит делать?

этого точно не стоит делать, каждое действие должно лежать в своем классе


Цитата(garbuz @  14.5.2009,  03:33 Найти цитируемый пост)
4) CommentController ext SimpleFormController - создает новый комментарий, который приходит из формы, хотя в форме всего одно поле. (думаю что удаление и редактирование комментариев не нужно вовсе, хотя удаление может быть...)

можно добавить поля имя автора камента и мыло. Удаления камента сделаь для админа и автора поста

Цитата(garbuz @  13.5.2009,  23:40 Найти цитируемый пост)
А можно примерчик, если есть конечно. Книга Spring in Action, но первое издание. Посмотрел во втором, там про Multiaction не написано вообще, точнее написано, а примера нет.

взято из сэмпла по спрингу petclinic
Код

<!-- маппинг -->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/welcome.htm">clinicController</prop>
                <prop key="/vets.htm">clinicController</prop>
                <prop key="/owner.htm">clinicController</prop>
            </props>
        </property>
    </bean>
<!-- контроллер -->
<bean id="clinicController" class="org.springframework.samples.petclinic.web.ClinicController">
        <property name="methodNameResolver" ref="clinicControllerResolver"/>
        <property name="clinic" ref="clinic"/>
    </bean>
<!-- резолвер для мультиакшн контроллера -->
    <bean id="clinicControllerResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
        <property name="mappings">
        <props>
            <prop key="/welcome.htm">welcomeHandler</prop>
            <prop key="/vets.htm">vetsHandler</prop>
            <prop key="/owner.htm">ownerHandler</prop>
        </props>
        </property>
    </bean>

PM MAIL ICQ Jabber   Вверх
goodday1941
Дата 14.5.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(garbuz @  13.5.2009,  23:33 Найти цитируемый пост)
Нашел в оф доках  ParameterMethodNameResolver, который выбирает метод в зависимости от значения указанного параметра, например action=create, action=edit.

этого лучше не использовать.. нужно ж и про SEO думать, а поисковикам урлы с параметрами не нравятся

Цитата(garbuz @  13.5.2009,  23:33 Найти цитируемый пост)
3) CreatePostController ext SimpleFormController - создает и редактирует пост, так как там тоже все на формах. А возможно в этом контроллере проводит вякую валидацию и создание объекта, а потом с этим объектом редиректиться на PostController и там уже в соответствующих метода записывать объект в базу? Или так не стоит делать?

валидацью можно проводить и в этом классе но лучше написать отдельный класс валидатор.. в интернете примеров валом есть как это делается
создание объекта - что имеется ввиду?


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
garbuz
Дата 14.5.2009, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 8
Всего: 11



Цитата(goodday1941 @  14.5.2009,  11:07 Найти цитируемый пост)

этого лучше не использовать.. нужно ж и про SEO думать, а поисковикам урлы с параметрами не нравятся

Значит лучше использовать PropertiesMethodNameResolver?

Со всем остальным пока буду разбираться.
PM MAIL   Вверх
goodday1941
Дата 14.5.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(garbuz @  14.5.2009,  11:51 Найти цитируемый пост)

Значит лучше использовать PropertiesMethodNameResolver?

я использую SimpleUrlHandlerMapping и не указую резолвера когда создаю спринг бины

тогда например название метода в MultiactionController'е будет соответствовать урлу, а для остальных что пропишем при маппинге то и получим

но это дело вкуса многие прописывают для мультиэкшн контроллера PropertiesMethodNameResolver


--------------------
SCJP 6
PM MAIL ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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