2010-02-01 3 views
3

В моем приложении jsf у меня есть кнопка отправки почты. И каждый раз, когда он нажимал, я хочу показать сообщение, что почта была или не была отправлена.Как эмулировать поведение области запроса в компоненте области сеанса?

Это типичная функциональность запроса. Но проблема в том, что у меня есть 1 бэк-файл с сессией. И все данные находятся в этом компоненте. И метод «отправить», указанный атрибутом действия кнопки, находится в этом компоненте.

Итак, каков выход? Если я должен создать еще один компонент области приложения-запроса, то как мне обратиться к нему из моего сеансового компонента?

+0

Запрос данных принадлежит области видимости в области видимости запроса. Данные, полученные с помощью сеанса, относятся к области сеанса. Это не может быть более ясным/очевидным. Другими словами: рефакторинг. – BalusC

+0

Мне нужно отправить по почте данные из области сеанса (я не могу поместить их в область запроса). Но сообщение результата должно быть в области запроса (потому что я хочу увидеть его только один раз сразу после отправки почты). Что я могу сделать рефактору? – Roman

+0

Я понимаю, если это ** только ** обмен сообщениями, тогда вы также можете просто захватить 'FacesMessage'. См. Мой ответ. – BalusC

ответ

3

Другим подход, вы можете использовать FacesMessage здесь, которые вы добавляете в контекст с помощью FacesContext#addMessage(). FacesMessages основаны на запросах и, вероятно, больше подходят для конкретных функциональных требований, чем для некоторых пользовательских методов обмена сообщениями.

Вот пример метода боба действия:

public void sendMail() { 
    FacesMessage message; 
    try { 
     Mailer.send(from, to, subject, message); 
     message = new FacesMessage("Mail successfully sent!"); 
    } catch (MailException e) { 
     message = new FacesMessage("Sending mail failed!"); 
     logger.error("Sending mail failed!", e); // Yes, you need to know about it as well! ;) 
    } 
    FacesContext.getCurrentInstance().addMessage(null, message); 
} 

С null ClientId сообщение становится «глобальным», так что вы можете использовать следующую конструкцию для отображения только глобальных сообщений:

<h:messages globalOnly="true" /> 

Update: иметь сообщение об успешном выполнении и ошибки отображаются в другом стиле, играть с FacesMessage.Severity:

 message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Mail successfully sent!", null); 
    } catch (MailException e) { 
     message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Sending mail failed!", null); 

.. в сочетании с infoClass/infoStyle и errorClass/errorStyle в h:messages:

<h:messages globalOnly="true" infoStyle="color:green" errorStyle="color:red" /> 
+0

Я уже нашел обходное решение. У меня есть компонент области запроса-запроса, и я передаю его компоненту, связанный с сеансом, с помощью свойстваActionListener. Метод send(), связанный с запросом, в компоненте scope session-scobe. Ваше решение явно лучше, потому что мне даже сложно объяснить мою. – Roman

+0

Довольно ясно, я уже понял это, когда вы сказали propertyActionListener. – BalusC

1

Либо:

  • просто нажать на сообщение на объем запроса от метода send (через ExternalContext)
  • реорганизовать метод в запрос-области видимости бобов и ввести какую-либо информацию сеанса он нуждается (управляемая рамка компонент могут сделать это)
Смежные вопросы