使用portlet中的json对象响应http请求

时间:2013-07-11 11:26:32

标签: json liferay httprequest portlet

我是liferay portlet开发的初学者,我正在开发一个接收http get请求的portlet,处理一些信息,而不是返回一个json对象。我的问题是我的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()方法中执行此操作我知道这不是最佳实践,但我现在并不关心这一点。有人可以向我解释如何只返回我读过有关serveResponse的json对象,但我无法弄清楚如何调用它。

1 个答案:

答案 0 :(得分:14)

嗯,需要注意的一点是,doView()主要负责渲染您的portlet。你的要求可以通过
更好地实现 1 - processAction(Portlet Action)或
2 - serveResource(Portlet AJAX服务)。

在我看来,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());
}

多数民众赞成!希望,这对你有所帮助:))