2

我在托管 bean 方法中使用了 RequestContext 的 primeFaces 对象,以便从服务器端执行一些 javascript。我曾经在一个 Listener 处理程序方法(一个使用 AjaxBehaviourEvent 参数处理来自f:ajax标签的请求的方法)中执行此操作,它可以工作,但这次我使用了一个没有任何参数的方法。

问题是我用 jquery .append() 附加了一些 html 并且必须使用 jquery ajax 从添加的元素向服务器发送请求(我不能附加任何 jsf 组件,因为它们不会工作,因为它们不是由 jsf 生成的本身)所以我不得不使用不带参数的 bean 方法,并从处理 ajax comming resquests 的 servlet 调用该方法。

为了更详细地解释这一点,假设我以这种方式使用 jquery 添加 html 代码:

$('#substartmenudiv').append('<div id="congesdiv" />');

然后添加单击新添加的 div 后必须执行的代码:

$('#congesdiv').click(function(){
 $.post('AjaxRelaisServlet',{action:"setstrtmenustatus",startmenuisopen:startmenuisopen});
});

并从 servlet 我捕获 ajax 请求发送的参数并调用 bean 方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


boolean startmenuisopen= Boolean.valueOf(request.getParameter("startmenuisopen"));

        UserBean.testcmdlink(startmenuisopen);

被调用的 testcmdlink bean 方法包含 RequestContext 对象,它看起来像这样:

public static void testcmdlink(boolean startmenuisopen){        

        RequestContext context = RequestContext.getCurrentInstance();
        if(!startmenuisopen){
        context.execute("$('#substartmenudiv').append('<div id="+"gestprofdiv"+" />');");
        context.execute("displaymenuitems();");
        context.execute("console.log('more elements are appended !!');");
        startmenuisopen=true;

        }else{
            context.execute("$('#substartmenudiv').empty();");
            context.execute("window['bottomvalue'] =30;");
            context.execute("console.log('start menu div is emptied !!');");
            startmenuisopen=false;
        }

    }

有没有办法让它在任何地方工作?

干杯!

4

2 回答 2

2

你不能那样做。在引擎盖下,RequestContext依赖于FacesContext对象。此对象在 JSF 生命周期处理之外不可用

可以通过找到一种方法在适当的 JSF 请求期间将Constants.REQUEST_CONTEXT_ATTR对象填充到一般对象ServletContext中,然后在 servlet 中检索对象来欺骗这一点。我将基于RequestContext.getCurrentInstance()PF 源中的实现进行这种信念的飞跃

public static RequestContext getCurrentInstance(){
 return (RequestContext)FacesContext.getCurrentInstance().getAttributes().get(Constants.REQUEST_CONTEXT_ATTR);
} 
于 2013-03-29T16:48:07.880 回答
0

你可以在你的问题中找到答案。我假设您有一个侦听器处理程序方法,它侦听请求并使用参数处理它们。因此,您需要传递一些参数,或者您需要创建一个不接受任何参数的新方法来处理您的请求。当没有参数时,它会抛出 NullPointerException。

希望能帮助到你!!!

于 2013-03-29T11:58:36.420 回答