springMVC+maven+mybatis+mysql入门

(七)利用ajax发送Post请求到后台

上一节,我们大致讲了利用ajax发送Get请求到后台服务,这一节,我们来讲解发送post请求

一般说来,我们获取信息使用Get请求,向后台请求某些信息;使用Post请求向后台发送一些信息,而其他几种方法,比如Put,Delete等,受制于浏览器,tomcat版本等等,不一定都能使用。

但是这些都非绝对,使用get发送信息,使用post获取信息,也是有的,都是请求,并不拘泥于理论,看实际使用场景的。

首先,我们还是准备一个工程,就用之前的工程。
页面中,发送一个ajax post请求,主要代码如下

$("#POSTButton").click(function(){
        let id = $("#myInput").val();
        $.ajax({
            url:basePath+"/firstPost",
            data:id,
            type:'POST',
            dataType:'text',
            contentType:'application/json',
            success:function(result){
                $("#myInput").val(result);
            }
        })      
    }); 

这个跟之前get方法一样的结构,只是type那里方法是POST
然后后台服务那里,我们接受这个请求的方法,只需要将method写成post即可

    @ResponseBody
    @RequestMapping(value="/firstPost",method=RequestMethod.POST)
    public String myFirstPost(@RequestBody String msg){
        System.out.println("from page msg:"+msg);
        return "Good "+msg;
    }

关键语句就是 method=RequestMethod.POST
限定这个方法只接受post请求,如果发送get请求,服务器会报405错错误

image.png

好了,这个是post的基本设定,接下来,关键就在于data的形式,不同形态的data,后端接受这个data的方式就不一样

1. 最简单的方式
我们可以学get方法那样,把post参数写在url后面,就是传统的方式,例如

http://test.com?user=Joe&age=12

通过这种方式,将用户Joe上传给服务器
那么,我们的js代码就这样写

$("#POSTButton").click(function(){
        let user = 'Joe';
        let age = 12;
        $.ajax({
            url:basePath+"/firstPost"+"?user="+user+"&age="+age,
            type:'POST',
            dataType:'text',
            contentType:'text/plain',
            success:function(result){
                $("#myInput").val(result);
            }
        })      
    }); 

java后台接受这个参数的controller方法这样写


    @ResponseBody
    @RequestMapping(value="/firstPost",method=RequestMethod.POST)
    public String myFirstPost(String user,Integer age){
        System.out.println("from page user:"+user);
        System.out.println("from page age:"+age);
        return "Good";
    }

把工程运行起来,在浏览器访问

http://localhost:12344/springstart/hello

这里端口写你自己设置的端口
点击页面上的 post按钮,可以在后台代码中看到打印输出

from page user:Joe
from page age:12

这个是最简单的一种方式,当然,这只比较非主流的方式
一般post的参数不会写在链接中
其次,如果有安全性要求的话,使用https请求,写在链接中是无法加密的

所以一般不会使用这种方式。

2. 最常见的方式
目前最常见的方式就是使用json格式传送数据
使用json格式表达我们的上面的user的话,大概是这样:

{
    "name":"Joe",
    "age":12
}

json格式是现在最流行的一种数据格式,被使用在各个场景下,几乎所有语言都支持json格式的解析。具体的相关格式,请自行百度。
我们的js代码这样写:

$("#POSTButton").click(function(){
        let oneUser = new Object();
        oneUser.name = 'Joe';
        oneUser.age = 12;
        let msg = JSON.stringify(oneUser);
        $.ajax({
            url:basePath+"/firstPost2",
            type:'POST',
            data:msg,
            dataType:'json',
            contentType:'application/json',
            success:function(result){
                $("#myInput").val(result);
            }
        })      
    }); 

这里,我们把usl改了一点
url:basePath+"/firstPost2"
与之前的接口不同,这里使用 firstPost2,以便后台能保留前面的方法。
我们创建了一个对象,把用户的参数给它,然后,使用 JSON.stringify将这个对象转为json字符串
然后,在ajax的参数中,有些变动
dataType:'json'
contentType:'application/json'
这两个表明,我们发送出去的数据,是json

对应的,我们的后台接收数据的方法,需要适当修改一下

    @ResponseBody
    @RequestMapping(value="/firstPost2",method=RequestMethod.POST)
    public String myFirstPost2(@RequestBody User user){
        System.out.println("from page user:"+user.toString());
        return "Good";
    }

与之前方法的差别就是参数
@RequestBody User user
首先,注解 @RequestBody 用来将页面传送过来的json结果,对应到我们的接收实例上面,这里,我们的实例是user

package com.springstart.model;

