如何在Crystal Portlet中正确返回JSON数据给AJAX请求?
当Crystal Portlet中需要采用Ajax请求,并让后台返回Json数据时,如何才能正确、方便的返回Json数据呢?
以下两种方法均可:
方法一:Ajax请求时,采用RenderURL,对应Portlet类中采用ajax(data)方法返回Java对象即可;
方法二:Ajax请求时,采用ResourceURL,对应Portlet类中采用ajax(data,response)方法将Java对象直接输出到Response流中;(推荐使用此方法)
分步指南
方法一:
- Ajax请求时,url采用RenderURL生成,与普通的portlet请求无差异;
-
对应访问的Portlet Class中,创建对应方法,并采用ajax(data)方式返回,如下代码示例:
@RequestMapping(params = "action=getUserById") public String ajaxRenderUrlTest( @RequestParam String id){ User user = userService.getUserById(id); return ajax(user); }
- 此时,可能会出现“common/_ajax.jsp文件找不到”的错误,按如下方法处理:
- 确保项目使用最新版本Crystal-portlet-core 2.4快照及以上版本;
-
在portlet的/WEB-INF/spring/common/jstl-portlet.xml文件中,采用如下配置,替换viewResolver bean的配置:
<bean id="viewResolver" class="com.gsoft.crystal.portlet.CrystalInternalResourceViewResolver" abstract="true"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="basePrefix" value="/WEB-INF/jsp" /> <property name="suffix" value=".jsp" /> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="order" value="1" /> </bean>
-
class采用com.gsoft.crystal.portlet.CrystalInternalResourceViewResolver替换;
- 增加basePrefix变量,值为jsp文件所在根目录,如:/WEB-INF/jsp。
-
方法二:(推荐使用)
- Ajax请求时,url采用ResourceURL生成;
-
对应访问的Portlet Class中,创建对应方法,并采用ajax(data,response)方式返回,如下代码示例:
@ResourceMapping("testAjax") public void ajaxTest(ResourceResponse response, @RequestParam String id) throws IOException { User user = userService.getUserById(id); ajax(user, response); }
-
前台ajax调用示例代码如下:
$.ajax({ type:'post', url:'<portlet:resourceURL id="testAjax"/>', data:{ <portlet:namespace/>id:110 }, success:function(data){ } });