一流+一流=二流。一個優秀的元件可以獨當一面,甚至包山包海,當再遇到另一個優秀的元件,雖然獨當的一面不同,但週邊的能力可能踩到對方的地盤了,這是我花兩天才找出原因的。
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");。
留言列表