我是liferay portlet开发的初学者,我正在开发一个接收http get请求,处理一些信息并且必须返回json对象的portlet。我的问题是我的Portlet发送了整个html页面,而不仅仅是json对象。这是我的代码:
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的内容,但是我不知道如何调用它。
好,需要注意的一件事是,这doView()主要负责您的Portlet的呈现。通过 1- processAction(Portlet操作)或 2- serveResource(Portlet AJAX服务)可以更好地满足您的要求。
doView()
processAction
serveResource
在我看来,AJAX请求-响应将是最合适的情况。为此,您只需要在portlet视图上创建资源URL。喜欢:
<portlet:resourceURL var="ajaxResourceURL" />
在页面上添加一个JavaScript方法,您可以在其中生成对Portlet的AJAX请求。该方法看起来像这样,
<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()); }
而已!希望对您有所帮助:)