SpringMVC那点事

简介:

v一、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对象。

v二、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 来返回一个对应的视图名称。如果这个时候需要模型的话,处理方法和返回字符串的情况是相同的。

v三、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.

v四、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"}

  这才是正解啊。

 

 

v五、 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);
目录
相关文章
|
网络协议 Shell 应用服务中间件
acme.sh使用教程
安装 安装 acme.sh安装很简单, 一个命令: curl https://get.acme.sh | sh普通用户和 root 用户都可以安装使用。 会安装在 ~/.acme.sh/ 目录下,以后生成的证书也会在这里面,按照域名为文件夹安置。
16375 2
|
11月前
|
弹性计算 Ubuntu Linux
阿里云系统运维管理OOS一键安装宝塔面板,这个功能太牛了!
宝塔面板是实用的服务器管理工具,支持多种操作系统(如Ubuntu、CentOS等)。通过阿里云OOS可一键安装。安装前提包括ECS实例运行中且有公网,安全组需开放8888端口。安装步骤简单,进入ECS控制台选择预装应用并确认下单,完成后在控制台查看详情和登录信息。最后验证安装结果,确保能成功访问宝塔面板URL。
535 82
|
存储 网络协议 算法
OSPF中的Link-State Database (LSDB): 概述与深入解析
OSPF中的Link-State Database (LSDB): 概述与深入解析
1639 1
|
开发工具
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
阿里云点播服务web播放器sdk,短剧视频类App实现参考。仿抖音 仿陌陌 短视频 无限滑动播放 视频流。无uniapp video 原生组件的层级、遮挡、覆盖问题,适合与不同功能视图组合使用,实现丰富的应用功能。
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
|
机器学习/深度学习 算法 5G
|
自然语言处理 JavaScript 前端开发
什么是词法作用域
【10月更文挑战第12天】什么是词法作用域
|
弹性计算 并行计算 Shell
在云上搭建CosyVoice环境-保姆级教程
发现个好玩的模型,阿里最近开源的,可以便捷的复刻人声,本文提供全套安装过程。仓库地址:https://github.com/FunAudioLLM/CosyVoice。
5701 1
|
监控
揭秘:为何多年经验的网工还对光模块的光衰正常范围一知半解?这个秘密可能彻底改变你的网络优化策略!
【8月更文挑战第19天】在信息化时代,光纤通信至关重要,光模块作为其核心组件,其性能直接影响数据传输质量。光衰,即光信号在光纤中传输时的功率损失,是评估光模块性能的关键指标。本文将阐述光衰的基本概念、测量方法及对网络性能的影响,并提供光衰正常范围的标准,帮助网络工程师更好地理解与应用这一重要知识点,确保网络稳定可靠。
2877 0
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
347 0
|
SQL 算法 Java
百万级别数据Excel导出优化
这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出。
1322 0
百万级别数据Excel导出优化