0

我正在尝试将 Ajax 与 Spring Portlet 2.5 一起使用(我无法升级到更高版本,因为我需要在此版本上运行测试 - 因此我无法使用@ResourceMapping)。所以这就是我尝试过的

<script type='text/javascript'>
    function <portlet:namespace />setCurrentDateTime() {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState == 4) {
                 //now what?
            }
        };
        xhr.open("GET", '${actionURL}', true);
        xhr.send();
    }
</script>

<table>
    <tr>
        <td><b><a href="# "onclick="<portlet:namespace />setCurrentDateTime();" style="color: black;" id="refreshLink">Refresh</a></b></td>
    </tr>
</table>
<br/>
<div id="<portlet:namespace />messageText">${date}</div>

通过此代码,服务器端的操作被正确触发,但我不确定如何刷新messageText以从服务器获得更新的值。

这是我的服务器端代码

@RequestMapping
public ModelAndView defaultView(RenderRequest request, RenderResponse response) {
    String date = (String) request.getPortletSession().getAttribute("date");
    if (date == null) {
        return new ModelAndView("home");
    } else {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("date", date);
        return new ModelAndView("home", map);
    }
}

@RequestMapping(params = "action=getDateTime")
public void handleActionRequest(ActionRequest ar, ActionResponse ar1) {
    SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    ar.getPortletSession().setAttribute("date", sdf.format(new Date()));
}
4

1 回答 1

1

更新 messageText 元素的内容需要将以下内容添加到您当前拥有“现在是什么?”的 JavaScript 中:

document.getElementById("<portlet:namespace />messageText").innerHTML = xhr.responseText;

但是,更大的问题是您正试图在带有仅支持JSR 168(Portlet Spec 1.0)的 Spring 版本的 portlet 中使用 Ajax。Resource Requests是 Ajax 调用的典型处理方式,直到JSR 286(Portlet Spec 2.0)才引入。

使用我建议的代码更新 JavaScript 会导致将整个门户页面添加为 messageText 元素的 innerHTML,因为ActionRequest导致为 portlet 触发完整的RenderRequest 。

于 2013-09-17T13:01:22.817 回答