欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring MVC 返回json 博客分类: Java WebJavaspring MVC springMVCspring mvcjson返回json应答json 

程序员文章站 2024-02-24 16:08:16
...

spring MVC如何返回json呢?

有两种方式:

方式一:使用ModelAndView

@ResponseBody
	@RequestMapping("/save")
	public ModelAndView save(SimpleMessage simpleMessage){
		//查询时可以使用 isNotNull
		if(!ValueWidget.isNullOrEmpty(simpleMessage)){
			try {
				//把对象中空字符串改为null
				ReflectHWUtils.convertEmpty2Null(simpleMessage);
			} catch (SecurityException e) {
				e.printStackTrace();
			} catch (NoSuchFieldException e) {
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		simpleMessage.setCreateTime(TimeHWUtil.getCurrentTimestamp());
		simpleMessage.setHasReply(Constant2.SIMPLE_MESSAGE_HAS_REPLY_NOT_YET);
		this.simpleMessageDao.add(simpleMessage);
		Map map=new HashMap();
		map.put("result", "success");
		return new ModelAndView(new MappingJacksonJsonView(),map);
	}

 

 

方式二:返回String

/***
	 * {"fileName":"20141002125209_571slide4.jpg","path":"D:\\software\\eclipse\\workspace2\\demo_channel_terminal\\upload\\image\\20141002125209_571slide4.jpg"}
	 * @param file
	 * @param request
	 * @param response
	 * @return
	 * @throws IOException
	 */
	@ResponseBody
	@RequestMapping(value = "/upload",produces="application/json;charset=UTF-8")
	public String upload(
			@RequestParam(value = "image223", required = false) MultipartFile file,
			HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		String content = null;
		Map map = new HashMap();
		if (ValueWidget.isNullOrEmpty(file)) {
			map.put("error", "not specify file!!!");
		} else {
			System.out.println("request:" + request);// org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest@7063d827
			System.out.println("request:" + request.getClass().getSuperclass());
			
			// // System.out.println("a:"+element+":$$");
			// break;
			// }
			String fileName = file.getOriginalFilename();// 上传的文件名
			fileName=fileName.replaceAll("[\\s]",	"");//IE中识别不了有空格的json
			// 保存到哪儿
			String finalFileName = TimeHWUtil.formatDateByPattern(TimeHWUtil
					.getCurrentTimestamp(),"yyyyMMddHHmmss")+ "_"
							+ new Random().nextInt(1000) + fileName;
			File savedFile = getUploadedFilePath(request,
					Constant2.UPLOAD_FOLDER_NAME + "/image", finalFileName,
					Constant2.SRC_MAIN_WEBAPP);// "D:\\software\\eclipse\\workspace2\\demo_channel_terminal\\ upload\\pic\\ys4-1.jpg"
			System.out.println("[upload]savedFile:"
					+ savedFile.getAbsolutePath());
			// 保存
			try {
				file.transferTo(savedFile);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			ObjectMapper mapper = new ObjectMapper();
			
			

			map.put("fileName", finalFileName);
			map.put("path", savedFile.getAbsolutePath());
			try {
				content = mapper.writeValueAsString(map);
				System.out.println(content);
			} catch (JsonGenerationException e) {
				e.printStackTrace();
			} catch (JsonMappingException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
//			System.out.println("map:"+map);
		}

/*
 * {"fileName":"20141002125209_571slide4.jpg","path":"D:\\software\\eclipse\\workspace2\\demo_channel_terminal\\upload\\image\\20141002125209_571slide4.jpg"}
 * */
		return content;

	}

 

两种方式有什么区别呢?

方式一:使用ModelAndView的contentType是"application/json"

方式二:返回String的            contentType是"text/html"

那么如何设置response的content type呢?

使用注解@RequestMapping 中的produces:

@ResponseBody
	@RequestMapping(value = "/upload",produces="application/json;charset=UTF-8")
	public String upload(HttpServletRequest request, HttpServletResponse response,String contentType2)
			throws IOException {
		String content = null;
		Map map = new HashMap();
		ObjectMapper mapper = new ObjectMapper();

		map.put("fileName", "a.txt");
		try {
			content = mapper.writeValueAsString(map);
			System.out.println(content);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		if("json".equals(contentType2)){
			response.setContentType(SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF);
		}
		return content;

	}

 

@RequestMapping(value = "/upload",produces="application/json;charset=UTF-8")

@RequestMapping(value = "/upload",produces="application/json")

spring 官方文档说明:

Producible Media Types

You can narrow the primary mapping by specifying a list of producible media types. The request will be matched only if the Accept request header matches one of these values. Furthermore, use of the produces condition ensures the actual content type used to generate the response respects the media types specified in the producescondition. For example:

@Controller
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
    // implementation omitted
}

Just like with consumes, producible media type expressions can be negated as in !text/plain to match to all requests other than those with an Accept header value oftext/plain.

Tip
[Tip]

The produces condition is supported on the type and on the method level. Unlike most other conditions, when used at the type level, method-level producible types override rather than extend type-level producible types.

 

参考:http://hw1287789687.iteye.com/blog/2128296

http://hw1287789687.iteye.com/blog/2124313