json - 在portlet中用json对象响应http请求

标签 json liferay httprequest portlet

我是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服务)。

我认为,AJAX请求-响应将是最合适的情况。为此,您只需要在portlet View 上创建资源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的 Action 监听器类中,添加以下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());
}

就是这样!希望对您有帮助:)

关于json - 在portlet中用json对象响应http请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17592144/

相关文章:

javascript - 为什么js中forEach不断递增?但在控制台看起来很完美。

ios - JSON访问数组内的多个实例

java - 如何在 Liferay serveResource(-, -) 方法中从 AJAX 请求下载文件

json - 从 http 响应中解析复杂的 json

java - 无法从 START_ARRAY token 中读取文档 : Can not deserialize instance of java. lang.String

java - 如何在freemarker中通过键值访问json值?

css - 在 Liferay 中,它从哪个文件夹中获取用于缩小过程的 CSS 文件?

ruby-on-rails - 使用 token 对 API 进行身份验证

javascript - 使用 Nodejs 请求模块对返回未定义进行地理编码的函数

android - 为 firebase 函数获取 java http 请求并快速放入