2012-03-06 1 views
0

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

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

... 

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

... 

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

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

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

ответ

1

Ваш вопрос демонстрирует полное непонимание того, как работает не только технология 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/

+1

Ваш ответ правильный, я думаю, но одно маленькое замечание что сервер теоретически может задать пользователю «вопросы» с помощью обратного ajax/кометы.Это было бы очень неудобно работать на примере OP, но это теоретически возможно;) –

+0

Спасибо за ваш ответ. Даже если это не ясно в моем первоначальном вопросе, я знаком с работой HTTP и JSF. ;) И я думаю, вы сказали, чего я ожидал ... Скорее всего, это невозможно ... @ArjanTijms У меня была эта идея, но тогда есть проблема с остановкой skript и возвратом ответа в askUser. – DarkLink

+0

@ArjanTijms Вы, конечно, правы, но если вы собираетесь пойти на эту проблему, вы можете просто открыть TCP/IP-сокет между сервером и клиентом и полностью забыть протокол HTTP-приложений. Конечно, нет ничего плохого в этом, но вы не можете использовать JSF в этот момент. –