使用Spring 3.2.0.RELEASE的DeferredResult反向ajax在IE中无法使用

【字号: 日期:2024-03-25浏览:50作者:雯心
(adsbygoogle = window.adsbygoogle || []).push({}); 如何解决使用Spring 3.2.0.RELEASE的DeferredResult反向ajax在IE中无法使用?

这是非常非常令人沮丧的。

为了使该东西在IE中正常工作,我需要cache:false在我使用jquery为getMessages创建的ajax请求中设置属性。否则,IE不会将请求保持为待处理状态,并始终返回旧的响应文本。

这是IE的很大问题。我希望没有人再次遇到问题或尽早找到答案。

:)

解决方法

我正在尝试在Spring中使用反向Ajax创建群聊演示。我正在使用Spring 3.2.0.RELEASE版本。

我正在使用DeferredResult在控制器中执行反向ajax。以下是我的Controller类的代码段。

@Autowiredprivate AsyncRepository asyncRepository;Map<Integer,List<DeferredResult<String>>> watchers = new ConcurrentHashMap<Integer,List<DeferredResult<String>>>();@RequestMapping(value='/asyncRequest/getMessages/{id}',method=RequestMethod.GET)@ResponseBodypublic DeferredResult<String> getMessages(final @PathVariable('id') Integer id){ final DeferredResult<String> deferredResult = new DeferredResult<String>(null,Collections.emptyList()); if(watchers.containsKey(id)) {watchers.get(id).add(deferredResult); } else {watchers.put(id,new ArrayList<DeferredResult<String>>());watchers.get(id).add(deferredResult); } deferredResult.onCompletion(new Runnable() {@Overridepublic void run() { watchers.get(id).remove(deferredResult);} }); return deferredResult;}@RequestMapping(value='/asyncRequest/setMessages/{id}/{message}',method=RequestMethod.GET)@ResponseBodypublic String setMessage(@PathVariable('id') Integer id,@PathVariable('message') String message) { asyncRepository.setMessage(id,message); return '';}@Scheduled(fixedRate=1000)public void processQueues() { for (Map.Entry<Integer,Queue<AsyncDataBean>> entry : asyncRepository.getAsyncBeans().entrySet()) {while(entry != null && entry.getValue() != null && !entry.getValue().isEmpty()) { AsyncDataBean asyncDataBean = entry.getValue().poll(); for (DeferredResult<String> deferredResult : watchers.get(asyncDataBean.getId())) {deferredResult.setResult(asyncDataBean.getMessage()); }} }}

下面是Repository类,其中包含GroupID的Map及其相关的messageQueue。它还具有用于获取和设置相关组ID的消息的功能。

@Repositorypublic class AsyncRepository { private Map<Integer,Queue<AsyncDataBean>> asyncBeans = new ConcurrentHashMap<Integer,Queue<AsyncDataBean>>(); public String getMessages(Integer id) {StringBuilder stringBuilder = new StringBuilder();while (asyncBeans.get(id) != null && !asyncBeans.get(id).isEmpty()) { stringBuilder.append(asyncBeans.get(id).poll().getMessage()).append('~');}return stringBuilder.toString(); } public void setMessage(Integer id,String message) {if(asyncBeans.containsKey(id)) { asyncBeans.get(id).add(new AsyncDataBean(id,message));} else { Queue<AsyncDataBean> messageQueue = new ConcurrentLinkedQueue<AsyncDataBean>(); messageQueue.add(new AsyncDataBean(id,message)); asyncBeans.put(id,messageQueue);} } public Map<Integer,Queue<AsyncDataBean>> getAsyncBeans() {return asyncBeans; } public void setAsyncBeans(Map<Integer,Queue<AsyncDataBean>> asyncBeans) {this.asyncBeans = asyncBeans; }}

下面是我用来存储每条消息及其组ID的数据bean。

public class AsyncDataBean { private Integer id; private String message; public AsyncDataBean() { } public AsyncDataBean(int id,String message) {this.setId(id);this.setMessage(message); } public Integer getId() {return id; } public void setId(Integer id) {this.id = id; } public String getMessage() {return message; } public void setMessage(String message) {this.message = message; }}

然后是用于群聊的jsp页面。如下图所示。

<script type='text/javascript'> var messagesWaiting = false; function getMessages(){if(!messagesWaiting){ $.ajax({ url: '${pageContext.servletContext.contextPath}/asyncRequest/getMessages/${id}',dataType:'text',success: function(data,textStatus,jqXHR) { if(textStatus == ’success’){ messagesWaiting = false; var arr = data.split('~'); for(var i=0; i<arr.length; i++) { try {if(arr[i] != ’’) { $('#txtaMessages').val($('#txtaMessages').val() + 'nn' + arr[i]); document.getElementById('txtaMessages').scrollTop = document.getElementById('txtaMessages').scrollHeight;} } catch(e){ alert(e.message); } } } },complete: function(j) { },error: function(xhr) { } }); messagesWaiting = true;} } setInterval(getMessages,1000); getMessages(); function sendMessage() {var xmlhttp1 = new XMLHttpRequest();xmlhttp1.open('GET',’${pageContext.servletContext.contextPath}/asyncRequest/setMessages/${id}/’ + $('#txtMessage').val(),true);xmlhttp1.setRequestHeader('Content-Type','application/x-www-form-urlencoded');xmlhttp1.send();$('#txtMessage').val('');$('#txtMessage').focus(); }</script></head><body> <h1>Hello World!</h1> <table><tr> <td>Messages :: </td> <td><textarea cols='100' rows='10' id='txtaMessages'></textarea> </td></tr><tr> <td>Send Message :: </td> <td><input type='text' /></td></tr><tr> <td><input type='button' value='Send' onclick='sendMessage();'/></td></tr> </table></body></html>

到目前为止,这就是我编写的代码,以使其正常工作。一切都在FF和Chrome中正常运行。但是在IE中,它无法正常工作。该请求永远不会在服务器上被搁置,并且总是按照javascript代码中的配置每秒执行一次。并且它总是返回与以前相同的结果。我尝试使用其他几种方法来发送IE的Ajax请求,但无法正常工作。谁能为我工作?

由于在FF和Chrome中一切正常,我怀疑问题出在使用JavaScript代码发送请求以获取消息。

请帮我。

提前致谢。

相关文章: