2013-07-11 101 views
8

我是liferay portlet開發的初學者,我正在開發一個接收http請求的portlet,它處理一些信息,並且它必須返回一個json對象。我的問題是,我的portlet發送一個完整的html頁面,而不僅僅是json對象。 這是我的代碼:對portlet中的json對象的http請求做出響應

HttpServletResponse servletResponse = PortalUtil.getHttpServletResponse((renderResponse)); 

      servletResponse.setHeader("Content-type", "application/json"); 
      servletResponse.setCharacterEncoding("application/json"); 
      PrintWriter out = servletResponse.getWriter(); 
      out.write(EntityUtils.toString(responseEntity)); 


      out.flush(); 
      out.close(); 

我在我知道這是不是最好的做法doView()方法執行此,但我不關心,在目前。有人可以向我解釋如何返回json對象,我讀了一些有關serveResponse的內容,但我無法弄清楚如何調用它。

+0

我會建議不要在portlet中使用HttpServletRequest或HttpServletResponse類。它打破了整個portlet編程模型,只是歡迎進一步的不良做法。看到破窗的想法http://www.codinghorror.com/blog/2005/06/the-broken-window-theory.html –

+0

*請注意,在'doView'中實現這個不好的做法恰恰是因爲它* * *不* * *工作*。這就是'serveResource'是 –

回答

13

那麼,有一點需要注意,doView()主要負責渲染您的portlet。您的要求可以通過
1 - processAction(Portlet Action)或
2 - serveResource(Portlet AJAX服務)更好地實現。

在我看來,AJAX請求響應將是最合適的情況;爲此你只需要在你的portlet視圖上創建一個資源URL。像:

<portlet:resourceURL var="ajaxResourceURL" /> 

一個JavaScript方法添加到頁面,在那裏你可以生成AJAX請求您的portlet。該方法將是這個樣子,

<script type="text/javascript"> 
function _callAjax(val1, val2){ 
    var url = '<%=ajaxResourceURL %>'; // pass resource URL you created using scriplet/EL. 
    jQuery.ajax({ 
    type : "POST", 
    url : url, 
    cache:false, 
    dataType: "json", 
    data: { 
     value1: val1, // extra parameters if you want to pass 
     value2: val2 
    },  
    success : function(data){ 
     // do whatever you want with your response data 
    }, 
    error : function(XMLHttpRequest, textStatus, errorThrown){ 
     alert(errorThrown); 
     alert(textStatus); 
    } 
    }); 
}; 
</script> 

調用上的按鈕/鏈接點擊事件AJAX方法:

<input type="button" onclick="_callAjax('val1', 'val2')" value="Send" /> 

最後,在你的portlet的操作監聽器類添加以下serveResource方法,負責用於處理基於AJAX的請求。

在這裏你可以得到你的請求參數和生成意義上的迴應你想要的:

@Override 
public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException,IOException { 

String value1 = ParamUtil.getString(request , "value1", "default"); // request parameters 
String value2 = ParamUtil.getString(request , "value2", ""); 

PrintWriter writer = response.getWriter(); 

JSONObject jsonObject = new JSONObject(); 
jsonObject.put(String key, boolean/long/Collection/double/Map/Object value); 

writer.write(jsonObject.toString()); 
} 

完蛋了!希望,這將有助於你:)

+0

我認爲你打算在JavaScript函數中分配URL時使用'$ {ajaxResourceURL}'。否則,我會同意AJAX和serveResource是正確的方式來返回一個JSON對象。 –

+0

ajaxResourceURL是由您的portlet創建的指示您的serveResource方法的URL。如果您在類似的JSP上使用它,則可以將URL分配給javascript函數<%= ajaxResourceURL%>。但是,如果您想從其他地方發出請求,則需要通過打印var來指定硬編碼的URL。 –

+1

非常感謝你,你救了我! – layser