![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Ovsyanka |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 29.10.2008 Репутация: нет Всего: нет |
Здравствуйте. Я совсем недавно начал работать с JSF и зачастую программа работает не так, как я планировал, а почему она работает именно так я понять не могу)
Я сначала коротко опишу задачу и что я сделал: Мне нужно сделать чат с использованием модального окна. Есть некоторая страничка. Я добавил ссылку, которая показывает модальное окно. В нем есть таблица, в которой будут показываться входящие сообщения, поле для написания текста сообщения, поле для ввода имени(для кого сообщение), кнопка закрытия и кнопка отправки сообщения. Я хочу написать так, чтобы процесс происходил в следующем порядке: 1. Загружается вся форма, включая модальное окно(оно просто не отображается). 2. При нажатии на ссылку, ничего никуда не отправляется, просто показывается модальное окно. 3. При нажатии на кнопку отправить, должен считаться текст(и обнулиться) и имя, затем вызваться chat.sendMessage(ф-я отправки сообщения). А потом обновиться уже таблица с новыми сообщениями. Вот с третим пунктом у меня проблемы: все время получается, что у меня вызывается ф-я getNewMessages до sendMessages... Я пробовал добавить аттрибуты immediate, ajaxSingle, bypassUpdates, но все равно getNewMessages вызывается... У меня есть книга по Java Server Faces и я пытался найти ответ в ней, но, видимо пока я не в силах понять правильно то, что там написано )) Вот исходные коды: .xhtml
Chat.java
ChatMessages.java
TMessage.java
Буду благодарен, если кто-то объяснит почему так может происходить или подскажет как иначе мне это реализовать. Извините, если я что-то сказать забыл, я практически не писал на форумах раньше. Спасибо) Это сообщение отредактировал(а) Ovsyanka - 30.10.2008, 14:36 |
||||||||
|
|||||||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
это знакомая до боли проблема обновления дерева копнонент.
Могу посоветовать так: у тебя выставление листа в таблице идет через value="#{getsomelist}" а попробуй в методе doMessage находить таблицу по ID и напрямую писать туда свой лист. Недостатки - ты не сможешь выбрать через JSF запись в таблице напрямую (не используя извр методы). либо же забей на что метод getNew... вызывается 2 раза - первый во время востановления view, второй во время рендеринга. Просто в нем не делай никакой работы по обновлению листа, а всю работу переложи на метод doMessages, например:
-------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
| Ovsyanka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 29.10.2008 Репутация: нет Всего: нет |
Второй способ у меня вопросов не вызывает, а в первом, я так понимаю находить надо с помощью FacesContext.getCurrentInstance().дальше_не_помню, а потом с помощью UIComponent создавать таблицу?
Спасибо за варианты решения, но я хотел бы еще узнать почему происходит именно так... Или это ошибка и так не должно быть? А sendMessage вы переименовали в doMessage потому, чтчо считаете, что это более подходящее название этой ф-и?) |
|||
|
||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
>А sendMessage вы переименовали в doMessage потому, чтчо считаете, что это более подходящее название этой ф-и?)
не знаю почему ... так... подумалось. =) вот ссылка http://www.ibm.com/developerworks/library/j-jsf2/ если своими словами: после нажатия кнопки субмит, JSF востанавливает дерево компонент , т.е. у каждого компонента вызывает метод setValue() и выставляет туда значение получившееся после выполнения тела атрибута. Это первый вызов метода. Далее происходит вызов бизнес метода. И уже на последнем этапе JSF дергает тело атирбута для получения новых данных в моделе (второй вызов метода) FacesContext.getCurrentInstance().getView().findComponent("<formid>:<componentid>").get|setValue учти при вызове getValue у найденого компонента будет выполнено тело атрибута у соотв. тэга. >потом с помощью UIComponent создавать таблицу нет необходимости, таблица уже пристуствует на view нужно просто получить к ней доступ и записать туда свой лист. так же можно инициализировать значения в момент получения компонента (см. биндинг компонент), но данный метод имеет кучу недостатков ИМХО, в том числе завязывает логику с представлением и реализацией JSF. -------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
| Ovsyanka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 29.10.2008 Репутация: нет Всего: нет |
Спасибо) только вот у меня же указан аттрибут type="button", читая книгу, я так понял, что в таком случае форма отправляться не должна...
|
|||
|
||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
этот аттрибут type ты где собрался указывать? в тэге input? =) в JSF компонентах нет такого тэга =) есть только:
h:commandButton h:commandLink форма может быть отправлена и по событию из JS -------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
| Ovsyanka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 29.10.2008 Репутация: нет Всего: нет |
Ну так он у меня указан в a4j:CommandButton (см. .xhtml 32,33 строки)
|
|||
|
||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
ты наверное попутал =) с вот этим:
immediate="true" но сути проблемы это не отменяет. дерево компонент все равно будет инициализироватся а потмо еще рендерится, т.е. вызов будет 2 раза (ИМХО) -------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
| Ovsyanka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 29.10.2008 Репутация: нет Всего: нет |
Ну как так перепутал? ))
Вот у меня здесь type="button" указан... |
|||
|
||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
immediate
True means, that the default ActionListener should be executed immediately (i.e. during Apply Request Values phase of the request processing lifecycle), rather than waiting until the Invoke Application phase type This attribute specifies a type of control to create. The possible values are "submit", "reset", "image" and "button". The default value for this attribute is "submit" http://www.jboss.org/file-access/default/m...l#commandButton нигде в документации не сказано что type влияет на отправку запроса. Он влияет лишь на тип элемента. Так как submit - заставляет браузер посылать запрос. А button нет, но это не относится к commandButton, он посылает запрос при помощи JS. Зачем нужен тип(type)? ну например для CSS или для каких то действий через JS. например тэг <a4j:commandButton image=""/> переключит в type="image" но ведь из за этого оно не перестанет посылать запросы на сервер =) Это сообщение отредактировал(а) necromancer - 5.11.2008, 12:52 -------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
| Ovsyanka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 29.10.2008 Репутация: нет Всего: нет |
Ага, я понял так:
Не важно какого типа кнопка, она всегда посылает запрос на сервер. то есть получается, что нельзя сделать кнопку, которая не посылала бы запрос... Тогда в моем случае, кроме тех вариантов, что ты предложил можно использовать ссылку(CommandLink можно?) А про type="button" я в книжке прочитал... видимо, не так понял. Это сообщение отредактировал(а) Ovsyanka - 5.11.2008, 14:25 |
|||
|
||||
| necromancer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 317 Регистрация: 26.7.2006 Где: Москва Репутация: 6 Всего: 7 |
можно:
1. не использовать commandButton 2. использовать commandButton без указания action и eventListener (не уверен что это возможно) 3. Использовать на форме простые html тэги 4. Использовать <h:graphicImage onClick=... 5. написать PhaseListener который бы сбрасывал запрос 6. написать Filter 7. не использовать JSF совсем =) ну и 8 пункт ты сам придумаешь ;-) если вопрос разрешен, ставь галочку а мне поднимай репутацию =) ЙОХА! -------------------- С уважением, Виталий Смык ---------------------------------------------------------------------------------------------- SCJP, SCWCD, OCA http://dev.maryno.net/video/ |
|||
|
||||
| Ovsyanka |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 29.10.2008 Репутация: нет Всего: нет |
Да, похоже, что решен.
Основное, что я хотел узнать, это почему у меня отправляется форма. Я узнал - потому, что commandButton всегда ее отправляет вне зависимости от type. Кроме этого тут написалось еще несколько полезных мыслей) Спасибо за помощь, тему закрываю. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |