【问题标题】:respond to http request with json object in portlet使用 portlet 中的 json 对象响应 http 请求
【发布时间】:2013-07-11 11:26:32
【问题描述】:

我是 liferay portlet 开发的初学者,我正在开发一个 portlet,它接收一个 http get 请求,处理一些信息,然后它必须返回一个 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对象,但我不知道如何调用它。

【问题讨论】:

  • 我建议不要在 portlet 中使用 HttpServletRequest 或 HttpServletResponse 类。它打破了整个 portlet 编程模型,并且只欢迎进一步的不良做法。看看破窗的想法codinghorror.com/blog/2005/06/the-broken-window-theory.html
  • Be 担心在doView 中实现这一点是不好的做法,正是因为它确实 工作。这就是serveResource 的用途

标签: json liferay httprequest portlet


【解决方案1】:

嗯,有一点需要注意,doView() 主要负责呈现您的 portlet。通过
可以更好地满足您的要求 1 - processAction(Portlet 操作)或
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());
}

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

【讨论】:

  • 我认为您的意思是在 JavaScript 函数中分配 URL 时使用“${ajaxResourceURL}”。否则我会同意 AJAX 和 serveResource 是返回 JSON 对象的正确方法。
  • ajaxResourceURL 是您的portlet 创建的URL,指示您的serveResource 方法。如果您在类似的 JSP 上使用它,您可以将 URL 分配给 javascript 函数 。但是,如果你想从其他地方发出请求,那么你需要通过打印 var 来分配一个硬编码的 URL。
  • 感谢非凡,你救了我!
最近更新 更多