在编程过程中,最容易出现问题及卡壳的地方,往往是各层之间接缝处,接缝处往往存在着各种各样的参数传递,数据转换和格式化,参数很好的传递并正确接收过来之后就是复杂逻辑之间的处理了,所以为了避免多种问题占用时间,提高编程效率故而做此总结,此处jsp和springmvc'后台controller间参数的传递、数据转换是各层间传递关键处的关键,把握好此处,就能高效很多。

首先:前台传递数据的主要形式和类型大概有以下几点:

  传递形式有:a标签的url,表单传递,ajax类型传递

  传递类型有:字符串,对象,数组,json,xml等

在数据传递时,往往是在某一种传递形式下传递某一类型的数据,故而,之后的总结就按照传递形式来进行:

1.a标签url请求传递往往是地址+参数(字符串、对象等)的形式,比如www.baidu.com?id=123456&name=zhangsan&password=666666,传递方法是get;此形式传递往往以基本数据类型进行传递。

2.表单请求传递,通常是以action为地址进行传递,传递方法采用post,其中有二进制数据如上传文件,需要更改属性enctype=“multipart/form-data”;此形式传递主要以基本数据类型或对象进行传递。

3.ajax请求传递,主要以ajax所特有的形式进行传递,通常传递方法根据要求选择post或者get,穿的数据类型MINI都可以,相应参数也要进行设置,本篇主要说说json和数组吧,后续根据情况补充,因为ajax本身也算是一个独立的技术。

其次:后台controller接收数据,对于接收参数在表现上主要是注解的应用,故而,以下主要是介绍以下注解作用

controller接收数据往往是通过注解进行反射接收,所有不同形式不同类型的数据一定要采用正确的注解。

一、url和表单传参相对常规,主要用的注解就是@RequestParam,@ModelAttribute,@PathVariable

@RequestMapping(value="对应请求的url",method=RequestMethod.(大写GET/POST/PUT/DELET等)--不写代表支持所有方式的请求)

@RequestParam(value=""),意义是:将制定的请求参数赋值给方法中的形参,主要绑定接收url非对象参数或者是对象中各个具体字段参数(如方法中形参列表中列出对象中的某几个)。

@PathVariable 方便的获得请求url中的动态参数,但是仅仅支持一个属性值(就是该注解只有value一个属性),类型为String。

@ModelAttribute 注解作用是将请求参数绑定到Model对象上,只支持一个属性value,类型为String,该注解作用可以理解为将请求参数设置到Model中,这样当返回一个界面后就可以从Model中取得相应的值。

  该注解的使用特别注意一点:被@ModelAttribute注解的方法会在整个Controller中每个方法前被执行,因此在一个Contrller映射到多个URL时,要谨慎使用,因此这个特点,所以可能不常用。常用的会是注解方法中的某个参数用来传递POJO

  (基于红色字体,往往采用该注解的controller中只有两个方法,一个是被注解的该方法,另一个则是请求的实际url的方法)该注解使用的方式比较多主要有:

@ModelAttribute(value="")注释返回具体类的方法,其中value的值用来指定model的属性名称,而形参注解用@RequestParam(value="")绑定请求参数,@model属性值往往是被注解方法的返回值。

@ModelAttribute注解Void返回值的方法,形参中需要Model来设置请求的信息,采用model.addAttribute("",value),不需要return语句,跳转后可以通过request作用域访问到相应数据。

@ModelAttribute注释返回具体类的方法,这里model属性没有被指定,被注解的方法返回类型隐含表示,如果备注解方法返回的是User类型,name这个model属性名称就是user。

@ModelAttribute和@RequestMapping一同使用时注解一个方法,此时返回值不是视图名,而是Model的属性值,视图名称是RequestMapping的value值。

@ModelAttribute注解一个方法的参数(非被注解的方法形参),主要作用可以理解为,在非被注解方法中修改Model的相关属性。也可以作为接收表单传递的pojo