public class User {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


这种只有属性以及属性对应的set,get的类,有的地方叫POJO类,有的地方叫java bean,不管叫什么,深究起来也没意义,这种类型的类,在web后台开发中很常见,有时候会在一个web后台项目源码中占很大比例。
这种类,其作用,就是保存数据使用,有时候保存页面过来的数据,有时候保存从数据库查询的数据,一般来说,setget方法必须有,不排除一些比较智能的框架自动匹配的情况,然后就是一些其他的方法,比如用于跟踪数据的toString,将指定的成员变量组装起来成为一个字符串,便于日志记录或者打印输出。
现在的IDE都具备自动生成setget等方法的机制,只需要将成员变量定义出来即可,不会用的自行百度自己使用的IDE如何自动生成。


这里,我们使用User类来接收页面给过来的json数据,User类成员变量和页面的json数据一一对应,这样拿下来就可以直接使用。正如我们代码中的,使用toString将参数输出。
当然,我们也可以不用类去接收,使用字符串也可以。

    @ResponseBody
    @RequestMapping(value="/firstPost2",method=RequestMethod.POST)
    public String myFirstPost2(@RequestBody String msg){
        System.out.println("from page user:"+msg);
        return "Good";
    }

这样,会把ajax提交上来的json字符串,放到msg中。

上面这种方式,是一种万精油的方式,任何前端和后台,都可以这么写,只要前端给到后台的数据,组合成json即可,后台拿到数据后自己处理,如何使用,持久化等,都没有问题。

3.提交form
form在页面上,一般叫做表单,在form下,有多个数据,用户可以填写后一次性提交,平时我们填写的登陆,注册等,都是在一个表单上执行的。
这里,我们写一个简单的表达,用户输入用户名和密码,模拟用户登陆。

<span>表单demo</span>
        <form id="formDemo">
            <label>用户名:</label>
            <input id="name" name="name"/>
            <br>
            <label>密码:</label>
            <input id="passwd" name="passwd" type="password"/>
            <br>
            <button id="formButton" type="button">提交</button>

        </form>

在jsp中我们加一段这个,这里就是一个简单的form,里面有两个input,每个input都需要有name属性,因为form在提取里面的字段的时候,是以name作为变量名的。
然后,这里有个button,类型type="button",如果不写这个type,那么button在被点击时,会自动提交,button的默认类型是submit,我们这里希望从js里面通过ajax提交。
这个form在页面显示出来

form.png

不用在乎样式,能用就行。

对应的,我们在js里面,写一段button点击触发的函数。
这里,对于form数据的处理方式有很多种,我们这里讲一下最普通的做法。

    $("#formButton").click(function () {
        let msg = $("#formDemo").serialize();
        $.ajax({
            url:basePath+"/firstPostForm",
            type:'POST',
            data:formData,       
            success:function(result){
                $("#myInput").val(result);
            }
        })

    });

这里的关键代码是

let msg = $("#formDemo").serialize();

form的数据序列化,通过调试打断点,我们可以看到msg的结构类似于

name=Joe&passwd=123

实际就是把form 中的参数一个一个的用&连接起来
我们的接收方式有几种

@ResponseBody
    @RequestMapping(value="/firstPostFrom",method=RequestMethod.POST)
    public String myFirstPost3(HttpServletRequest request){
        System.out.println("from page login:"+request.getParameter("name"));
        return "Good";
    }

HttpServletRequest request是获取参数的通用方式

@ResponseBody
    @RequestMapping(value="/firstPostFrom",method=RequestMethod.POST)
    public String myFirstPost3(String name,String passwd){
        System.out.println("from page login,name:"+name);
        return "Good";
    }

直接把给过来的参数写到方法的参数中,一一对应即可
我们也可以写一个类来接收

package com.springstart.model;

public class Login {
    private String name;
    private String passwd;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPasswd() {
        return passwd;
    }

    public void setPasswd(String passwd) {
        this.passwd = passwd;
    }

    @Override
    public String toString() {
        return "Login{" +
                "name='" + name + '\'' +
                ", passwd='" + passwd + '\'' +
                '}';
    }
}

    @ResponseBody
    @RequestMapping(value="/firstPostForm",method=RequestMethod.POST)
    public String myFirstPost3(Login login){
        System.out.println("from page login,name:"+login.getName());
        return "Good";
    }

这里数据不是用json发送过来的,所以不用加注解,直接就能转换过来。
从上面的方法我们可以看出,完全可以把form中的参数一个一个的读取出来,组合成json来传输,现在一些前端页面已经不再使用form的形式了。
但是,如果要上传文件,使用form会简单一些,我们下一篇再讲。
本文源码
springstart github post_demo,请自行下载

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容