美文网首页
springMVC+maven+mybatis+mysql入门

springMVC+maven+mybatis+mysql入门

作者: Mark_Du | 来源:发表于2019-06-03 23:49 被阅读0次

    (六)利用ajax和后台交互

    目前spring boot和前后端分离应用的越来越广,springboot的搭建易用性,前后端分离的开发维护便利性确实值得推广,但是,这些也不妨碍我们通过springmvc来学习基础。上一节,展示了ajax和后台交互数据,这一小节,我们稍微多一点了解这部分,毕竟得到前端数据,处理数据,返回数据,是后台程序的主要任务。

    从本节开始,开发工具使用idea替代myeclipse,所有截图及github提供的源码,均在idea下产生

    一. GET
    使用get方法,一般是通过某种关键字获取到某个数据
    比如,通过学号获取学生姓名,通过姓名查找电话号码等
    这个时候,就涉及,前端如何给这个关键字到后台,后台如何获取这个关键字
    首先,我们修改一下上一节使用的hello.jsp页面,增加一个按钮

    <body>
        This is my first jsp page. <br>
        
        <br/>
        my hello
        <br/>
        <div class="mydiv">
            <input id="myInput"></input>      
            <button class="mybutton" id="getButton">Gett</button>
            <button class="mybutton" id="POSTButton">POST</button>
        </div>
      <div>
          <button class="getButton" style="width: 70px;height: 40px">GetTest</button>
      </div>
      </body>
    

    增加了一个比较大的按钮,样式先不管了,能用就行
    然后,到hello.js中,增加这个按钮的点击触发函数

    $('.getButton').click(function(){
            alert("get here!!");
        });
    

    将工程运行起来,点击按钮,确保触发正确,弹出正确的窗口。

    触发这部分做好之后,我们就不用管页面了,只需要在触发函数下面进行测试即可。

    请求方式一
    早些时候的一种请求方式,比如,请求id为2的学生的信息,链接可能是这样的

    /student?id=2
    

    如果有多个参数,比如请求id为2,name为joe的学生的信息,链接可能是这样的

    /student?id=2&name=joe
    

    格式就是,参数都跟在?之后,每个参数之间用&隔开。
    为了返回数据到页面,一般我们会创建一个返回类
    com.springstart下面,创建一个包 model
    这个modelcontroller是同一层的
    然后在model下面,创建一个返回类 StudentResponse,这个就是个简单的pojo类

    package com.springstart.model;
    
    public class StudentResponse {
        private int code;
        private String msg;
        private int age;
    
        public int getCode() {
            return code;
        }
    
        public void setCode(int code) {
            this.code = code;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    

    包层次结果是这样的

    dir_level.jpg

    然后,需要在DemoController中添加一个方法,来接收页面的数据,处理后,返回给页面

    对于前面这样的请求方式,后端获取页面给过来的参数较常见的有下面几种:

    方法一

    @ResponseBody
        @RequestMapping(value="/getStudentAge",method=RequestMethod.GET)
        public String getAge(HttpServletRequest request){
            int id = Integer.valueOf(request.getParameter("id"));
            String name = request.getParameter("name");
            System.out.println("from page id="+id+" name="+name);
            StudentResponse response = new StudentResponse();
            if((id == 2) && (name.equalsIgnoreCase("Joe"))){
                response.setCode(200);
                response.setMsg("success");
                response.setAge(10);
                return myGson.toJson(response);
            }else{
                response.setCode(404);
                response.setMsg("fail");
                response.setAge(0);
                return myGson.toJson(response);
            }
        }
    

    这个是一个典型的简单的controller处理方法,其中,参数是 HttpServletRequest request ,了解过servlet就会知道HttpServletRequest是个神器,什么样的请求,都能够获取到,只是方便不方便的问题。
    我们只需要从HttpServletRequest中提取需要的参数即可。

    request.getParameter("id")
    request.getParameter("name");
    

    这样提取出来的都是String类型,所以,我们要数值型的id需要转换一下。
    然后,就是常用的返回方式
    目前流行返回json格式的字符串,而用于转换json的工具类很多,我们这里用google出品的gson

    private final static Gson myGson = new Gson();
    

    我们要返回给页面的字符串是:

    {
        "code":200,
        "msg":"success",
        "age":10
    }
    

    这只是一个简单示例,一般正式场合,返回的json会复杂的多
    页面根据codemsg来确定操作是否成功,通过age来获取需要得到的年龄数据
    正式场合,age 可以替换成data,然后在data下面嵌套json
    创建一个StudentResponse对象,然后对成员赋值,最后转换为json返回给页面

    response.setCode(200);
    response.setMsg("success");
    response.setAge(10);
    return myGson.toJson(response);
    

    工程跑起来,从页面点击GetTest按钮,正确执行的话,我们可以看到弹出窗口

    pop.jpg

    再次强调,HttpServletRequest是个神器,能够获取到我们传过来的参数,在想不到方便的办法提取参数的时候,就用它

    方法二
    为了测试方法二,我们添加一个按钮

    <div>
        <button class="getButton2" style="width: 70px;height: 40px">GetTest2</button>
    </div>
    

    在js文件中,添加这个按钮的触发事件

    $('.getButton2').click(function(){
            let url = "id=2&name=Joe";
            $.ajax({
                url:basePath+"/getStudentAge2?"+url,
                type:'GET',
                dataType:"json",
                success:function(result){
                    if(result.code == 200) {
                        alert("2 Joe age is " + result.age);
                    }else{
                        alert("2 get age fail");
                    }
                }
            });
    
    
        });
    

    点击后,发送请求到 getStudentAge2

    @ResponseBody
        @RequestMapping(value="/getStudentAge2",method=RequestMethod.GET)
        public String getAge2(Integer id,String name){
            System.out.println("2 from page id="+id+" name="+name);
            return getResponse(id,name);
        }
    
    

    因为上面两个方法都会用到对id的检测和返回age,所以,我们将这部分代码提出来,作为一个方法,这样代码更为简洁

    private String getResponse(int id,String name){
            StudentResponse response = new StudentResponse();
            if((id == 2) && (name.equalsIgnoreCase("Joe"))){
                response.setCode(200);
                response.setMsg("success");
                response.setAge(10);
                return myGson.toJson(response);
            }else{
                response.setCode(404);
                response.setMsg("fail");
                response.setAge(0);
                return myGson.toJson(response);
            }
        }
    

    这里,我们获取参数的方式很直接,就是在方法的参数和发送过来的请求参数,一一对应。
    发送过来的有 id ,name,那么方法的参数就是 id, name,一个字符都不能变
    这样,我们就可以接受到页面传过来的参数。

    运行服务程序,点击页面的按钮2,可以看到正确的运行结果。

    2.Restful风格
    最近更换电脑,代码有丢失,也没时间去恢复上面写的。
    这里简短的写一下。
    Restful风格,是这几年比较流行的一种风格方式,具体有什么优势,我感觉不出来,遇到一些人比较推崇这个方式,也有一些排斥这个方式的
    具体到代码这里的用途
    主要就是,请求的链接不使用&分隔参数,而是一种对资源的标记的方式
    比如,要查询一个用户的信息,URI为 /user/Joe
    以前的方式为 ?user=Joe
    然后,对于 /user/Joe 在发送时,使用不同的方法 GET POST PUT DELETE等表达对资源的操作,例如
    如果是GET 方法,则表示要查询Joe这个用户的信息,
    如果是POST 方法,同时会带上数据,则表示要增加Joe这个用户的信息
    但是,目前浏览器参差不齐,有些浏览器不支持PUT DELETE等,所以,具体使用还看具体环境
    对于这样的请求,后端的接受方式统一如下

    @RequestMapping(value = "/user/{name}",method = RequestMethod.GET)
        public String doUserInfo(@PathVariable("name") String name){
            
        }
    

    其中的
    {name}就是将那么参数化,让方法可以取出来
    method根据实际请求方法来选择
    @PathVariable("name") String name 就是通过注解,将路径中的参数name指定给方法的参数name,这样就取出了name的值

    总结:
    GET部分就讲到这里,比较常用的 POST 下一篇再讲,这一节没有源码提供,请自行参考文章编写。

    相关文章

      网友评论

          本文标题:springMVC+maven+mybatis+mysql入门

          本文链接:https://www.haomeiwen.com/subject/ojvuuqtx.html