Позвольте серверному сценарию Beanshell взаимодействовать с пользователем в среде JavaServer Faces - PullRequest
0 голосов
/ 06 марта 2012

сначала я должен признать, что это может быть довольно специфической проблемой.В приложении JavaServer Faces я хочу, чтобы скрипт, выполняемый на стороне сервера, мог взаимодействовать с пользователем.

Чтобы получить больше подробностей, я приведу пример того, что я хочу сделать:В моем приложении пользователь может вводить данные, а на стороне сервера есть скрипт, который может проверять / изменять эти данные.Я не знаю точного сценария, потому что пользователь может создать собственный.В общем, пока проблем нет, но в сценарии можно взаимодействовать с пользователем в форме диалога с вопросом.В следующем примере дальнейшее выполнение скрипта зависит от ответа пользователя.

...

if( inputData.equals("Something") ){
    if( askUser("Question?","Some question...") )
    {
        doSomething();
    }
    else
    {
        doSomethingElse();
    }
}

...

Как вы видите, метод "askUser" должен дождаться результата, прежде чем скрипт сможет продолжить.Сам сценарий является сценарием Beanshell, а метод askUser является Java-методом, который вызывается интерпретатором Beanshell.

Я хотел использовать потоки и методы синхронизации Java, чтобы позволить сценарию остановиться,но создание потока не разрешено EJB.Тем не менее я пытался таким образом, но это не удалось из-за того, что FacesContext недоступен в созданных пользователем потоках.

Я надеюсь, что смогу прояснить свое намерение, и у вас есть идеи, как это можно сделать ... Спасибозаблаговременно.:)

1 Ответ

1 голос
/ 06 марта 2012

Ваш вопрос демонстрирует полное недопонимание того, как работает не только технология JSF, но и природа HTTP-коммуникаций и веб-серверов, присущая без сохранения состояния.

Как правило, в настольном приложении этот простой алгоритм, который вы перечислили выше, может бытьлегко реализуется, возможно, с помощью модальных диалогов и событий.Веб-приложения не работают таким образом, потому что они изначально не имеют состояния.Пользователь или агент браузера отправляет HTTP-запрос веб-серверу, сервер обрабатывает этот запрос и формулирует ответ, а затем возвращает этот HTTP-ответ обратно агенту браузера, который будет обработан.Обычно эти данные могут быть текстовыми, HTML, XML, Javascript, CSS, изображениями или даже файлом.

Проблема с включенным выше алгоритмом на сервере состоит в том, что функциональность для askUser не может быть выполненасервер, потому что сервер не может просто задать пользователю вопрос и ждать ответа.Это было бы задом наперед.Пользователь является клиентом и задает вопросы серверу.

Так как же решить эту распространенную проблему в веб-приложении?В JSF сервер может отправить в ответ Javascript в браузер, который позволит браузеру задать вопрос, затем, когда пользователь делает выбор, Javascript может затем отправить выбор пользователя обратно на сервер в HTTPзапрос.Если этот выбор предполагает какие-либо изменения в DOM или элементах страницы, тогда эта информация будет отправлена ​​в ответе.

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

Хороший учебник по технологии JSF можно найти здесь, однако я рекомендую статьпрежде чем углубляться в подробности, ознакомьтесь с HTTP и Java-сервлетами: http://www.mkyong.com/tutorials/jsf-2-0-tutorials/

...