最终在跳转后都能够通过request作用域访问到相应数据。

二、ajax参数传递

ajax传递参数主要有基本数据类型、基本对象类型(不含集合等)、特殊对象类型(含集合)、数组类型和json类型。经常用json的方式传递

要使用json,首先需要对应支持的js文件和jar包,

json2.js放入相应工程中,并且在jsp页面引入路径

jackson-core

jackson-databind

ajax传递参数及接收很多童鞋已经总结的挺到位,以下借鉴一下直接拿来,以免不好找.

参考1、http://blog.csdn.net/Huangcsdnjava/article/details/76072795

这里有@ResponseBody和@RequestBody 是很好很重要的两个注解

@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON。 
@RequestBody 注解前台只需要向 Controller 提交一段符合格式的 JSON,Spring 会自动将其拼装成 bean。 
Spring这个转换是靠org.codehaus.jackson这个组件来实现的,所有需要引入jackson-core-asl和org.codehaus.jackson两个jar包

通过ajax传递参数给springmvc,经常会因为 参数类型太复杂,或者根本不知道springmvc都支持哪些类型转换,导致后台接收出现各种问题。如果书写格式没有问题仍然接受参数报错,大部分是因为springmvc默认无法支持该种格式的json转换导致的
现在一句话解决,就是用@RequestBody注解接收

案例1:简单数组 idList[]

ajax

$("#test1").on("click",function(){
                var idList = new Array();
                idList.push("1");
                idList.push("2");
                idList.push("3");
                $.post("/mvc/client1/test1",{idList:idList})
            });

java

/**
     * 简单类型list
     * explain:包含string int date 等属性
     */
    @RequestMapping("/test1")
    @ResponseBody
    public void test1(@RequestParam("idList[]") List<Integer> idList){
        for(Integer i: idList){
            System.out.println(i);
        }
    }

案例1中要注意,当你ajax传递一个很简单的数组,本以为后台能够接受到,却总是报错,很可能的原因是:http请求传递数组的时候,为了区别是一个数组,会在数组名称后面加上中括号“[]”,所以后台接受的时候用@RequestParam告诉方法,你要的idList实际上是idList[]就可以了

案例:2:简单对象User (包含id,username)

ajax

$("#test2").on("click",function(){
                var id          =1;
                var username    ="fangxin";
                $.post("/mvc/client1/test2",{id:id,username:username,birthday:new Date()})
            });

java

@RequestMapping("/test2")
    @ResponseBody
    public void test2(User user){
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getBirthday());
    }

这就是最常见的传递参数,如果一个对象的属性都是简单类型,那基本没什么问题

案例3:复杂对象User (包含id,username,String[],List<Person>)

ajax

$("#test3").on("click",function(){
                var user = {
                    id:1,
                    username:"fangxin",
                    birthday:new Date(),
                    luckyNums:[1,2,3],
                    friends:[
                        {name:"zhangsan"},
                        {name:"lisi"}
                    ]
                };
                $.ajax({
                    type: "POST",
                    url:"/mvc/client1/test3",
                    data: JSON.stringify(user),
                    contentType:"application/json"
                })
            });

java

/**
     * 复杂对象
     * explain:包含简单list属性、对象list属性
     */
    @RequestMapping("/test3")
    @ResponseBody
    public void test3(@RequestBody User user){
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getBirthday());
        for(Integer i:user.getLuckyNums()){
            System.out.println(i);
        }
        for(Person p:user.getFriends()){
            System.out.println(p.getName());
        }
    }

案例3中的User的属性相当复杂,有简单数组,还有包含对象的复杂List,这样的user如果用案例2的方式接受,肯定就挂了。此时,最好是前台stringify转换成json字符串,后台用@RequestBody接受自动转换成想要的数据格式。

案例4:复杂List<User>

ajax

