1、第一种方式是spring2时代的产物,也就是每个json视图controller配置一个Jsoniew。
如:<bean id="defaultJsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
或者<bean id="defaultJsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
同样要用jackson的jar包。
2、第二种使用JSON工具将对象序列化成json,常用工具Jackson,fastjson,gson。
利用HttpServletResponse,然后获取response.getOutputStream()或response.getWriter()
直接输出。
示例:
[java] view plain copy print ?
- public class JsonUtil
- {
-
- private static Gson gson=new Gson();
-
-
-
-
-
-
-
-
-
- public static String toJson(Object src) {
- if (src == null) {
- return gson.toJson(JsonNull.INSTANCE);
- }
- return gson.toJson(src);
- }
- }
public class JsonUtil
{
private static Gson gson=new Gson();
/**
* @MethodName : toJson
* @Description : 将对象转为JSON串,此方法能够满足大部分需求
* @param src
* :将要被转化的对象
* @return :转化后的JSON串
*/
public static String toJson(Object src) {
if (src == null) {
return gson.toJson(JsonNull.INSTANCE);
}
return gson.toJson(src);
}
}
3、第三种利用spring mvc3的注解@ResponseBody
例如:
[java] view plain copy print ?
- @ResponseBody
- @RequestMapping("/list")
- public List<String> list(ModelMap modelMap) {
- String hql = "select c from Clothing c ";
- Page<Clothing> page = new Page<Clothing>();
- page.setPageSize(6);
- page = clothingServiceImpl.queryForPageByHql(page, hql);
-
- return page.getResult();
- }
@ResponseBody
@RequestMapping("/list")
public List<String> list(ModelMap modelMap) {
String hql = "select c from Clothing c ";
Page<Clothing> page = new Page<Clothing>();
page.setPageSize(6);
page = clothingServiceImpl.queryForPageByHql(page, hql);
return page.getResult();
}
然后使用spring mvc的默认配置就可以返回json了,不过需要jackson的jar包哦。
注意:当springMVC-servlet.xml中使用<mvc:annotation-driven />时,如果是3.1之前已经默认注入AnnotationMethodHandlerAdapter,3.1之后默认注入RequestMappingHandlerAdapter只需加上上面提及的jar包即可!
如果是手动注入RequestMappingHandlerAdapter 可以这样设置
配置如下:
<div class="dp-highlighter bg_html"><div class="bar"><div class="tools"><strong>[html]</strong> <a target=_blank title="view plain" class="ViewSource" href="http://blog.csdn.net/shan9liang/article/details/42181345#">view plain</a><a target=_blank title="copy" class="CopyToClipboard" href="http://blog.csdn.net/shan9liang/article/details/42181345#">copy</a><a target=_blank title="print" class="PrintSource" href="http://blog.csdn.net/shan9liang/article/details/42181345#">print</a><a target=_blank title="?" class="About" href="http://blog.csdn.net/shan9liang/article/details/42181345#">?</a></div></div><ol class="dp-xml"><li class="alt"><span><span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"</span><span> </span></span></li><li><span> <span class="attribute">p:ignoreDefaultModelOnRedirect</span><span>=</span><span class="attribute-value">"true"</span><span> </span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">property</span><span> </span><span class="attribute">name</span><span>=</span><span class="attribute-value">"messageConverters"</span><span class="tag">></span><span> </span></span></li><li><span> <span class="tag"><</span><span class="tag-name">list</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"><</span><span class="tag-name">bean</span><span> </span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"</span><span class="tag">/></span><span> </span></span></li><li><span> <span class="tag"></</span><span class="tag-name">list</span><span class="tag">></span><span> </span></span></li><li class="alt"><span> <span class="tag"></</span><span class="tag-name">property</span><span class="tag">></span><span> </span></span></li><li><span> <span class="tag"></</span><span class="tag-name">bean</span><span class="tag">></span><span> </span></span></li></ol></div><pre class="html" style="display: none;" name="code"><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
p:ignoreDefaultModelOnRedirect="true" >
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
添加包
jackson-mapper-asl-*.jar
jackson-core-asl-*.jar
有两种方式:
方式一:使用ModelAndView
- @ResponseBody
- @RequestMapping("/save")
- public ModelAndView save(SimpleMessage simpleMessage){
-
- if(!ValueWidget.isNullOrEmpty(simpleMessage)){
- try {
-
- 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);
- }
@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
-
-
-
-
-
-
-
-
- @ResponseBody
- @RequestMapping(value = "/upload")
- 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);
- System.out.println("request:" + request.getClass().getSuperclass());
-
-
-
-
- String fileName = file.getOriginalFilename();
- fileName=fileName.replaceAll("[\\s]", "");
-
- 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);
- 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();
- }
-
- }
-
-
-
-
- return content;
-
- }
/***
* {"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")
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;
-
- }
@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 官方文档说明:
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) {
}
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
|
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