0

我正在使用 ajax 提交我的 jsp 页面数据,而无需在 liferay 自定义 portlet 中刷新页面。

我面临两个问题:

  1. 当我将 Ajax 函数调用到资源服务器方法时,它会在该方法中获取所有 ajax 数据,但是当一切都完成后,如果成功,我将无法获得任何数据作为回报。那么在Ajax函数执行成功后,我怎样才能得到一些数据作为回报呢?

  2. 我在我的表单中使用了简单的 HTML 文件上传控件,当我使用简单的提交方法时,我调用上传请求来获取文件的所有属性,并使用上传请求上传文件,但是在 Ajax 的情况下,我必须做所有事情在操作类中的资源服务器方法中使用资源操作,并且null通过上传请求获取所有值,那么我该如何解决这个问题?

我正在提供我的一个示例 Ajax 调用和我的资源服务器方法

这是我在 jsp 页面中的简单 ajax 调用

<script type="text/javascript">
    function addToDo(addToDo) {
        var todo = document.getElementById('toDo').value;

        alert("");

        var adv_name = document.getElementById('advertise_name').value;
        var keywords = document.getElementById('keywords').value;
        var adv_url = document.getElementById('adv_url').value;
        var fileUpload = document.getElementById('fileUpload').value;

        var mediatype= $('#mediatype option:selected').val();

        $.ajax({
            url :addToDo,            
            data: {
                "todo":todo,
                "adv_name":adv_name,
                "mediatype":mediatype,
                "keywords":keywords,
                "adv_url":adv_url,
                "fileUpload":fileUpload,
                "CMD":"addToDo"
            },
            type: "GET",
            timeout: 20000,
            dataType: "text",
            success: function(data) {
                alert(data);
                //when i alert this data..its always null
            }
        });
    }
</script>

以下是我的上传控件:

<label>Browse</label>
<input name="fileUpload" id="fileUpload" type="file" />
<span id="restError2" style="color: #C62626;" class="help-block"></span>

在一个按钮上,我在上面调用 ajax 方法并重定向到资源服务器方法,如下所示:

@Override
public void serveResource(ResourceRequest request, ResourceResponse response){
    if(request.getParameter("CMD").equals("addToDo")) {
        System.out.println("came here for add");

        // here am converting this resource request to uploadportletrequest because i have enctype="multipart/form-data"
        UploadPortletRequest uploadReq = PortalUtil.getUploadPortletRequest(request);

        sourceFileName = uploadReq.getFileName("fileUpload");// uploaded
        // filename                 

        advertise_name = uploadReq.getParameter("advertise_name"); //this value getting null
        adv_link = uploadReq.getParameter("adv_url"); //this value getting null
        keyword = uploadReq.getParameter("keywords"); //this value getting null
        String resourceID = request.getResourceID();

        System.out.println(resourceID);
    }
}
4

1 回答 1

1

对于第一个问题,请参阅这个 SO answer

对于第二个问题,我会说您缺少参数的前缀。

所以尝试将您的ajax调用更改为(我只更改您在serveResource方法中提到的字段变为空)

        $.ajax({
        url :addToDo,            
        data: {
            "todo":todo,
            "<portlet:namespace />adv_name":adv_name,
            "mediatype":mediatype,
            "<portlet:namespace />keywords":keywords,
            "<portlet:namespace />adv_url":adv_url,
            "fileUpload":fileUpload,
            "CMD":"addToDo"
        },
        type: "GET",
        timeout: 20000,
        dataType: "text",
        success: function(data) {
            alert(data);
            //when i alert this data..its always null
        }
    });

并且一定要有

<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet" %>

在你的jsp之上。

另请注意,在您的 serveResource 方法中,您拥有

advertise_name = uploadReq.getParameter("advertise_name");

但发送"adv_url":adv_url,时,请注意名称。

另一件需要注意的是,您使用的是 GET 而不是 POST。

还要记住的另一件事是,并非所有浏览器都支持使用 ajax 上传文件。有关支持的浏览器列表,请参阅

于 2012-11-07T17:40:16.170 回答