一、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");//指定viewName
modelAndView.addObject("xxx", "xxx");
return modelAndView;
} @RequestMapping(method=RequestMethod.GET)
public ModelAndView index(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("xxx", "xxx");
modelAndView.setViewName("/user/index");//指定viewName
return 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)
@ResponseBody
public 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>
<bean
class="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;
}
}

SpringMVC那点事的更多相关文章

  1. springmvc下载那些事

    文件的上传下载一般在项目中还是非常实用的,此处专门整理一下文件的下载,至于文件的上传实现将在后续中补上.文件的下载多用于模板文件的下载,这在项目中用的还是挺多的.今天用到了就整理出来了,以供搬运工们借 ...

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

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

  3. Servlet3.0与springmvc那些事

    官方文档:https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servle ...

  4. 【面试突击】- SpringMVC那些事(一)

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

  5. SpringMVC自定义处理器里的那些事

    一.如何让一个普通类成为Controller? ①:实现接口Controller 解析:handleRequest(request,response) ②:继承AbstractController 解 ...

  6. springmvc请求方法那些事

    @RequestMapping 用法详解之地址映射 (2013-08-11 16:06:58) 转载▼ 标签: it   前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式 ...

  7. SpringMVC+MyBatis整合——事务管理

    项目一直没有做事务管理,这几天一直在想着解决这事,今天早上终于解决了.接下来直接上配置步骤. 我们项目采用的基本搭建环境:SpringMVC.MyBatis.Oracle11g.WebLogic10. ...

  8. SpringMVC中定时任务配置

    在项目中使用定时任务是常有的事,比如每天定时进行数据同步或者备份等等. 以前在从事C语言开发的时候,定时任务都是通过写个shell脚本,然后添加到linux定时任务中进行调度的. 现在使用Spring ...

  9. springMVC+spring+hibernate 框架整合实例

    先说一下流程思路: 流程讲解1:首先访问会先定位到控制器.这就用到了过滤器配置文件"spring-mvc.xml".这个文件负责定义控制器的包路径.视图的格式等.其次从" ...

随机推荐

  1. 2分钟 sublime设置自动行尾添加分号并换行:

    18:03 2016/4/162分钟 sublime设置自动行尾添加分号并换行:注意:宏文件路径要用反斜杠/,2个\\会提示无法打开宏文件.不需要绝对路径很简单利用宏定义:1.录制宏:由于是录制动作宏 ...

  2. BestCoder Round #80 1002

    HDU 5666 Segment 题意:给你条斜率为-1,常数项为q(q为质数)的直线,连接原点与直线上整数格点,问你在有多少个格点在形成的无数个三角形内,而不在线段上,结果对P取模. 思路:best ...

  3. 基于synchronized 或 ReadWriteLock实现 简单缓存机制

    package cn.xxx.xxx; import java.util.HashMap; import java.util.Map; import java.util.concurrent.lock ...

  4. MAC apache配置

    启动 apache:在terminal中输入命令,sudo apachectl start 启动成功后访问lcoalhost会显示“It works”. 更改默认路径:命令行输入“sudo vim / ...

  5. mysql 怎么通过sql语句批量去掉某一个表中某一个字段的多余字符

    采用替换,把”<img src="“替换为空格," width="300" height="300" />也替换为空格,曾经在网 ...

  6. PHP常用算法

    //二维数组的按某字段来排序(从小到大排序) function number_array_sort_asc($array,$key_name){ $arr = array(); foreach ($a ...

  7. CYQ.Data V4系列全面开源(2013-08-04)

    致各位.NET开发者: 考虑到本人开源作品太多,个人维护力度有限,故自2013-08-04开始,开放原本需要授权使用的V4系列的最高版本V4.55的框架源码,同时也开放相对应的辅助工具源码,自此,V4 ...

  8. 在.NET Core中遭遇循环依赖问题"A circular dependency was detected"

    今天在将一个项目迁移至ASP.NET Core的过程中遭遇一个循环依赖问题,错误信息如下: A circular dependency was detected for the service of ...

  9. 一种让 IE6/7/8 支持 media query 响应式设计的方法

    在不同的浏览器宽度下使用不同的 CSS 声明,常见的方案是使用 media query,但这个方案不支持 IE9 以下浏览器. 国外比较流行的 UI 框架 bootstrap v3 版本中使用 med ...

  10. Python黑帽编程2.4 流程控制

    Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if …..else 先上一段代码: #!/usr/bin/python # - ...