做文件上传的时候遇到点麻烦,ExtJS上传文件要求服务器端返回的ContentType是“text/html”,而Spring MVC默认返回的是“application/json”,于是ExtJS这边总是报错说无法将”<pre>{success: true}</pre>”转换成JSON,很奇怪的一件事就是:为什么会出现pre标签呢?

先看看当前服务器端的代码:

1
2
3
4
5
6
7
8
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;
}

用上面这种方式处理的时候,文件上传了成功了,但是就会出现文章开头所描述的问题,于是我改成这样:

1
2
3
4
5
6
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的文档找到解决办法如下:
方法一:

1
2
3
4
5
6
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:

1
2
3
4
5
6
7
8
9
10
11
<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):

1
2
3
4
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
再补充一个可行的方法三:

1
2
3
4
5
6
7
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标签。

除非另有声明,本站遵循【署名-非商业性使用-相同方式共享 3.0 共享协议】授权。 转载原创文章请注明,转载自:Neeke[http://www.ineeke.com] 本文链接: http://www.ineeke.com/archives/1414/