2013-07-11 11 views
8

Jestem początkującym programistą portletów liferay i opracowuję portlet, który odbiera żądanie pobierania http, przetwarza pewne informacje i musi zwrócić obiekt Json. Mój problem polega na tym, że mój portlet wysyła całą stronę HTML zamiast tylko obiektu json. To jest mój kod:Odpowiedź na żądanie http z obiektem json w portlecie

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

mogę wykonać to w sposób doView() Wiem, że to nie jest najlepsza praktyka, ale nie jestem zaniepokojony z tym w tej chwili. Czy ktoś może mi wyjaśnić, jak zwrócić tylko obiekt JSON? Czytam coś o serveResponse, ale nie mogłem wymyślić, jak go wywołać.

+0

Odradzam używanie klas HttpServletRequest lub HttpServletResponse w portlecie. Łamie cały model programowania portletów i przyjmuje kolejne złe praktyki. Zobacz pomysł zepsutymi oknami http://www.codinghorror.com/blog/2005/06/the-broken-window-theory.html –

+0

* Być zaniepokojony, że wdrożenie tego w 'doView' jest złą praktyką właśnie dlatego, że * nie działa*. To właśnie 'serveResource' jest dla –

Odpowiedz

13

Jedna rzecz, aby zauważyć, że doView() jest w większości odpowiedzialny za renderowanie portletu. Twoje wymagania mogą zostać lepiej osiągnięte poprzez
1 - processAction (Działanie portletu) lub
2 - serveResource (Usługa Portlet AJAX).

Moim zdaniem, odpowiedź na żądanie AJAX będzie najbardziej odpowiednim przypadkiem; w tym celu wystarczy utworzyć adres URL zasobu w widoku portletu. Na przykład:

<portlet:resourceURL var="ajaxResourceURL" /> 

Dodaj metodę JavaScript do strony, z której można wygenerować żądanie AJAX do swojego portletu. Metoda będzie wyglądać tak,

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

wywołanie tej metody ajax na razie przycisk/link kliknij:

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

i wreszcie w akcji klasy słuchacza portlet jest dodać następujące serveResource sposób odpowiedzialny do obsługi żądań opartych na AJAX.

Tutaj można uzyskać parametry żądania i generuje odpowiedź w sensie chcesz:

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

to wszystko! Mam nadzieję, że to ci pomoże :)

+0

Myślę, że zamierzałeś użyć '$ {ajaxResourceURL}' podczas przypisywania adresu URL w funkcji JavaScript. W przeciwnym razie zgodziłbym się, że AJAX i serveResource to właściwy sposób zwracania tylko obiektu JSON. –

+0

ajaxResourceURL to adres URL utworzony przez portlet, wskazujący metodę serveResource. Możesz przypisać URL do funkcji javascript <% = ajaxResourceURL%>, jeśli używasz go na podobnym JSP. Ale jeśli chcesz poprosić kogoś o coś innego, musisz przypisać zakodowany adres URL, drukując plik var. –

+1

Dziękuję Ci za nadzwyczajne, uratowałeś mnie! – layser

Powiązane problemy