2012-03-06 17 views
0

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

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

... 

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

... 

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

我曾想过使用线程和Java同步方法让脚本暂停,但EJB不允许创建线程。尽管如此,我尝试了这种方式,但由于FacesContext在用户创建的线程中不可用,所以失败了。

我希望我可以让我的意图清楚,你有任何想法如何做到这一点......在此先感谢。 :)

回答

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 Servlets你陷得深之前:http://www.mkyong.com/tutorials/jsf-2-0-tutorials/

+1

你的答案是正确的,我认为,但一个小此言服务器理论上可以通过反向ajax/comet来询问用户“问题”。这在OP的例子中会非常笨拙,但理论上可行;) – 2012-03-06 20:53:33

+0

感谢您的回答。即使在我最初的问题中不清楚,我也很熟悉HTTP和JSF的工作方式。 ;) 我想你说了我的期望......这很可能是不可能的...... @ArjanTijms我有这个想法,但仍然存在停止skript并将问题解答回askUser的问题。 – DarkLink 2012-03-07 08:53:22

+0

@ArjanTijms你当然是对的,但是如果你打算去解决这个问题,那么你可能只需要在服务器和客户端之间打开一个TCP/IP套接字,并且完全忘记HTTP应用协议。当然这没有什么问题,但是你不能在那个时候使用JSF。 – 2012-03-07 11:59:19