注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

让一切都逝去吧

排骨炖泥菜/猪肝炒苹果/鱼籽狗肉汤/狗头薏米汤

 
 
 

日志

 
 

spring mvc 提交数组等复杂类型  

2013-12-05 23:55:00|  分类: spring mvc |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      使用jquery提交,比如monthIncome的值是一个数组,在Java里用request.getParameterValues("monthIncome");取不到值,要这样才行request.getParameterValues("monthIncome[]")。
如果使用struts又不一样,这时在提交前加上
$.ajaxSettings.traditional = true;就不会出错,见http://stackoverflow.com/questions/3508550/http-array-parameters-with-struts-2-via-an-ajax-call:

下面来看spring mvc
get 方式

提交{param: [1,2,3]},在浏览器下面看到的提交参数有
param[]:1
param[]:2
param[]:3
接收@RequestParam(value = "param[]") int[] param
或request.getParameter("param"),可以正常接收数组
String类型的param也可以,得到就是用逗号拼起来的字符串"1,2,3"

提交{param: [{a:1, b:"yellow"},{a:2, b:"red"},{a:3, b:"green"}]}
param[0][a]:1
param[0][b]:yellow
param[1][a]:2
param[1][b]:red
param[2][a]:3
param[2][b]:green
报400错误,在$.ajax请求钱加上这句
$.ajaxSettings.traditional = true;
在浏览器下面看到的提交参数变成
param:[object Object]
param:[object Object]
param:[object Object]
同样报报400错误

想提交的对象是
var requesParam = {param: [{a:1, b:"yellow"},{a:2, b:"red"},{a:3, b:"green"}]};
JSON.stringify 把一个对象转换成json字符串,JSON.parse 把一个json字符串解析成对象。使用JSON.stringify(requesParam)这样的提交方式是没有什么改善的。
有提到另一个序列化的库
use gserializer:
http://www.onegeek.com.au/articles/programming/javascript-serialization.php
the code in google :
http://code.google.com/p/gserializer/
var serializer = new ONEGEEK.GSerializer();
var serializerParam = serializer.serialize(requesParam, "param");
同样无效。最后改成这样的格式
var requesParam = "param[0].a=1&param[0].b=XXX&param[1].a=2&param[1].b=yyy";
提交
$.ajax({
                type: "GET",
                url: "say.htm",
                data: requesParam,
                success: function(data) {
                    console.log(data);
                }
            });
java端用一个vo封装请求参数
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class Server {
    @RequestMapping(value = "/say", method = {RequestMethod.GET, RequestMethod.POST})
    @ResponseBody
    public String say(@ModelAttribute ParamWrapper param, HttpServletRequest request) {
        System.out.println(request.getParameter("param"));
        System.out.println("param using spring : " + param);
        return "say";
    }
}

import java.util.List;

public class ParamWrapper {
    private int level;
    private List<Color> param;

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public List<Color> getParam() {
        return param;
    }

    public void setParam(List<Color> param) {
        this.param = param;
    }
    
}

public class Color {
    private int a;
    private String b;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }
    
}

这里请求参数要使用@ModelAttribute,使用@RequestParam会报错。post方式情况相同,其中这跟请求方式无关。

      这里附录让Controller标签生效的最小dispatcher-servlet.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          p:prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />
    
    <context:component-scan base-package="com.xxx.example" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <mvc:annotation-driven/>
    
</beans>

  评论这张
 
阅读(22374)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017