0

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

为了给你更多的细节,我给你一个我想做的例子:在我的应用程序中,用户可以输入数据,而在服务器端有一个脚本可以检查/修改这些数据。我不知道确切的脚本,因为用户可以制作自定义脚本。总而言之到目前为止没有问题,但是在脚本中可以通过问题对话的方式与用户进行交互。在以下示例中,进一步的脚本执行取决于用户的回答。

...

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

...

如您所见,“askUser”方法必须等待结果才能继续脚本。脚本本身是一个 Beanshell 脚本,“askUser”方法是一个 Java 方法,由 Beanshell 解释器调用。

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

我希望我能清楚地表达我的意图,并且您知道如何做到这一点...在此先感谢。:)

4

1 回答 1

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/

于 2012-03-06T12:58:49.483 回答