2011-02-12 19 views
7

मैं jQuery अजाक्स कॉल का इस्तेमाल किया है के रूप में StackOverflowjQuery.ajax साथ विकेट AbstractAjaxBehavior()

में यहाँ प्रलेखित समस्या JSON भेजने के लिए उपयोग करना है कि मैं सर्वर पर किसी भी डेटा प्राप्त नहीं कर रहा हूँ। मैं देख सकता हूँ कि कॉल लक्ष्य ajax व्यवहार तक पहुँचने के लिए किया था - लेकिन onRequest में() विधि, RequestCycle कोई पैरामीटर

शामिल नहीं डीडी मेरे विकेट कोड:

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

मेरे जावास्क्रिप्ट है कि इस विधि का आह्वान

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

      }); 

मेरे फायरबग कंसोल से, मैं देख सकता हूं कि JSON पोस्ट सफलतापूर्वक बनाया गया था और अलर्ट ("ओकी डोकी पूरा हो गया!") टॉस हो गया।

समस्या यह है कि विकेट सार पर AJAXBehavior 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 में apperd नहीं है। यह एक एन्कोडोंग मुद्दा की तरह दिखता है। कोई विचार ?

+0

संबंधित: http: // stackoverflow

आप इस यहाँ के बारे में जानकारी प्राप्त कर सकते हैं .com/प्रश्न/5212537/कार्यान्वयन-जावास्क्रिप्ट-घटनाओं से विकेट – RMorrisey

उत्तर

5

ठीक है मुझे समाधान मिला: चाबियाँ का उपयोग नहीं किया गया था Cycle.getRequest()। ब्राउज़र से जेएसओएन पढ़ने के लिए getParameterMap()। बजाय नीचे दिए गए सर्वलेट इनपुट स्ट्रीम से सीधे डेटा पढ़ें: यह काम करता है।

  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

यह समाधान लगभग मेरे लिए काम करता था, लेकिन मुझे इसे विकेट 1.5.2 के लिए थोड़ा बदलना पड़ा - यहां मैंने जो किया है उसका विस्तृत विवरण यहां दिया गया है: http://davidtanzer.net/jquery_wicket –

1

विकेट 6 में एक अन्य संभावित समाधान और (शायद विकेट 5 में अगर आप Wicket.Ajax.Post के बजाय wicketAjaxPost उपयोग करें), जावास्क्रिप्ट पुस्तकालय है कि जिस तरह से आप मानक 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] 
    });