Использование Wicket AbstractAjaxBehavior с jQuery.ajax () - PullRequest
7 голосов
/ 12 февраля 2011

Я использовал вызов JQuery AJax для отправки JSON, как описано здесь в StackOverflow

Проблема в том, что я не получаю никаких данных на сервере.Я вижу, что вызов достиг целевого поведения ajax - но в методе onRequest (), RequestCycle dd не содержит никаких параметров

Мой код Wicket:

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

Мой Javascript, которыйвызывает этот метод

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

            });

С моей консоли Firebug я вижу, что JSON POST был успешно выполнен, и срабатывает предупреждение («завершено, да ладно!»).

Проблема в том, что в Wicket AbstractAjaxBehavior не удается найти какие-либо параметры в RequestCycle.

Есть что-то, что мне не хватает?Самое смешное, что я запустил этот отладчик, так как я не смог найти ни одного параметра.Это похоже на проблему кодировки.

Из Firebug я мог видеть, что это был вызов, который был сделан

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=

Каким-то образом эти параметры не добавляются в RequestCycle.Это похоже на проблему кодона.Есть идеи?

Ответы [ 2 ]

5 голосов
/ 12 февраля 2011

хорошо, я нашел решение: ключами было не использовать requestCycle.getRequest (). GetParameterMap () для чтения JSON из браузера.Вместо этого читайте данные непосредственно из входного потока сервлета, как показано ниже: Это работает.

            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));
        }
1 голос
/ 09 июня 2016

Другим возможным решением в калитке 6 и (может быть, в калитке 5, если вы используете wicketAjaxPost вместо Wicket.Ajax.Post), было бы использовать библиотеку JavaScript браузера Wicket Ajax таким образом, что вы можете использовать стандартную requestCycle.getRequest () .getParameterMap () вызывает ваше поведение.

Вы можете найти информацию об этом здесь:

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

Например, вместо:

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

            });

Вы можете использовать:

   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]
   });
...