$("#test5").on("click",function(){
                var users = [];
                for(var i=0;i<10;i++){
                    var user = {
                        id:1,
                        username:"fangxin",
                        birthday:new Date(),
                        luckyNums:[1,2,3],
                        friends:[
                            {name:"zhangsan"},
                            {name:"lisi"}
                        ]
                    };
                    users.push(user);
                }
                $.ajax({
                    type: "POST",
                    url:"/mvc/client1/test5/",
                    data: JSON.stringify(users),
                    contentType:"application/json"
                })
            });

java

/**
     * 复杂List
     */
    @RequestMapping("/test5")
    @ResponseBody
    public void test5(@RequestBody List<User> users){
        for(User user:users){
            System.out.println(user.getUsername());
        }
    }

参考2、http://www.jb51.net/article/118659.htm   在此基础上对数组进行修改

基础类型

如果传递的json数据为基础类型(Int,String等)的话,则只需要用@RequestParam标注方法中的参数就行了。

ajax代码

$.ajax({
 url : "someurl",
 type : "POST",
 dataType : "JSON",
 data : {"name":"test""password":"testpassword"}, 
 success : function (data) {
  console.log(data)
 }
})

java代码

@RequestMapping("someurl")
public @ResponseBody SomeData basicType(@RequestParam String name, @RequestParam String password){
 //具体方法
}

在这里@ResponseBody说明返回的是一个对象。@RequestParam的用法还很多,具体可以去参考springmvc的文档

简单的对象类型

简单的对象类型是指,在对象中不包含复杂的数据结构类似于list,map等。在这里可以使用标签@ModelAttribute来直接将JSON数据封装成对象。

假设我们有一个用户对象,用户的属性包括name,age

public class User{
 private String name;
 private int age;
 //getters and setters
}

ajax传输的数据如下

$.ajax({
 url : "someurl",
 type : "POST",
 dataType : "JSON",
 data : {
  'name : 'test',
  'age' : 10
 },
 success : function (data) {
  console.log(data)
 }
})

controller中的代码如下

@RequestMapping("someurl")
public @ResponseBody SomeData objects(@ModelAttribute User user){
//具体方法
}

springmvc 暂时不支持接收并生成多个modelAttribute

数组类型

有些情况下,可能需要传递一组相同类型的数据,比如添加一组用户的信息。这是可以通过ajax传递一个数组给controller方法。具体情况可以参考

见我的随笔另一个,一天的成果啊

这个回答给的非常的详细具体,需要补充的是,接收端的数据结构无论是List<T>或是T[]都可以成功获得数组数据。

复杂的对象

但是上面的方法有一个问题,就是只能接收纯数组数据。假设一个对象,比如用户,该用户下的属性除了包含name(名称),age(年龄)之外,还有一个联系方式属性contacts(List<String>) ,如何才能将既包含基本类型又包含数组类型的JSON数据直接封装成对象呢?这里就需要标签@RequestBody

ajax代码如下,需要注意的是,这里需要用JSON.stringfy()方法将json数据转化成字符流,添加至requestbody中。且在ajax方法中必须指明contentTypedataType属性。

public class User{
 private String name;
 private int age;
 private List<String> contacts;
 //或是 private String[] contacts;
 //getters and setters
}
$.ajax({
 var user = {
  'name' 'test',
  'age ' : 10,
  'contacts' : ['12313','123213123']
 }
 url : "someurl",
 type : "POST",
 dataType : "JSON",
 contentType:"application/json",
 data : JSON.stringify(user),
 success : function (data) {
  console.log(data)
 }
})

java代码如下

@RequestMapping("someurl")
public @ResponseBody SomeData complicateObject(@RequestBody User user){
 //方法详情
}

