close

  一流+一流=二流。一個優秀的元件可以獨當一面,甚至包山包海,當再遇到另一個優秀的元件,雖然獨當的一面不同,但週邊的能力可能踩到對方的地盤了,這是我花兩天才找出原因的。

  jQuery使用Ajax向Server端取得JSON格式,卻老是出錯:

$(function(){
    $("#buttonID").click(function() {
        dataString = $("#formID").serialize();
        $.ajax({
            url: 'query.do',
            type: 'POST',
            data: dataString,
            dataType: 'json',
            success: function(data, status){
                alert("succ:" + status);
            },
            error: function(xhrInstance, status, xhrException) {
                alert("failure:" + status);
            }
        });
        return false;
    });
});

  最後將dataType改為text看傳回什麼,原來竟是踩到了SiteMesh的地盤了。SiteMesh是用Decorator模式為頁面做佈局管理員,PG只需專注自己頁面的開發,response後由SiteMesh打點header、footer、bar、Local的Menu Tree即可。是這個ajax接到的,並不是url(query.do)的回傳JSON,而是SiteMesh的佈局頁面,main.jsp,見下方的decorators.xml的粗體字部份。

<?xml version="1.0" encoding="ISO-8859-1"?>
<decorators defaultdir="/_decorators">
    <!-- Any urls that are excluded will never be decorated by Sitemesh -->
    <excludes>
        <pattern>/nodecorate/*</pattern>
        <pattern>/styles/*</pattern>
        <pattern>/css/*</pattern>
        <pattern>/scripts/*</pattern>
        <pattern>/images/*</pattern>
        <pattern>/dojo/*</pattern>
        <pattern>/struts/*</pattern>
        <pattern>/commons/*</pattern>
        <pattern>/js/*</pattern>
        <pattern>/js/jquery/*</pattern>
        <pattern>/js/jquery/css/*</pattern>
        <pattern>/js/jquery/images*</pattern>
        <pattern>/login.jsp</pattern>
        <pattern>/timeout.html</pattern>
        <pattern>/j_spring_security*</pattern>
        <pattern>/query.do</pattern>
    </excludes>

    <decorator name="main" page="main.jsp">
        <pattern>/*</pattern>
    </decorator>

    <decorator name="panel" page="panelDecorator.jsp"/>
</decorators>

  解法就顯而易見,在<excludes>標籤新增一個<pattern>排除於SiteMesh的裝飾之外,即上述片段程式的紅字部份。

  並附上在Struts的Action如何把內容轉成JSON傳回程式片段:

JSONArray json = JSONArray.fromObject(list);
PrintWriter out=response.getWriter();
out.println(json);
out.flush();
return null;

  list變數內含JavaBean物件,而要記得return null,不是return mapping.findForward("success");。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jemmy 的頭像
    Jemmy

    Jemmy Walker

    Jemmy 發表在 痞客邦 留言(0) 人氣()