1

jQuery ajaxリクエストをWicketと組み合わせようとしていますが、小さな問題に直面しています...

リクエストは最初は機能しますが、2回目は失敗します。jsコンソールは、構文エラー「予期しないトークン」が原因で発生すると表示します。firedebugでリクエストを見ると、最初は正しいように見えますが、2回目は応答がありません。

初めてボタンを押すと「onRequest」と「neforeRender」の両方が呼び出され、2回目は「beforeRender」のみが呼び出されます。

そのjQueryまたはWicketがここで悪役であるかどうかはわかりません...「onBeforeRender」が両方のtiemsと呼ばれるという事実は、リクエストが通過していることを示しているようですが、同時に「on​​Request」はfiredebugにもかかわらず2回目に呼び出されませんデータが送信されたことを確認します...

ここの誰かが問題が何であるかについての手がかりまたは理論を手に入れましたか?

以下は、送信ボタンの「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);
    }
}
}
4

1 に答える 1

0

javascriptの例外がある場合、新しいWicket 6の実装は機能しない(ajaxは初めて機能する)ことがわかりました。私の場合、jsを追加したのはAutoCompleteFieldで、次のようにスローされます。

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; 

削除するだけで動作します

于 2013-01-10T16:38:13.390 に答える