从 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] });
其中 successHandler
和 failureHandler
是内联定义的 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
在这个例子中,我已经使用选项 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] });
其中 successHandler
和 failureHandler
是内联定义的 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