jsp与spring mvc后台controller间参数传递处理之总结的更多相关文章

  1. Spring mvc框架 controller间跳转 ,重定向 ,传参

     一.需求背景     1. 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示.   @Req ...

  2. Spring MVC 之@Controller@RequestMapping详解

    一:配置web.xml 1)问题:spring项目中有多个配置文件mvc.xml   dao.xml 2)解决:在web.xml中 <init-param> <param-name& ...

  3. 如何开始创建第一个基于Spring MVC的Controller

    万事开头难,良好的开端是成功的一半! 以下示例怎么开始创建我们的第一个Spring MVC控制器Controller 1.新建一个java类,命名为:MyFirstController,包含以下代码, ...

  4. 针对spring mvc的controller内存马-学习和实验

    1 基础 实际上java内存马的注入已经有很多方式了,这里在学习中动手研究并写了一款spring mvc应用的内存马.一般来说实现无文件落地的java内存马注入,通常是利用反序列化漏洞,所以动手写了一 ...

  5. spring mvc在Controller中获取ApplicationContext

    spring mvc在Controller中获取ApplicationContext web.xml中进行正常的beans.xml和spring-mvc.xml的配置: 需要在beans.xml中进行 ...

  6. Spring MVC Test -Controller

    http://www.petrikainulainen.net/programming/spring-framework/unit-testing-of-spring-mvc-controllers- ...

  7. Spring MVC中Controller如何将数据返回给页面

    要实现Controller返回数据给页面,Spring MVC 提供了以下几种途径: ModelAndView:将视图和数据封装成ModelAndView对象,作为方法的返回值,数据最终会存到Http ...

  8. spring mvc 注解@Controller @RequestMapping @Resource的详细例子

    现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过 ...

  9. 0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter

    浏览器与服务器之间的数据交换有很多类型,不只是表单提交数据这一种,比如ajax技术就大量使用json.xml等,这时候就涉及到浏览器端和服务器端数据格式转换的问题,服务器端都是Java对象,需要把请求 ...

随机推荐

  1. Java后端 带File文件及其它参数的Post请求

    http://www.roak.com Java 带File文件及其它参数的Post请求 对于文件上传,客户端通常就是页面,在前端web页面里实现上传文件不是什么难事,写个form,加上enctype ...

  2. python第三方库介绍

  3. Windows API 常用函数---转载

    Windows API 常用函数 2014-10-15 14:21  xiashengwang  阅读(2105)  评论(0)  编辑  收藏 .Net中虽然类库很强的,但还是有些时候功能有限,掌握 ...

  4. mybatis注解中写SQL语句

    参考: https://blog.csdn.net/gebitan505/article/details/54929287/https://blog.csdn.net/KingBoyWorld/art ...

  5. 新闻网大数据实时分析可视化系统项目——14、Spark2.X环境准备、编译部署及运行

    1.Spark概述 Spark 是一个用来实现快速而通用的集群计算的平台. 在速度方面, Spark 扩展了广泛使用的 MapReduce 计算模型,而且高效地支持更多计算模式,包括交互式查询和流处理 ...

  6. tomcat#结构

    下面是一个tomcat的配置文件,通过分析tomcat配置文件的结构,和相关注释,可以大致了解tomcat的结构 <?xml version="1.0" encoding=& ...

  7. 2019护网杯baby_forensic

    题目名称:baby_forensic题目描述:can you catch the flag?附件:“data.7z” 2019护网杯初赛的一道取证题,比赛时没做出来,赛后又研究了一下. 获取profi ...

  8. 「NOIP2014」飞扬的小鸟

    传送门 Luogu 解题思路 考虑 \(\text{DP}\) 设 \(dp[i][j]\) 表示飞到 \((i, j)\) 这个点的最小触屏次数. 转移其实比较显然,但问题是每次上升时都可以点很多次 ...

  9. 「SP2713」GSS4 - Can you answer these queries IV

    传送门 Luogu 解题思路 区间开方以及区间求和. 考虑用线段树来做. 开方操作看似没有任何结合律可言,但这题有另外一个性质: 一个数的初始值不超过 \(10^{18}\) ,而这个数被开方6次左右 ...

  10. PHP几个快速读取大文件例子

    PHP几个快速读取大文件例子 感谢 把我给崩了 的投递 时间:2014-10-16 来源:三联 在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents ...