Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 291|回复: 0

【js类库AngularJs】解决angular+springmvc的post提交问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-20 15:01:11 | 显示全部楼层 |阅读模式

    【js类库AngularJs】解决angular+springmvc的post提交问题

    AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的 是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入、等等。

    参考资料:

    angularjs中文网:http://www.apjs.net/

    angularjs官网:http://angularjs.org

     

    写此文的背景:在学习使用angular的$http.post()提交数据时,后台接收不到参数值。

        于是查阅了相关资料(写的最好的唯有此文http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/)。

    写此文的目的:通过上面提到的文章中的解决之道,结合自己的经验,总结了如下发现。

    前端:html,jquery,angular

    后端:java,springmvc

    一、平常使用的post提交和接收方式

    前端使用jquery提交数据。

    $.ajax({
        url:'/carlt/loginForm',
        method: 'POST',   
        data:{"name":"jquery","password":"pwd"},
        dataType:'json',
        success:function(data){
            //...
        }
    });

    后端java接收:

    @Controller
    public class UserController {
        @ResponseBody
        @RequestMapping(value="/loginForm",method=RequestMethod.POST)
        public User loginPost(User user){
            System.out.println("username:"+user.getName());
            System.out.println("password:"+user.getPassword());
            return user;
        }
    }

    model(不要忘记get、set方法):

    public class User {
        private String name;
        private String password;
        private int age;
        
        //setter getter method
    
    }

    后台打印:

    username:jquery
    password:pwd

    调用接口查看到的前端返回结果:

    二、使用angularJs的post方法提交

    <div ng-app="myApp" ng-controller="formCtrl">
      <form novalidate>
        UserName:<br>
        <input type="text" ng-model="user.username"><br>
        PassWord:<br>
        <input type="text" ng-model="user.pwd">
        <br><br>
        <button ng-click="login()">登录</button>
      </form>
    </div>

    js代码:

    var app = angular.module('myApp', []);
    app.controller('formCtrl', function($scope,$http) {
        $scope.login = function() {
            $http({
                url:'/carlt/loginForm',
                method: 'POST',            
                data: {name:'angular',password:'333',age:1}      
            }).success(function(){
                console.log("success!");
            }).error(function(){
                console.log("error");
            })
        };
    });

    后台打印结果:

    username:null
    password:null

    查看前端:

     

    三、解决angular提交post问题。

    相信看过上面提到的哪怕文章的人已经知道怎么解决问题了吧。文中是更改了angular的提交方式,使得angular的提交数据方式更像jquery的。

    我试过,也是行得通的。然后我又试了另外一种方式。如下:

    前端不变,依然是:

    var app = angular.module('myApp', []);
    app.controller('formCtrl', function($scope,$http) {
        $scope.login = function() {
            $http({
                url:'/carlt/loginForm',
                method: 'POST',            
                data: {name:'angular',password:'333',age:1}      
            }).success(function(){
                console.log("success!");
            }).error(function(){
                console.log("error");
            })
        };
    });

    后台变了,只是在User前加上@RequstBody,因为angular提交的是json对象:

    @Controller
    public class UserController {
        @ResponseBody
        @RequestMapping(value="/loginForm",method=RequestMethod.POST)
        public User loginPost(@RequestBody User user){
            System.out.println("username:"+user.getName());
            System.out.println("password:"+user.getPassword());
            return user;
        }
    }

    @RequestBody

    作用: 

          i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

          ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

    使用时机:

    A) GET、POST方式提时, 根据request header Content-Type的值来判断:

    •     application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
    •     multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
    •     其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

    B) PUT方式提交时, 根据request header Content-Type的值来判断:

    •     application/x-www-form-urlencoded, 必须;
    •     multipart/form-data, 不能处理;
    •     其他格式, 必须;

    说明:request的body部分的数据编码格式由header部分的Content-Type指定;

    四、解决了angular问题之后,发现jquery按照原来的方式提交post请求会报错(错误码415)。如下方式可以解决jquery提交问题:

    $.ajax({
        url:'/carlt/loginForm',
        method: 'POST',
        contentType:'application/json;charset=UTF-8',
        data:JSON.stringify({"name":"jquery","password":"pwd"}),
        dataType:'json',
        success:function(data){
            //...
        }
    });

    json对象转json字符串:JSON.stringify(jsonObj); 

     

    有兴趣的同学可以试试其它方法,欢迎交流,欢迎指正~

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-3 04:11 , Processed in 0.056278 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表