After 2 hours hard work ,I have solved the problem in the demo of permanent progress bar.

 


 


 

 

事实上,Ext-js的框架的BUG依然存在,这个BUG就是,当你用Spring框架的jackson生成一个json对象的时候,而你客户端Ext-js上传一个文件到服务器端的时候,服务器端的返回json对象里面,会使用application/jsonMIME类型,然后返回到客户端就会自动加上<pre></pre>标签,这个问题是框架本身的,没办法解决:

 

http://www.sencha.com/forum/showthread.php?17248-lt-pre-gt-json-lt-pre-gt-in-File-upload-response-%28FF-only%29

 

http://stackoverflow.com/questions/7023531/extjs-4-spring-3-file-upload-server-sends-bad-response-content-type

 

http://topic.csdn.net/u/20110830/15/2002bebf-2472-4d41-9a12-1b239fce2a9b.html

 

http://blog.nroed.com/2011/11/21/iframe-post-file/

 

 

 

我的解决思路,就是巧妙的绕过Extjs的框架,这次,我不再让服务器端的json对象存于@ResponseBody中,而是让服务器端编码方式改为text/html,同时,我在通用类中构建一个将对象转为JSONObject的方法:


  1. /** 
  2.  
  3.      * added by charles.wang to fix the ext-js framework bug 
  4.  
  5.      */ 
  6.  
  7.      public JSONObject getJSONFormat (){ 
  8.  
  9.          try
  10.  
  11.          JSONObject obj = new JSONObject(); 
  12.  
  13.          obj.put("success", success); 
  14.  
  15.          obj.put("data", data); 
  16.  
  17.          return obj; 
  18.  
  19.          }catch(Exception ex){ 
  20.  
  21.              return new JSONObject(); 
  22.  
  23.          } 
  24.  
  25.          
  26.  
  27.           
  28.  
  29.      } 

与此同时,我在Controller里面的调用封装的ExtJsonResponsegetJSONFormat()方法,让他们按照我们的意图在服务器端,按照我们自定义的方式,而不是Spring jackson框架的方式就转为了json对象,最后吧json对象打印到HttpServletResponse输出流中,这种情况下,我们打印出去的其实是json对象的toString()形式,而不再是json对象,因此不会被自动加上<pre>标签对

 


  1. Long endTime = System.currentTimeMillis(); 
  2.  
  3.  
  4.  
  5.    // calculate the timeForParsing and use "second" as the metric 
  6.  
  7.    Double timeForParsing = (endTime - startTime + 0.0D) / 1000
  8.  
  9.  
  10.  
  11.    // now construct the correct result 
  12.  
  13.    updateCAAssetResult.setSuccess(true); 
  14.  
  15.  
  16.  
  17.    List<String> updateSuccessData = new ArrayList<String>(); 
  18.  
  19.    updateSuccessData.add("更新CA资产成功,共用时" + timeForParsing + "秒."); 
  20.  
  21.    updateCAAssetResult.setData(updateSuccessData); 
  22.  
  23.  
  24.  
  25.    if (logger.isDebugEnabled()) { 
  26.  
  27.        logger.debug("CA update process successful"); 
  28.  
  29.    } 
  30.  
  31.  
  32.  
  33.    response.getWriter().print(updateCAAssetResult.getJSONFormat()); 

 

 

然后我们Extjs客户端,就无需要decode了, 因为我们发过来的是json String,而不是json对象,所以不要decode,直接从中提取信息,然后就解决了。


此方法得益于突然的灵感,这里记录下,以免以后忘记。^_^