从 Javascript 和 return 值调用 Wicket 6 代码

Call Wicket 6 Code from Javascript and return value

在这个例子中,我已经使用选项 A 从 Java 脚本调用了我的 Wicket 6 Java 代码:

但是,我无法找到 return 将数据从 Java 端返回到 JavaScript 的示例(生成的 JavaScript 回调函数甚至不包括 return 语句)。如何实现?

编辑:我没有尝试在 Java 中设置属性,正如我已经解释过的,从 JavaScript 调用 Wicket 不是这里的问题。作为 Ajax 请求.

的结果,我正在尝试 return 从 Wicket 返回浏览器的 JSON 对象

Edit2:按照 martin-g 的示例,我拼凑了这个工作示例...

Java

public class MyAjaxBehaviour extends AbstractDefaultAjaxBehavior {

    @Override
    protected void onComponentTag(ComponentTag tag) {
        super.onComponentTag(tag);
        tag.put("aprachatcallbackurl", getCallbackUrl());
    }

    @Override
    protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
        super.updateAjaxAttributes(attributes);
        attributes.setDataType("json");
        attributes.setWicketAjaxResponse(false);
    }

    @Override
    protected void respond(AjaxRequestTarget target) {
        getComponent().getRequestCycle().replaceAllRequestHandlers(
            new TextRequestHandler("application/json", "UTF-8", "{...JSON GOES HERE...}));
    }
}

Java脚本

var mySuccessCallback = function(param1, param2, data, statusText) {
    // Data contains the parsed JSON object from MyAjaxBehaviour.respond(...)
    ...
}

var myFailureCallback = function() {
    ...
}

Wicket.Ajax.get({
    "u": callbackUrl,
    "dt": "json",
    "wr": false,
    "sh": [mySuccessCallback],
    "fh": [myFailureCallback]
});

主要问题是 Wicket 7 参考错误地指示在 Java 脚本调用中使用 "wr" 而不是 "dt"。 :)

我想你可以用更简单的方法来做!

Wicket Ajax API 只是:Wicket.Ajax.ajax({...})。您需要在服务器端准备的只是保存回调url,例如通过将其全局保存在 window 对象或 HTML 元素的属性中 (data-the-url).

public class CallFromJavascriptBehavior extends AbstractDefaultAjaxBehavior {
   @Override
   protected void respond(AjaxRequestTarget target) {
      final StringValue parameterValue = RequestCycle.get().getRequest().getQueryParameters().getParameterValue("yourName");
      System.out.println(String.format("Hello %s", parameterValue.toString()));

      // write anything to the WebResponse and then consume it in the JS success handler. See below
   }

   @Override
   public void onComponenntTag(ComponenntTag tag, Component component) {
       super.onComponenntTag(tag, component);
       tag.put("data-the-url", getCallbackUrl());
   }
}

然后在你的 JS 代码中你可以这样做:

var callbackUrl = jQuery("#theElementId").data("the-url");
Wicket.Ajax.get({"u": callbackUrl, "sh":[successHandler], "fh": [failureHandler] });

其中 successHandlerfailureHandler 是内联定义的 JS 函数(例如 function(...) {})或其他地方。

您可以在以下位置找到更多文档: https://ci.apache.org/projects/wicket/guide/7.x/single.html#_ajax_request_attributes_and_call_listeners

一篇带有完整示例的博客文章 http://wicketinaction.com/2012/07/wicket-6-javascript-improvements/

您可以只编写一个资源并挂载它,然后用您最喜欢的 Ajax-方法获取它。

例如:

public class MyResource extends AbstractResource
    @Override
    protected ResourceResponse newResourceResponse( Attributes attributes )
    {

        ResourceResponse resourceResponse = new ResourceResponse();
        resourceResponse.setContentType( "text/json" );
        resourceResponse.setTextEncoding( "utf-8" );

        HttpServletRequest request = (HttpServletRequest) attributes.getRequest().getContainerRequest();

        try
        {
            this.json = IOUtils.toString( request.getInputStream() );
        }
        catch ( IOException e )
        {
            e.printStackTrace();
        }

        resourceResponse.setWriteCallback( new WriteCallback()
        {
            @Override
            public void writeData( Attributes attributes ) throws IOException
            {
                OutputStream outputStream = attributes.getResponse().getOutputStream();
                Writer writer = new OutputStreamWriter( outputStream );


                writer.write( MyResource.this.json );
                writer.close();
            }
        } );

        return resourceResponse;
    }

(从我这里的其他回答中复制 )

安装它请看这里: https://dzone.com/articles/how-implement-rss-feeds-custom