做文件上传的时候遇到点麻烦,ExtJS上传文件要求服务器端返回的ContentType是“text/html”,而Spring MVC默认返回的是“application/json”,于是ExtJS这边总是报错说无法将"<pre>{success: true}</pre>"转换成JSON,很奇怪的一件事就是:为什么会出现pre标签呢?
先看看当前服务器端的代码:
12345678 | public @ResponseBody Map<String, Object> upload(UserVO userVO){ Map<String, Object> modelMap = new HashMap<String, Object>(); if(!userVO.getUserPhoto().isEmpty()){ userVO.getUserPhoto().transferTo(new File("文件存放路径")); } modelMap.put("success", true); return modelMap;} |
用上面这种方式处理的时候,文件上传了成功了,但是就会出现文章开头所描述的问题,于是我改成这样:
123456 | public void upload(UserVO userVO, HttpServletResponse response){ String json = "{success: true}"; response.setContentType("text/html"); response.getWriter().write(json); response.flushBuffer();} |
现在,ExtJS不会报错了,也成功触发了Form的success事件,但是服务器端又报错了,说是无法找到"upload.jsp",其实我请求的是"upload.action",而且也成功响应了,但是不知道为什么,Spring貌似是将"action"替换成"jsp"又转发跳转了一下,百度谷歌无解!
其实,最最主要的就是能够将response的ContextType设置为“text/xml”就没问题了。参考Spring的文档找到解决办法如下:
方法一:
123456 | public ResponseEntity<String> upload(UserVO userVO){ String json = "{success: true}"; HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentType(MediaType.TEXT_HTML); return new ResponseEntity<String>(json, responseHeaders, HttpStatus.OK);} |
方法二:
先在messageConverters中配置StringHttpMessageConverter:
1234567891011 | <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer" /> </property> <property name="messageConverters"> <list> <bean class = "org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes" value="text/html;charset=UTF-8" /> </bean> </list> </property></bean> |
然后在这样就OK了(注意:方法的返回类型必须是String):
1234 | public @ResponseBody String upload(UserVO userVO){ String json = "{success: true}"; return json;} |
参考文档:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html
再补充一个可行的方法三:
1234567 | public void upload(HttpServletResponse response, UserVO userVO){ Map<String, Object> result = new HashMap<String, Object>(0); result.put("success", true); response.setContentType("text/html"); ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(response.getOutputStream(), result);} |
问题解决了,但是还是不知道到底是哪出现的pre标签。
联系客服