让服务器端Beanshell脚本在JavaServer Faces环境中与用户交互

时间:2012-03-06 09:51:04

标签: jsf ejb beanshell

首先,我必须承认这可能是一个非常具体的问题。在JavaServer Faces应用程序中,我希望能够让在服务器端运行的脚本与用户进行交互。

为了向您提供更多详细信息,我举例说明了我想要做的事情: 在我的应用程序中,用户可以输入数据,在服务器端有一个可以检查/修改此数据的脚本。我不知道确切的脚本,因为用户可以自定义脚本。总而言之,目前没有任何问题,但在脚本中,可以通过问题对话框与用户进行交互。在以下示例中,进一步的脚本执行取决于用户的答案。

...

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

...

正如您所看到的,“askUser”方法必须在脚本可以继续之前等待结果。脚本本身是Beanshell脚本,方法“askUser”是由Beanshell解释器调用的Java方法。

我在脑海中使用线程和Java同步方法让脚本暂停,但EJB不允许创建线程。我仍然尝试过这种方式,但由于FacesContext在用户创建的线程中不可用,它失败了。

我希望我可以明确表达我的意图,你知道如何做到这一点......提前谢谢。 :)

1 个答案:

答案 0 :(得分:1)

您的问题表明完全误解了JSF技术的工作原理,以及HTTP通信和Web服务器固有的无状态特性。

通常在基于桌面的应用程序中,您可以轻松实现上面列出的这种简单算法,可能包含模态对话框和事件。 Web应用程序不能以这种方式工作,因为它们本身就是无状态的。用户或浏览器代理向Web服务器发出HTTP请求,服务器处理此请求并制定响应,然后将该HTTP响应返回给要呈现的浏览器代理。通常,这些数据可以是文本,HTML,XML,Javascript,CSS,图像甚至文件。

将上述算法合并到服务器上的问题是服务器无法完成askUser的功能,因为服务器不能只询问用户问题并等待响应。这将是倒退。用户是客户端并询问服务器的问题。

那么在Web应用程序中如何解决这个常见问题呢?在JSF中,服务器可以将Javascript作为响应发送到浏览器,允许浏览器提出问题,然后当用户做出选择时,Javascript可以在HTTP中将用户的选择发回服务器。请求。如果该选择涉及对DOM或页面元素的任何更改,那么该信息将在响应中发送。

JSF通过允许将桌面和事件驱动功能的幻觉赋予其他无状态技术来弥补桌面和Web应用程序之间的差距,并通过在服务器端具有事件生命周期并使用Ajax严格控制对文档的更改来实现此目的元件。

可以在这里找到关于JSF技术的优秀教程,但是我建议您在深入研究之前更熟悉HTTP和Java Servlet:http://www.mkyong.com/tutorials/jsf-2-0-tutorials/