2012-09-16 36 views
1

林集成jQuery的阿賈克斯試圖與檢票jQuery的Ajax請求相結合,但我面臨的一個小問題...當檢票

的請求工作第一次,但失敗了,第二次奇怪的行爲。 js控制檯說它是由於語法錯誤「意外標記」而發生的。用firedebug查看請求時,第一次看起來正確,但第二次看不到響應。

第一次按下按鈕同時調用「onRequest」和「neforeRender」,第二次調用只有「beforeRender」。

我不確定它的jQuery或Wicket是否認爲這裏的惡棍......「onBeforeRender」被稱爲兩個tiems的事實似乎表明請求正在通過,同時bvut「onRequest」不被稱爲第二即使firedebug確認數據發送...

任何人在這裏得到了什麼問題的線索或理論?

以下是在提交按鈕上的「onClick」事件上調用的jQuery代碼。

function getTestValue() 
{ 
var testArray = [ 1, 2, 3, 4, 5 ]; 
$.ajax({ 
    url : $('#mark').attr('json:callback.url'), 
    type : 'post', 
    cache : false, 

    data : JSON.stringify(testArray), 
    contentType : 'application/json', 
    dataType : 'json', 
    success: function(responseData) 
    { 
     var values = responseData.sumPerTimeUnit; 
     var labels = responseData.labels; 
    }, 
    error: function(XMLHttpRequest, textStatus, errorThrown) 
    { 
     alert($('#mark').attr('json:callback.url')); 
     console.log(XMLHttpRequest); 
     console.log(textStatus); 
     console.log(errorThrown); 
    }, 
}); 
} 

即使請求失敗,按鈕被按下時調用面板「onBeforeRender」。

public class AbstractJSONHandlerPanel extends Panel 
{ 
private static final long serialVersionUID = 1L; 

private AbstractJSONBehavior JSONBehavior; 

private Form mMarkUp; 

public AbstractJSONHandlerPanel(String id) 
{ 
    super(id); 

    JSONBehavior = new AbstractJSONBehavior(); 

    mMarkUp = new Form("markupid") 
    { 
     @Override 
     protected void onComponentTag(ComponentTag tag) { 
      super.onComponentTag(tag); 
      tag.put("json:callback.url", JSONBehavior.getCallbackUrl()); 
     } 
    }; 
    mMarkUp.setMarkupId("mark"); 

    add(JSONBehavior); 

    Button n = new Button("dummyButton"); 
    n.add(AttributeModifier.replace("onclick", "getTestValue();")); 

    mMarkUp.add(n); 
    add(mMarkUp); 
} 

@Override 
protected void onBeforeRender() 
{ 
    System.out.println("BEFORE RENDER"); 

    String callbackUrl = JSONBehavior.getCallbackUrl().toString(); 
    mMarkUp.add(AttributeModifier.replace("json:callback.url", callbackUrl)); 

    super.onBeforeRender(); 
} 
} 

的「onRequest」僅稱爲第一次按下該按鈕。

public class AbstractJSONBehavior extends AbstractAjaxBehavior 
{ 
private static final long serialVersionUID = 1L; 

public void onRequest() 
{ 
    System.out.println("REQUEST"); 

    RequestCycle requestCycle = RequestCycle.get(); 
    readRequestData(requestCycle); 
    writeResponseData(requestCycle); 
} 

private void readRequestData(final RequestCycle requestCycle) 
{ 
    WebRequest wr = (WebRequest) requestCycle.getRequest(); 

    HttpServletRequest hsr = (HttpServletRequest) wr.getContainerRequest(); 

    try 
    { 
     BufferedReader br = hsr.getReader(); 

     String jsonString = br.readLine(); 
     if((jsonString == null) || jsonString.isEmpty()) 
     { 
      System.out.println(" no json found"); 
     } 
     else 
     { 
      System.out.println(" json is :" + jsonString); 
     } 

     br.close(); 
    } 
    catch(IOException ex) 
    { 
     throw new RuntimeException(ex); 
    } 
} 

private void writeResponseData(RequestCycle requestCycle) 
{ 
    WebResponse wr = (WebResponse) requestCycle.getResponse(); 

    HttpServletResponse hsr = (HttpServletResponse) wr 
      .getContainerResponse(); 

    try 
    { 
     PrintWriter br = hsr.getWriter(); 

     List<Integer> data = new ArrayList<Integer>(6); 
     data.add(350); 
     data.add(421); 
     data.add(976); 
     data.add(1521); 
     data.add(432); 
     data.add(121); 

     List<String> labels = new ArrayList<String>(6); 
     labels.add("Jan"); 
     labels.add("Feb"); 
     labels.add("Mar"); 
     labels.add("Apr"); 
     labels.add("Maj"); 
     labels.add("Jun"); 

     StatisticsResponse resp = new StatisticsResponse(data, labels); 

     Gson mGsonParser = new Gson(); 
     String json = mGsonParser.toJson(resp); 

     System.out.println("RESPONSE: " + json); 

     br.write(json); 

     br.flush(); 
     br.close(); 
    } 
    catch(IOException ex) 
    { 
     throw new RuntimeException(ex); 
    } 
} 
} 
+1

如何使用jquery而不是內置的檢票器,例如從javascript調用ajax?此外,如果你升級到wicket 1.6,它將使用jquery來處理所有的ajax內容。 – drobson

+0

我是jsute,將javascript庫與wicket結合在一起進行實驗,想要測試它是否有可能通過使用jquery的manuella來完成。 – David

+0

也即時使用1.5 ...雖然形成它的外觀,我可能只是省去了一些麻煩和使用1.6,似乎它會導致更清潔的代碼。 – David

回答

0

如果您有javascript例外,我發現新的Wicket 6實現不起作用(ajax只能第一次使用)。在我的情況下,它是AutoCompleteField其中加js和它拋出:

TypeError: obj is null 
[Break On This Error] 
objonkeydown=obj.onkeydown; 

檢票口,自動完成的完整片段... JS

function initialize(){ 
var isShowing = false; 
// Remove the autocompletion menu if still present from 
// a previous call. This is required to properly register 
// the mouse event handler again (using the new stateful 'mouseactive' 
// variable which just gets created) 
var choiceDiv = document.getElementById(getMenuId()); 
if (choiceDiv !== null) { 
isShowing = choiceDiv.showingAutocomplete; 
choiceDiv.parentNode.parentNode.removeChild(choiceDiv.parentNode); 
} 
var obj = Wicket.$(elementId); 
initialElement = obj; 
objonkeydown=obj.onkeydown; 

我只是刪除它和它的作品現在