Использование JsonpRequestBuilder легко после того, как вы выполните анализатор Java JSON для выполнения работы сервера.
Большинство ошибок приводит к тому, что ответ сервера должен быть сделан.
Как правило, вы должны кодировать вызов функции javascript как ответ.
Код для запуска на клиенте
// invoke a JSON RPC call
//DO NOT FORGET TO CONFIGURE SERVLET ENDPOINT IN web.xml
new JsonpRequestBuilder().requestObject(
GWT.getModuleBaseURL() + "JsonRecordService?service=list"
,new AsyncCallback<JavaScriptObject>()
{
@Override
public void onFailure( Throwable caught )
{
Window.alert( caught.toString() );
}
@Override
public void onSuccess( JavaScriptObject result )
{ // you can use generics too send collections of objects
Window.alert( "JSON Data available." );
}
}
);
Я использовал класс gjon на стороне сервера, чтобы выполнить грязную работу по сериализации.
Теперь код на стороне сервера:
public class JsonRecordServiceImpl extends HttpServlet
{
@Override
public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException
{
try {
String serviceName = req.getParameter( "service" );
if ( serviceName == null )
{
//let request die by timeout, maybe we could inspect for a failure callback param
return;
}
//if this endpoint answer more then one service need map to a method name
//may wish use Reflection to map to a method name
if ( serviceName.equals( "list" ) ) //anwser to a list call
{
Gson g = new Gson();
// serialize it with GSONParser
//resp.setContentType( "text/javascript" );
//resp.setCharacterEncoding( "UTF-8" );
serviceName = req.getParameter( "callback" );
if ( serviceName != null ) resp.getWriter().write( serviceName + "(" );
resp.getWriter().write( g.toJson( Arrays.asList( "A", "B" ), new TypeToken<List<String>>(){}.getType() ) );
if ( serviceName != null ) resp.getWriter().write( ");" );
return;
}
}
catch ( IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}