Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Wicket AbstractAjaxBehavior with jQuery.ajax()

Tags:

jquery

wicket

I have used the jQuery AJax call to send JSON as documented here in StackOverflow

The problem is that I am not receiving any Data on the server . I can see that the call did reach the target ajax behavior -- but in onRequest() method , the RequestCycle dd not contain any parameters

My Wicket Code:

        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();

My Javascript that invokes this method

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!")
                }

            });

From my Firebug console, I can see that the JSON POST was made succesfully and the alert(" completed okey dokey!") dos get triggered.

The problem is that on the Wicket AbstractAjaxBehavior is unable to find any parameters in the RequestCycle.

Is there something I am missing ? The funny thing is that I ran this is debugger asn I could not find any parameter. This looks like an encoding issue.

From Firebug, I could see that this was the call that was made

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=

Somehow , these parameters do not apperd in the RequestCycle. It looks like an encodong issue . Any ideas ?

like image 519
user193116 Avatar asked Feb 12 '11 04:02

user193116


2 Answers

ok I found the solution : The keys was to not use requestCycle.getRequest().getParameterMap() to read the JSON from the browser. Instead read the data directly from the servlet input stream as below: It works .

            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));
        }
like image 162
user193116 Avatar answered Nov 24 '22 16:11

user193116


Another possible solution in wicket 6 and (maybe in wicket 5 if you use wicketAjaxPost instead of Wicket.Ajax.Post), would be to use the Wicket Ajax browser javascript library that way you can use the standard requestCycle.getRequest().getParameterMap() calls in your behavior.

You can find information about this here:

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

For example instead of:

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!")
                }

            });

You could use:

   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]
   });
like image 23
Simon B Avatar answered Nov 24 '22 17:11

Simon B