如何在Crystal Portlet中正确返回JSON数据给AJAX请求?

时间:2022-04-14 20:13:12

当Crystal Portlet中需要采用Ajax请求,并让后台返回Json数据时,如何才能正确、方便的返回Json数据呢?

以下两种方法均可:

方法一:Ajax请求时,采用RenderURL,对应Portlet类中采用ajax(data)方法返回Java对象即可;

方法二:Ajax请求时,采用ResourceURL,对应Portlet类中采用ajax(data,response)方法将Java对象直接输出到Response流中;(推荐使用此方法)

分步指南

方法一:

  1. Ajax请求时,url采用RenderURL生成,与普通的portlet请求无差异;
  2. 对应访问的Portlet Class中,创建对应方法,并采用ajax(data)方式返回,如下代码示例:

    @RequestMapping(params = "action=getUserById")
    public String ajaxRenderUrlTest( @RequestParam String id){
    User user = userService.getUserById(id);
    return ajax(user);
    }

      

  3. 此时,可能会出现“common/_ajax.jsp文件找不到”的错误,按如下方法处理:
    1. 确保项目使用最新版本Crystal-portlet-core 2.4快照及以上版本;
    2. 在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>

        

      1. class采用com.gsoft.crystal.portlet.CrystalInternalResourceViewResolver替换;

      2. 增加basePrefix变量,值为jsp文件所在根目录,如:/WEB-INF/jsp。

方法二:(推荐使用)

  1. Ajax请求时,url采用ResourceURL生成;
  2. 对应访问的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);
    }

      

  3. 前台ajax调用示例代码如下:

    $.ajax({
    type:'post',
    url:'<portlet:resourceURL id="testAjax"/>',
    data:{
    <portlet:namespace/>id:110
    },
    success:function(data){ }
    });