`
joknm
  • 浏览: 61824 次
  • 性别: Icon_minigender_1
  • 来自: 南宁
社区版块
存档分类
最新评论

spring mvc 系列3 返回JSON以及文件上传

    博客分类:
  • JAVA
阅读更多
先来看下spring mvc提供返回为json数据的注解
/**
	 * 
	 * @功能模块: add
	 * @方法说明: 添加一个对象
	 * @version: 1.0
	 * @param goodsType
	 *            GoodsTypeModel
	 * @return Object spring 自动转换成 json 数据
	 * @throws
	 */
	@RequestMapping(params = "method=add")
	@ResponseBody
	public Object add(@ModelAttribute("goodsType") GoodsTypeModel goodsType) {
		return this.goodsTypeService.add(goodsType);// 返回的对象为:GoodsTypeModel
	}

返回头部content-type为:application/json


文件上传:
/**
	 * 
	 * @功能模块: add
	 * @方法说明: 处理 method=add 请求, 添加商品信息
	 * @version: 1.0
	 * @param goodsInfo
	 *            商品信息对象,由spring自动获取
	 * @param model
	 * @return ModelMap 由spring自动生成json数据
	 * @throws IOException 
	 * @throws
	 */
	@RequestMapping(params = "method=add")
	//@ResponseBody
	public void add(@ModelAttribute("goodsInfo") GoodsInfoModel goodsInfo,
			HttpServletResponse response) throws IOException {
		if (!goodsInfo.getMpFile().isEmpty()) {
			goodsInfo.setGiImg(FileUploadUtil.saveFileUpload(goodsInfo.getMpFile(),	GoodsInfoModel.DEFAULT_FILE_UPLOAD_DIR));
		}
		this.goodsInfoService.add(goodsInfo);
		//return this.goodsInfoService.add(goodsInfo);
		// EXT 文件上传时,要返回的头部信息类型为 text/html,
		// 而用@ResponseBody返回的头部信息为application/json所以自动转换类型
		// 由于本人能力有限,不知道如果要用@ResponseBody的时候怎么转换,呵呵
		JsonUtil.printJSON(response, new Result());
	}
	/*
	 * 多文件上传时,请使用:DefaultMultipartHttpServletRequest
	public String add(@ModelAttribute("goodsInfo") GoodsInfoModel goodsInfo, DefaultMultipartHttpServletRequest multipartRequest){
		List<MultipartFile> mpFiles = multipartRequest.getFiles("mpFile");
		String fileNames = null;
		for(MultipartFile mpFile : mpFiles){
			if( ! mpFile.isEmpty()){
				if(fileNames!=null){
					fileNames += "," + FileUploadUtil.saveFileUpload(mpFile, GoodsInfoModel.DEFAULT_FILE_UPLOAD_DIR);
				}else{
					fileNames = FileUploadUtil.saveFileUpload(mpFile, GoodsInfoModel.DEFAULT_FILE_UPLOAD_DIR);
				}					
			}
		}
		goodsInfo.setGiImg(fileNames);
		this.goodsInfoService.add(goodsInfo);
		return "redirect:/Product.do?method=list";
	}*/


EXT from 如果提交时添加:fileUpload: true 也就是文件上传时,要求返回的响应头部content-type为:text/html,而@ResponseBody返回的响应头部为:application/html 这时浏览器会要求选择打开XX文件的选项,如要防止此种情况产生,必须修改返回类型为:text/html 用@ResponseBody 本人还没找到解决方法,如有高人,请亮下方法,呵呵。

富文本编辑器本人用的是FCK。配置见 web.xml
根目录:WebRoot/fckeditor,
在EXT中,用的是html方式引入:
var htmleditorstr = '<div>' +
'<input type="hidden" id="giDescription___Config" value="" style="display:none" />' +
'<iframe name="giDescription___Frame" id="giDescription___Frame" ' +
'src="../fckeditor/editor/fckeditor.html?InstanceName=giDescription" ' +
'width="100%" height="400px″ frameborder="0″ scrolling="no"></iframe></div>';
  • 大小: 98.1 KB
  • 大小: 100.1 KB
  • 大小: 76.9 KB
分享到:
评论
13 楼 diwuci 2017-03-14  
用response.setContentType("text/html");是可以解决的
另外一种方式继续使用@ResponseBody 也可以,在@RequestMapping后面加上produces = "text/html;charset=utf-8"解决
@RequestMapping(value="add",method=RequestMethod.POST, produces = "text/html;charset=utf-8") 
@ResponseBody 
public String add()


12 楼 muqingren 2011-03-16  
这个学习了,歇息
11 楼 JetMah 2011-03-07  
Jophy 写道

	@RequestMapping(params = "method=login")
	public ResponseEntity<String> doFirst(@RequestParam("u") String u,@RequestParam("p") String p,HttpSession session,ModelMap model){
		HttpHeaders headers = new HttpHeaders();
		MediaType mt=new MediaType("text","html",Charset.forName("gbk"));
		headers.setContentType(mt);
		ResponseEntity<String> re=null;
		String return = new String("test");
		re=new ResponseEntity<String>(return,headers, HttpStatus.OK);
		return re;
       }
这样可以自定义  返回的响应头部content-type



没必要那么麻烦,直接用
    @RequestMapping(params = "method=add")  
    @ResponseBody  
    public String add(@ModelAttribute("goodsInfo") GoodsInfoModel goodsInfo,  
            HttpServletResponse response) throws IOException {
        // ...
        return "{success:true}";
    }
10 楼 joknm 2010-12-30  
看回复呀,回复里面不是有解决方案吗?
9 楼 jiajiafucs 2010-12-29  
哈哈,解决了,
public void importData(@RequestParam("file") MultipartFile file,HttpServletResponse response,ModelMap modelMap){
int num=0;
try{
if(!file.isEmpty()){
// 获得inputstream
InputStream inputstream = file.getInputStream() ;
num = getXlsData(inputstream);
inputstream.close();
file=null;
}
String msg = "没有数据";
if(num>0){
msg = "导入成功";
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("{success:true,msg:'"+msg+"'}");
}catch(Exception e){
e.printStackTrace();
}
}
8 楼 joknm 2010-10-22  
lshoo 写道
楼上怎么解决的,在大家分享一下!我也要弄这个。



那个示例就是解决方法啊。
7 楼 lshoo 2010-10-20  
楼上怎么解决的,在大家分享一下!我也要弄这个。
6 楼 joknm 2010-10-13  
Jophy 写道

	@RequestMapping(params = "method=login")
	public ResponseEntity<String> doFirst(@RequestParam("u") String u,@RequestParam("p") String p,HttpSession session,ModelMap model){
		HttpHeaders headers = new HttpHeaders();
		MediaType mt=new MediaType("text","html",Charset.forName("gbk"));
		headers.setContentType(mt);
		ResponseEntity<String> re=null;
		String returnString = new String("test");
		re=new ResponseEntity<String>(returnString, headers, HttpStatus.OK);
		return re;
       }
这样可以自定义  返回的响应头部content-type



非常感谢 Jophy 童鞋, 问题解决了。
5 楼 Jophy 2010-10-13  

	@RequestMapping(params = "method=login")
	public ResponseEntity<String> doFirst(@RequestParam("u") String u,@RequestParam("p") String p,HttpSession session,ModelMap model){
		HttpHeaders headers = new HttpHeaders();
		MediaType mt=new MediaType("text","html",Charset.forName("gbk"));
		headers.setContentType(mt);
		ResponseEntity<String> re=null;
		String return = new String("test");
		re=new ResponseEntity<String>(return,headers, HttpStatus.OK);
		return re;
       }
这样可以自定义  返回的响应头部content-type
4 楼 niyong 2010-10-13  
中文容易出现乱码
3 楼 eyeieye 2010-10-12  
看 AnnotationMethodHandlerAdapter messageConverters
2 楼 joknm 2010-10-12  
oakeye 写道
这问题我也遇到   不知道怎么解决

他会在生成的json成功信息的前后加上<pre></pre>



据说在 json 转换配置文件里面添加一些接受的返回类型就可以了,具体没有深究,改天有空先,呵呵。
1 楼 oakeye 2010-10-12  
这问题我也遇到   不知道怎么解决

他会在生成的json成功信息的前后加上<pre></pre>

相关推荐

Global site tag (gtag.js) - Google Analytics