Spring MVC 使用ajax时,控制器无法获取客户端参数

hoodlake 发布于 2013/04/02 22:06
阅读 10K+
收藏 5

最近在使用学习SpringMVC,因为比较喜欢使用ajax,所以研磨了下Spring 3.1MVC里对ajax的支持,但是发现了一个问题在页面上使用客户端使用post请求:
        $.ajax({
                url:"/jweb/account?"+"name=tom&password=123456",
                type: 'post',
                contentType: 'application/json',
                dataType:"text",
                success:function(data){
                    
                    alert(data);
                },
                error:function(data){
                    
                    alert(data);
                }
            });
使用以上方式,controler可以正确获取参数,但是采用下面的方式就不行,我试过了很多种入参的写法,都无法获取参数,都是null
        $.ajax({
                url:"/jweb/account",
                type: 'post',
                contentType: 'application/json',
                dataType:"text",
                data:{
                    "name":"tom",
                    "password":"123456"
                }
                success:function(data){
                    
                    alert(data);
                },
                error:function(data){
                    
                    alert(data);
                }
            });

说实在的,我觉得SpringMVC真的好强大,其他mvc框架真的是没法比拟的,但是为什么会有这么郁闷的问题?很让人纠结,Google下,发现很多人都出现过这个问题!但是除了把参数写在URL后面,没有其他的解决方案,目前使用的是tomcat服务器,也有人说这是Spring的bug,web容器换成jetty就没有这个问题。我没有尝试过换web容器,我也不想换
我还下了Spring官方网站上的ajax的例子,是一个maven项目,但是也有这个参数无法正确获取的问题!请高手指点指点

贴上服务器端代码:
    @RequestMapping(method=RequestMethod.POST)
    public @ResponseBody void doRegister(
            HttpServletRequest request,HttpServletResponse response)
            throws Exception{

        String name = WebUtils.findParameterValue(request, "name");
        String password = request.getParameter("password");
        
        System.out.println(request.getContentType());
        User user = new User(name,password);
        System.out.println(user.toString());
        if(!accountService.checkRepeatUser(user)){
            try{
                
                accountService.createUser(user);
                response.getWriter().write("{\"su    cc  ess\"}");
            }catch(Exception e){
                
                System.out.println(user.toString()+"fsdfdsf");
                response.getWriter().write("{\"err  or\"}");
            }
        }
        
    }

加载中
0
逝水fox
逝水fox

contentType: 'application/json', 这句去掉,这句是描述请求包内容格式的,你应该采用默认的application/x-www-form-urlencoded才能正确被服务器解析

楊家家主
楊家家主
哈。我也是这个问题。
y
yhlllq
谢谢,弄了一上午终于找到答案了
美洲象
我用的json 也不行!!
美洲象
太牛 X了,我整了好长时间!!! 能解释一下原因么?
逝水fox
逝水fox
回复 @hoodlake : application/json好像是发给ASP.net的
下一页
1
Mr_Qi
Mr_Qi
可以的,上代码为证~~~
$.ajax({
                type: "POST",
                url: "/forum/members/smsList/box", //此处是需要访问后台的哪个文件的哪个方法
                data: {
					"msgId":function(){
						return msgId;
					}
				},
                dataType: 'json', //固定的格式,不需要太多关注
                success: function(result){
					
                   if(result===true){
				   	var count=$("#sms_unread").text()-1;
				   	$("#sms_unread").text(count<=0?0:count);
				   	$("#sms_"+msgId).attr("unread","N");
					$("#sms_"+msgId).parent().css("font-weight","normal");
					
				   }
				   else if(result===false){
				   	
				   }
                },
                error: function(result){
                    alert("error" + result);
                }
            });
@RequestMapping(value = "/smsList/box", method = RequestMethod.POST)
	@ResponseBody
	public boolean readShortMsg(Model model, String msgId,
			HttpServletRequest request) {
		if (shortMessageService.readShortMsg(msgId)) {
			return true;
		}
		return false;
	}
dispatcher.xml引入json解析resolver
<!-- json配置 -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<bean
					class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
			</list>
		</property>
	</bean>


0
Mr_Qi
Mr_Qi
以上代码是我使用过的~~~
hoodlake
hoodlake
多谢,问题解决了,多了contentType:"application/json",去掉就好了
0
hoodlake
hoodlake
哈哈,好感动啊,刚提问题就有人回答,我试试,多谢
0
倪闯
倪闯

 dataType:"text",

text改成json不可以吗?

hoodlake
hoodlake
这个当然不行,text:json是说服务器返回给客户端的是json数据,跟我发送数据到服务器端毫无关系
返回顶部
顶部