一、SpringMVC返回json数据的三种方式

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。

3、第三种利用spring mvc3的注解@ResponseBody,然后使用spring mvc的默认配置就可以返回json了。

  即return Object 会自动转换成JSON对象。

二、springMVC对于controller处理方法返回值的可选类型

1.ModelAndView

@RequestMapping(method=RequestMethod.GET)public ModelAndView index(){ModelAndView modelAndView = new ModelAndView("/user/index");//指定viewNamemodelAndView.addObject("xxx", "xxx");return modelAndView;}@RequestMapping(method=RequestMethod.GET)public ModelAndView index(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("xxx", "xxx");modelAndView.setViewName("/user/index");//指定viewNamereturn modelAndView;}

  对于ModelAndView构造函数可以指定返回页面的名称,也可以通过setViewName方法来设置所需要跳转的页面;

2.Model

  一个模型对象,主要包含spring封装好的model和modelMap,以及java.util.Map,当没有视图返回的时候视图名称将由requestToViewNameTranslator决定;

3.ModelMap

待续

4.Map

@RequestMapping(method=RequestMethod.GET)public Map<String, String> index(){Map<String, String> map = new HashMap<String, String>();map.put("1", "1");//map.put相当于request.setAttribute方法return map;}

   响应的view应该也是该请求的view。等同于void返回。

5.View

  这个时候如果在渲染页面的过程中模型的话,就会给处理器方法定义一个模型参数,然后在方法体里面往模型中添加值。

6.String

  对于String的返回类型,笔者是配合Model来使用的。

@RequestMapping(method = RequestMethod.GET)public String index(Model model) {String retVal = "user/index";List<User> users = userService.getUsers();model.addAttribute("users", users);return retVal;}

  或者通过配合@ResponseBody来将内容或者对象作为HTTP响应正文返回(适合做即时校验);

@RequestMapping(value = "/valid", method = RequestMethod.GET)@ResponseBodypublic String valid(@RequestParam(value = "userId", required = false) Integer userId,@RequestParam(value = "logName") String strLogName) {return String.valueOf(!userService.isLogNameExist(strLogName, userId));     }

  返回字符串表示一个视图名称,这个时候如果需要在渲染视图的过程中需要模型的话,就可以给处理器添加一个模型参数,然后在方法体往模型添加值就可以了。如果返回的是对象则会产生一个默认的视图,然后将返回的对象直接解析成JSON,默认视图+JSON生成正文返回。

7.Void

  当返回类型为Void的时候,则响应的视图页面为对应着的访问地址

@Controller
@RequestMapping(value="/type")
public class TypeController extends AbstractBaseController{@RequestMapping(method=RequestMethod.GET)public void index(){ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("xxx", "xxx");}
}

  返回的结果页面还是:/type

  这个时候我们一般是将返回结果写在了HttpServletResponse 中了,如果没写的话,spring就会利用RequestToViewNameTranslator 来返回一个对应的视图名称。如果这个时候需要模型的话,处理方法和返回字符串的情况是相同的。

三、Jackson json 处理全大写或不规范的JSON

  通过对API的研究可以通过@JsonProperty以及@JsonAutoDetect来实现。

  具体参考:http://energykey.iteye.com/blog/2146445

ALL 
          This pseudo-type indicates that all of real types are included
CREATOR 
          Creators are constructors and (static) factory methods used to construct POJO instances for deserialization
FIELD 
          Field refers to fields of regular Java objects.
GETTER 
          Getters are methods used to get a POJO field value for serialization, or, under certain conditions also for de-serialization.
IS_GETTER 
          "Is getters" are getter-like methods that are named "isXxx" (instead of "getXxx" for getters) and return boolean value (either primitive, or Boolean).
NONE 
          This pseudo-type indicates that none of real types is included
SETTER 
          Setters are methods used to set a POJO value for deserialization.

四、SpringMVC接收JSON对象

  我做的是将form的数据转成json数据,然后发送到后台,后台是SpringMVC。

  SpringMVC

<mvc:annotation-driven><mvc:message-converters register-defaults="true"><!-- 将StringHttpMessageConverter的默认编码设为UTF-8 --><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8" /></bean><!-- 将Jackson2HttpMessageConverter的默认格式化输出设为true --><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="prettyPrint" value="true"/></bean>            </mvc:message-converters></mvc:annotation-driven>

  注意:这两个Converter很是重要,他们可以帮助我们将Json数据转换成java对象。

  Controler

@Controller
@RequestMapping(value="/hjzgg/message")
public class MessageDemo {@RequestMapping(method = RequestMethod.POST)public @ResponseBody String sendMessage(@RequestBody MyAddress myAddress, HttpServletRequest request){return "hjzgg";}
}

  js

function sendMessage(){var formData = $("#messageForm").serializeArray(); //自动将form表单封装成json
      console.log(JSON.stringify(formData));$.ajax({ type:"POST", url:"hjzgg/message", dataType:"json",      contentType:"application/json",               data:JSON.stringify(formData), success:function(response){ alert(response);},error:function(response){alert(response);}});
}

  开始的时候总是出现 400 (Bad Request)这个错误,  出现这个错误的原因一般最常见的就是后台的实体类bean与前台穿过的类型不匹配。然后我打印了一下上述方式生成的json,发现数据格式竟然是这样子的:

[{"name":"phoneNumber","value":""},{"name":"eMail","value":""},{"name":"appId","value":""},{"name":"title","value":""},{"name":"content","value":""},{"name":"isMailtTemplate","value":"false"}]

  相信如果不仔细看的话,还以为是对的。仔细一看,怎么表单的name属性和value属性怎么出现在这个Json对象里了。这怎么能成功的和后台交互呢?

  于是改了一下,js如下:

function serializeJson(){var serializeObj={};  var array=$("#messageForm").serializeArray();$(array).each(function(){  if(serializeObj[this.name]){  if($.isArray(serializeObj[this.name])){  serializeObj[this.name].push(this.value);  }else{  serializeObj[this.name]=[serializeObj[this.name],this.value];  }  }else{  serializeObj[this.name]=this.value;   }  });  return serializeObj;
}function sendMessage(){var formData = serializeJson();console.log(JSON.stringify(formData));$.ajax({ type:"POST", url:"hjzgg/message", dataType:"json",      contentType:"application/json",               data:JSON.stringify(formData), success:function(response){ alert(JSON.stringify(response));},error:function(response){alert(JSON.stringify(response));}});
}

  最终打印的数据:

  {"phoneNumber":"","eMail":"","appId":"","title":"","content":"fsdfsd","isMailtTemplate":"false"}

  这才是正解啊。

五、 fastjson 中的 SimplePropertyPreFilter(JSON的字段过滤)

http://blog.csdn.net/yongjiandan/article/details/8308793

Iterable<BaseEtype> baseEtypes = baseEtypeService.getBaseEtypes(enumId);
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(BaseEtype.class);
filter.getExcludes().add("baseEnum");
String index = JSON.toJSONString(baseEtypes, filter);

六、自定义Bean数据解析

  <mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8" /><property name="writeAcceptCharset" value="false" /></bean><beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="prettyPrint" value="true" /></bean></mvc:message-converters></mvc:annotation-driven>

 

  后台自定义Bean (注意:不要写成内部类,要写成单独的一个类。内部类可能报错,Json转对象失败:"No suitable constructor found for type [simple type, class com.test.faster.domain.respons ,即使定义了构造方法。)

public class SaveRoleAppBtnVO{private List<RoleAppBtnVO> vos;private String roleId;public List<RoleAppBtnVO> getVos() {return vos;}public void setVos(List<RoleAppBtnVO> vos) {this.vos = vos;}public String getRoleId() {return roleId;}public void setRoleId(String roleId) {this.roleId = roleId;}
}

转载于:https://www.cnblogs.com/hujunzheng/p/5293050.html

SpringMVC那点事相关推荐

  1. MVC架构和SSM框架的个人理解

    MVC架构和SSM框架的个人理解 前言 一.原生JavaWeb对应MVC架构 二.SSM框架对应MVC架构 第一块内容(MyBatis): 第二块内容(Spring): 第三块内容(SpringMVC ...

  2. MyBatis和SpringMVC集成事务在Junit测试下有效但是在实际项目无效的问题

    一.问题说明 项目框架采用SSM,集成了事务回滚(方式见下),在单元测试的时候,测试事务是有效的,但是在实际项目上线的时候,却没有效果. 二.集成方式 application-mybatis.xml( ...

  3. 面试系列-SpringMVC那些事(一)

    1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于MVC架构的用来简化web应用程序开发的应用开发框架,它是Spring的一个模块,无需中间整合 ...

  4. SpringMVC启动分析

    以下分析基于JDK1.8 启动的第一步是执行监听器,这里web.xml中配置了一个监听器org.springframework.web.context.ContextLoaderListener 接下 ...

  5. struts1-2,springMVC原理基本对比(单例,多例)-servlet与filter区别

    2019独角兽企业重金招聘Python工程师标准>>> 最近做项目用到了struts2,之前一直是用struts1和springMVC.感觉到了struts2从很大程度上和这两个还是 ...

  6. 浅析 SpringMVC 中返回对象的循环引用问题

    问题发现 今天这个话题还是比较轻松的,可能很多朋友也都遇到过这个问题. @RestController.@ResponseBody 等注解是我们在写 Web 应用时打交道最多的注解了,我们经常有这样的 ...

  7. SpringInAction--Spring Web应用之SpringMvc 注解配置

    Spring MVC 是当前Web服务器中常用的结构,今天就来学习这相关的知识,首先上图--Spring请求的时候所经历的坎坷之路: (书上原话,算是解释..) 在请求离开浏览器时① ,会带有用户所请 ...

  8. SpringMVC+Hibernate+Junit4+json基本框架近乎0配置

    公司是做APP开发的,须要后台来提供接口,于是乎,这个任务就交给我,经过重复的尝试,学习和參考别人的demo,最终搭出自己还算惬意的框架.SpringMVC+Sping3+Hibernate4+Jun ...

  9. SpringMVC学习(二)——SpringMVC架构及组件(及其运行原理)

    相信大家通过前文的学习,已经对SpringMVC这个框架多少有些理解了.还记得上一篇文章中SpringMVC的处理流程吗?    这个图大致描述了SpringMVC的整个处理流程,这个流程图还是相对来 ...

最新文章

  1. 软件工程需求设计说明书
  2. 12、HTML DOM
  3. 为什么调用webservice接口只有 string arg0_快速开发平台中关于支持第三方接口开发的指导
  4. 【报告分享】2020中国直播电商行业研究报告.pdf(附下载链接)
  5. 英特尔玩VR有多认真?看看Project Alloy的细节就知道了
  6. ubuntu 14.04配置lamp粗略
  7. windows 查询域名DNS解析
  8. 数据库系统概论第五版第二章习题6(SPJ数据库查询操作)
  9. 详解oracle多种表连接方式,详解Oracle多种表连接方式
  10. 有参组装新转录本cufflinks_转录组组装软件stringtie
  11. 已知三角形三边求面积的c语言程序,已知三角形三边分别为4,5,6,求三角形的面积。用c语言编写程序...
  12. 万里汇WorldFirst个人和企业帐户注册教程(送$25+1%提现费)
  13. js中eq neq gt gte lt lte分别是什么意思
  14. BTC系列 - 用docker搭BTC Testnet
  15. 本周比赛一些感想(5.25~5.31)
  16. R语言安装包出现 Error in loadNamespace(j - i[[1L]], c(lib.loc, .libPaths())错误
  17. 小市值(股票)——Python量化
  18. c#程序操作文件进行压缩和解压
  19. 综述论文:深度学习在心脏图像分割的应用
  20. 记一次坎坷的算法需求实现:轻量级人体姿态估计模型的修炼之路(附MoveNet复现经验) 收藏

热门文章

  1. 7读不出来卡显示无服务器,win7识别不了网络如何解决_win7显示未识别网络的处理方法...
  2. SprinBoot 集成 Flowable 工作流引擎镜像制作
  3. Redis-6.2.5 安装 Linux环境(单机)
  4. flowable实战(十一)flowable 删除数据库表先后顺序
  5. JAVA的方法的定义和调用
  6. php cms专题,在phpcms中给专题每个不同分类设置独立模板
  7. angular7.2构建包如何兼容ie_Python 小技巧:如何实现操作系统兼容性打包?
  8. 希捷银河声音大_【推仔说新闻】那款硬盘它终于来了 希捷推出首款双磁臂硬盘...
  9. python批量合并csv_如何在Python中通过多个列合并两个CSV文件
  10. linux子进程父进程例子,linux 子进程访问父进程