2013-07-11 11 views
8

Ich bin ein Anfänger in Liferay-Portlet-Entwicklung und ich entwickle ein Portlet, das eine HTTP-Anfrage erhält, einige Informationen verarbeitet und dann ein JSON-Objekt zurückgeben muss. Mein Problem ist, dass mein Portlet eine ganze HTML-Seite anstatt nur das JSON-Objekt sendet. Dies ist mein Code:Antwort auf HTTP-Anfrage mit JSON-Objekt im Portlet

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(); 

ich dies in der doView Methode execute() Ich weiß, dass dies nicht die beste Praxis ist, aber ich bin nicht mit, dass zur Zeit besorgt. Kann mir jemand erklären, wie man nur das JSON-Objekt zurückgibt, das ich über serveResponse gelesen habe, aber ich konnte nicht herausfinden, wie man es aufruft.

+0

Ich würde davon abraten, HttpServletRequest oder HttpServletResponse-Klassen in einem Portlet zu verwenden. Es durchbricht das gesamte Portlet-Programmiermodell und begrüßt nur weitere schlechte Praktiken. Siehe die Idee von zerbrochenen Fenstern http://www.codinghorror.com/blog/2005/06/the-broken-window-theory.html –

+0

* Sei * besorgt, dass die Implementierung in "doView" schlecht ist, gerade weil es * funktioniert nicht*. Das ist, was "serveResource" für –

Antwort

13

Nun, eine Sache zu bemerken, dass die doView() meist für das Rendern Ihres Portlets verantwortlich ist. Ihre Anforderung kann besser erfüllt werden durch
1 - processAction (Portlet Action) oder
2 - serveResource (Portlet AJAX Service).

Aus meiner Sicht wird AJAX Anfrage-Antwort der geeignetste Fall sein; Dazu müssen Sie lediglich eine Ressourcen-URL in Ihrer Portlet-Ansicht erstellen. Wie:

<portlet:resourceURL var="ajaxResourceURL" /> 

eine JavaScript-Methode auf der Seite hinzufügen, von wo aus Sie AJAX Anfrage an Ihr Portlets generieren können. Das Verfahren wird in etwa so aussehen,

<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> 

Anruf, dass Ajax-Methode auf einer Schaltfläche/Link klicken Ereignis:

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

Und schließlich in Ihrem Portlet-Aktion Listener-Klasse fügen Sie die folgende serveResource Methode, verantwortlich um AJAX-basierte Anfragen zu bearbeiten.

Hier können Sie Ihre Anfrage Parameter erhalten und eine Antwort im Sinne erzeugen Sie wollen:

@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()); 
} 

Das ist es! Hoffe, das wird für Sie hilfreich sein :)

+0

ist. Ich denke, Sie wollten "$ {ajaxResourceURL}" verwenden, wenn Sie die URL in der JavaScript-Funktion zuweisen. Ansonsten würde ich zustimmen, dass AJAX und serveResource die richtige Methode ist, nur ein JSON-Objekt zurückzugeben. –

+0

ajaxResourceURL ist die von Ihrem Portlet erstellte URL, die Ihre serveResource-Methode angibt. Sie können der JavaScript-Funktion <% = ajaxResourceURL%> eine URL zuweisen, wenn Sie sie für eine ähnliche JSP verwenden. Wenn Sie jedoch eine Anfrage von irgendwoher stellen möchten, müssen Sie eine fest codierte URL zuweisen, indem Sie die Variable drucken. –

+1

Vielen Dank, du hast mich gerettet! – layser