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/json的MIME类型,然后返回到客户端就会自动加上<pre></pre>标签,这个问题是框架本身的,没办法解决:
http://*.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的方法:
- /**
- * added by charles.wang to fix the ext-js framework bug
- */
- public JSONObject getJSONFormat (){
- try{
- JSONObject obj = new JSONObject();
- obj.put("success", success);
- obj.put("data", data);
- return obj;
- }catch(Exception ex){
- return new JSONObject();
- }
- }
与此同时,我在Controller里面的调用封装的ExtJsonResponse的getJSONFormat()方法,让他们按照我们的意图在服务器端,按照我们自定义的方式,而不是Spring jackson框架的方式就转为了json对象,最后吧json对象打印到HttpServletResponse输出流中,这种情况下,我们打印出去的其实是json对象的toString()形式,而不再是json对象,因此不会被自动加上<pre>标签对。
- Long endTime = System.currentTimeMillis();
- // calculate the timeForParsing and use "second" as the metric
- Double timeForParsing = (endTime - startTime + 0.0D) / 1000;
- // now construct the correct result
- updateCAAssetResult.setSuccess(true);
- List<String> updateSuccessData = new ArrayList<String>();
- updateSuccessData.add("更新CA资产成功,共用时" + timeForParsing + "秒.");
- updateCAAssetResult.setData(updateSuccessData);
- if (logger.isDebugEnabled()) {
- logger.debug("CA update process successful");
- }
- response.getWriter().print(updateCAAssetResult.getJSONFormat());
然后我们Extjs客户端,就无需要decode了, 因为我们发过来的是json String,而不是json对象,所以不要decode,直接从中提取信息,然后就解决了。
此方法得益于突然的灵感,这里记录下,以免以后忘记。^_^
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/834237,如需转载请自行联系原作者