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

Jsf 让服务器端Beanshell脚本在JavaServerFaces环境中与用户交互,jsf,ejb,beanshell,Jsf,Ejb,Beanshell,首先,我必须承认这可能是一个相当具体的问题。在JavaServerFaces应用程序中,我希望能够让服务器端运行的脚本与用户交互 ... if( inputData.equals("Something") ){ if( askUser("Question?","Some question...") ) { doSomething(); } else { doSomethingElse(); } } ... 为了

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

...

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

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

...

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

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

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


我希望我能把我的意图说清楚,你知道怎么做吗。。。提前感谢。:)

您的问题表明,不仅对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:

我认为您的答案是正确的,但有一点值得注意的是,服务器理论上可以通过反向ajax/comet问用户“问题”。在OP的例子中,这将非常尴尬,但理论上是可能的;)谢谢你的回答。即使我的第一个问题不清楚,我也很熟悉HTTP和JSF的工作原理我想你说了我所期待的。。。这很可能是不可能的@ArjanTijms我有这个想法,但是停止skcript并将答案返回到askUser中仍然存在问题。@ArjanTijms您当然是对的,但是如果您要遇到这个问题,那么您最好打开服务器和客户端之间的TCP/IP套接字,完全忘记HTTP应用程序协议。当然,这没有什么错,但此时不能使用JSF。