Java AJAX JSON数据检索(Portlet+;Liferay+;JSON+;Spring)
我想做的是,只需将数据发布到服务器,并使用JSON和AJAX从服务器获取数据。 我正在将遗留的非AJAX项目转换为AJAX。这是一个liferay portlet spring ibatis jquery项目。表单提交成功,我无法从服务器检索JSON格式的数据。我曾经 学习jackson for JSON的示例。这很容易,甚至不需要我去想JSON。 我只是在构建路径中复制粘贴两个jar文件,并将@ResponseBy注释到我的方法中。但响应仍然是完整的html页面。为什么? 这里是JSP代码Java AJAX JSON数据检索(Portlet+;Liferay+;JSON+;Spring),java,ajax,spring,liferay,portlet,Java,Ajax,Spring,Liferay,Portlet,我想做的是,只需将数据发布到服务器,并使用JSON和AJAX从服务器获取数据。 我正在将遗留的非AJAX项目转换为AJAX。这是一个liferay portlet spring ibatis jquery项目。表单提交成功,我无法从服务器检索JSON格式的数据。我曾经 学习jackson for JSON的示例。这很容易,甚至不需要我去想JSON。 我只是在构建路径中复制粘贴两个jar文件,并将@ResponseBy注释到我的方法中。但响应仍然是完整的html页面。为什么? 这里是JSP代码
<portlet:actionURL var="formAction">
<portlet:param name="action" value="submit"/>
</portlet:actionURL>
<c:set var="formPortletNamespace">form<portlet:namespace/></c:set>
<form:form method="post" action="${formAction}" commandName="uiState" id="${formPortletNamespace}" cssClass="travelInsurancePortletForm jqCustomStyle" autocomplete="off">
<% /* Selected action as a parameter */ %>
<input type="hidden" name="portletAction" id="portletAction"/>
<form:hidden path="quote.quotingWebApp" />
首先,
操作
阶段不会产生任何输出。它总是进入渲染
阶段。所以这个代码无论如何都不起作用
第二,从Spring的4.1
it@ResponseBody
开始,Portlet还没有。它正在4.2
中规划,但可能也不在那里
因此,您需要使用@RenderMapping
或@ResourceMapping
(仅限JSR-286/Portlet 2.0)
最自然的方法是使用@ResourceMapping
。代码如下所示:
@ResourceMapping("myAction")
public void myAction(
PortletSession session,
ResourceResponse response,
@RequestParam(value="endDate", required=false) Date endDate,
@ModelAttribute("uiState") UiState requestUiState,
BindingResult errors,
ModelMap mm) throws Exception {
UiState uiState = new UiState ();
//TODO extra logic
//explicitly set JSON as response type
response.setContentType("application/json");
//write JSON into output
response.getWriter().write(serializeJSON(uiState));
}
其中,json
是您选择的实用方法
示例实现如下(基于序列化程序):
注意:您需要在JSP上使用此代码段:
我不确定UiState是什么,但它可能会以默认的“text/html”内容类型进行响应。您需要在myAction
方法中将响应类型声明为“application/json”。谢谢。我可以使用从spring控制器加载json数据。
@Controller
@RequestMapping("VIEW")
public class MyController{
@ActionMapping(params="portletAction=myAction")
public @ResponseBody UiState myAction(
PortletSession session,
ActionResponse response,
@RequestParam(value="endDate", required=false) Date endDate,
@ModelAttribute("uiState") UiState requestUiState,
BindingResult errors,
ModelMap mm) throws Exception {
UiState uiState=new UiState ();
return uiState;
}
@ResourceMapping("myAction")
public void myAction(
PortletSession session,
ResourceResponse response,
@RequestParam(value="endDate", required=false) Date endDate,
@ModelAttribute("uiState") UiState requestUiState,
BindingResult errors,
ModelMap mm) throws Exception {
UiState uiState = new UiState ();
//TODO extra logic
//explicitly set JSON as response type
response.setContentType("application/json");
//write JSON into output
response.getWriter().write(serializeJSON(uiState));
}
public static String serializeJSON(Object o) throws IOException {
return new ObjectMapper().writeValueAsString(o);
}
<portlet:resourceURL var="formAction" id="myAction"/>