2011-02-12 20 views
7

He utilizado la llamada jQuery AJAX para enviar JSON como se documenta aquí en StackOverflowWicket AbstractAjaxBehavior con jQuery.ajax()

El problema es que no estoy reciba datos en el servidor. Puedo ver que la llamada hizo llegar el comportamiento ajax objetivo - pero en onRequest() método, el RequestCycle no dd contener ningún parámetro

Mi Código de garaje: Gracias

 AbstractAjaxBehavior ajaxSaveBehaviour = new AbstractAjaxBehavior(){ 
     private static final long serialVersionUID = 1L; 

     @SuppressWarnings("unchecked") 
     public void onRequest() 
     { 
      //get parameters 
      final RequestCycle requestCycle = RequestCycle.get(); 



      final PageParameters pageParameters = new PageParameters(requestCycle.getRequest().getParameterMap()); 
      logger.info(" I have received something 1"); 

      for(String pkey: requestCycle.getRequest().getParameterMap().keySet()){ 
       String[] valArry= requestCycle.getRequest().getParameterMap().get(pkey); 
       StringBuffer sb = new StringBuffer(); 
       for(String s: valArry) sb.append(s).append(" , "); 
       logger.info("pk :"+ pkey + " = "+ sb.toString()); 
      } 

      //do something using nice json library to produce a string of json 

      logger.info(" I have received something 2"); 
      for(String key: pageParameters.keySet()){ 
       Object o= pageParameters.get(key); 
       logger.info("received key : "+ key + " = " +o.toString());      
      } 





      String data="ok";   

      requestCycle.setRequestTarget(new StringRequestTarget("application/json", "utf-8", data)); 
     } 


    }; 
    add(ajaxSaveBehaviour); 
    String callBackURL= ajaxSaveBehaviour.getCallbackUrl().toString(); 

Mi Javascript que invoca este método

console.log(" call back url :"+ callBackURL); 
      $.ajax({ 
       url: callBackURL, 
       type: 'post', 
       cache: false, 

       data:JSON.stringify(ccbArry[0]), 
       contentType: 'application/json', 
       dataType: 'json', 
       complete: function() { 
         alert(" completed okey dokey!") 
       } 

      }); 

Desde mi consola Firebug, puedo ver que el JSON POST se realizó con éxito y la alerta ("dokey completado okey dokey!") Se desencadenó.

El problema es que en Wicket AbstractAjaxBehavior no puede encontrar ningún parámetro en RequestCycle.

¿Hay algo que me falta? Lo curioso es que ejecuté esto es depurador, ya que no pude encontrar ningún parámetro. Esto parece un problema de codificación.

De Firebug, pude ver que se trataba de la llamada que se hizo

http://localhost:8080/mywebapp-web-1.0-SNAPSHOT/?wicket:interface=:0::IActivePageBehaviorListener:0:&wicket:ignoreIfNotActive=true&%7B%22type%22%3A9504%2C%22sourceNewsClipBean%22%3A%7B%22type%22%3A9503%2C%22id%22%3A%224cf05752acc1d6aebface86d%22%2C%22typeString%22%3A%22NEWSCLIP_TYPE%22%7D%2C%22startOffset%22%3A%22195%22%2C%22clipDuration%22%3A%22297%22%7D= 

De alguna manera, estos parámetros no apperd en el RequestCycle. Parece un problema de encodong. Algunas ideas ?

+0

relacionadas: http: // stackoverflow .com/questions/5212537/implementation-javascript-events-to-wicket – RMorrisey

Respuesta

5

ok Encontré la solución: Las claves eran no usar requestCycle.getRequest(). GetParameterMap() para leer el JSON desde el navegador. En su lugar, lea los datos directamente desde la secuencia de entrada del servlet como se indica a continuación: Funciona.

  public void onRequest() 
     { 
      //get parameters 
      final RequestCycle requestCycle = RequestCycle.get(); 


      WebRequest wr=(WebRequest)requestCycle.getRequest(); 

      HttpServletRequest hsr= wr.getHttpServletRequest() ; 

      try { 
       BufferedReader br = hsr.getReader(); 

         String jsonString = br.readLine(); 
         if((jsonString==null) || jsonString.isEmpty()){ 
          logger.error(" no json found"); 
         } 
         else { 
          logger.info(" json is :"+ jsonString); 
         } 



      } catch (IOException ex) { 
       logger.error(ex); 
      } 


      // json string to retir to the jQuery onSuccess function 
      String data=getReturnJSONValue(); 

      logger.info("returning json :"+ data); 
      IRequestTarget t = new StringRequestTarget("application/json", "UTF-8", data); 
      getRequestCycle().setRequestTarget(t); 


      //requestCycle.setRequestTarget(new StringRequestTarget("application/json", "utf-8", data)); 
     } 
+0

Esta solución casi funcionó para mí, pero tuve que cambiarla un poco para Wicket 1.5.2. Aquí hay una descripción detallada de lo que hice: http://davidtanzer.net/jquery_wicket –

1

Otra posible solución en la ventanilla 6 y (tal vez en portillo 5 si se utiliza en lugar de wicketAjaxPost Wicket.Ajax.Post), sería el uso de la ventanilla del navegador Ajax librería javascript esa manera se puede utilizar el estándar requestCycle .getRequest(). getParameterMap() llama en su comportamiento.

Puede encontrar información sobre esto aquí:

https://cwiki.apache.org/confluence/display/WICKET/Wicket+Ajax

Por ejemplo en lugar de:

console.log(" call back url :"+ callBackURL); 
      $.ajax({ 
       url: callBackURL, 
       type: 'post', 
       cache: false, 

       data:JSON.stringify(ccbArry[0]), 
       contentType: 'application/json', 
       dataType: 'json', 
       complete: function() { 
         alert(" completed okey dokey!") 
       } 

      }); 

que puede usar:

var success = function() {alert('success!!!')}; 
    var failure = function() {alert('failure:-(')}; 
    // ${callbackUrl} is put in through interpolation in the renderHead of the AbstractAjaxBehavior 
    // TextTemplate interpolater = new PackageTextTemplate(ContentTools.class, "PackageInit.js"); 

    // Map<String, String> variables = new HashMap<String, String>(); 
    // variables.put("callbackUrl", getCallbackUrl()); 
    // interpolater.interpolate(variables); 

    var callbackUrl = '${callbackUrl}'; 
    var dataMap = {'name' : 'Mr Blogs', 'description' : 'a long description'}; 
    Wicket.Ajax.post({'u': callbackUrl, 
     'ep': dataMap, 
     'sh': [success], 
     'fh': [failure] 
    });