zoukankan      html  css  js  c++  java
  • Springmvc中 同步/异步请求参数的传递以及数据的返回

    转载:http://blog.csdn.net/qh_java/article/details/44802287

    注意: 这里的返回就是返回到jsp页面

    **** controller接收前台数据的方式,以及将处理后的model 传向前台*****

    1、前台传递数据的接受:传的属性名和javabean的属性相同

    (1)、使用基本类型,或引用类型进行接受

    @RequestMapping(value="/select")

    PublicString  select(String name,int age,Model model){

    // 这样这里的name,age 就是我们前台传递的参数,也是我们Javabean中的属性。

      System.out.println("name"+name+"age "+age);

     model.addAttribute("user",user);

     Return"list";

       }

     }

     

    (2)、用注解@RequestParam绑定请求参数

    用注解@RequestParam绑定请求参数a到变量a

    当请求参数a不存在时会有异常发生,可以通过设置属性required=false解决,

    例如: @RequestParam(value="a",required=false)

    Controller如下

    // 这种方式是参数a必须是存在的,如果不存在报异常,如果@RequestParam(value='a') 不给required 赋值的话,就默认为true

    @RequestMapping(value= "/requestParam", method =RequestMethod.GET/POST)
    public StringsetupForm(@RequestParam("a") String a,ModelMap model) {
       System.out.println(a);
    return "helloWorld";

    }

    // 这种方式是请求参数a不是一定要存在,如果存在就赋值,如果不存在也不会报异常

    @RequestMapping(value= "/requestParam", method =RequestMethod.GET/POST)
    public StringsetupForm(@RequestParam(value="a",required=false) String a,ModelMap model) {
       System.out.println(a);
    return "helloWorld";

    }


    (3)、使用pojo方式来接受:要求,前台属性的名称和javabean 的属性的名称一样。

    // 这种方式使用的比较多

    @RequestMapping(value="select")

    PublicString  select(User user ,Model model){

    Stringname= user.getName();

    Stringage=user.getAge();

    //  按照这些属性进行查询,之后将数据集合放到model中

    LIst<Map<String,Object>> list=  new ArrayList<Map<String,Object>>();

    list="按照条件查询的结果";

    model.addAttribute("userlist",list);

    Return"list";

    }


    (4)、使用pojo方式来接受:要求,前台属性的名称和javabean 的属性的名称一样。

    JSP表单如下

    <form method="post" action="hao.do">
        a: <input id="a" type="text"  name="a"/>
        b: <input id="b" type="text"  name="b"/>
        <input type="submit" value="Submit"/>
     </form>

    Java  Pojo如下

        public class Pojo{
            private String a;
            privateint b;
        }

    Java Controller如下

    @RequestMapping(method= RequestMethod.POST)
    public StringprocessSubmit(@ModelAttribute("pojo") Pojo pojo) {
       
        return"helloWorld";
    }

    (5)、如果前台有相同name值的数据传递则要使用数组来接收,相同名称的可能是有这样的数值但更多的是多选框,所以我们要使用数组来接收这样的值

    @RequestMapping(value="select.do")

    public Stringhello(String []username,Model model){

    System.out.println(username.length);

    Stringname1=username[0];

    Stringname2=username[1];

    model.addAttribute("helloworld", "hello"+name1+name2);

    return"welcome";

    }

     使用数组的方式接受多选框的内容

    (6)、这种方式和servlet 接受请求参数的方式是相同的,因为springmvc 提供了servlet的api 所以我们可以使用HttpServletRequest request 来获取参数

    @RequestMapping(value="/hello.do")

    publicString hello(HttpServletRequest request,Model model){

      String name=request.getParameter("name");

      System.out.println(name);

    model.addAttribute("helloworld","hello"+name);

    return"welcome";

    }


    (7)、通过@PathVariabl获取路径中的参数值

    @RequestMapping(value="user/{id}/{name}",method=RequestMethod.GET/POST)

        public String printMessage1(@PathVariable String id,@PathVariableString name, ModelMap model) {
            System.out.println(id);
            System.out.println(name);
            model.addAttribute("message","111111");
            return"users";
        }

    例如,访问user/123/whd路径时,执行以上方法,其中,参数id=123,name=whd

    @RequestMapping(value="user/{id}/{name}")其中的{id}/{name}就是占位符,这样和路径能完整对应,之后通过方法中的注解从请求路径中获取这些站位符位置的值。



    **** 都看到了我们上面列举了参数接受方式,但是我们发现处理后的model(数据模型)的接受都是使用Model 这个对象来传的,这也是推存使用的,但还有其他方式,其实不管使用那种方式技术实现都是一样的,参数传递具体方式:******

    2、 将数据模型向前台传值:

     (1)、向前台传递一个bean或基本类型的值

    @RequestMapping(value="select")

    // 使用model 向前台传对象

    Public String  select(User user ,Model model){

    Stringname= user.getId();

    //  按照这些属性进行查询,之后将数据放到model中

    User  user="按照id获取的数据"

    model.addAttribute("user",user);

    Return"list";

    }

    (2)、向前台传list集合

     @RequestMapping(value="/hello.do")

    public String hello(User user,Modelmodel){

      List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();

      Map<String,Object> map1= newHashMap<String,Object>();

      Map<String,Object> map2= newHashMap<String,Object>();

      map1.put("name","name1");

      map1.put("age", 1);

      map2.put("name","name2");

      map2.put("age", 2);

      list.add(map1);

      list.add(map2);

    //  将list集合放在model中,在前台获取这个集合并进行遍历

    model.addAttribute("ulist",list);

    return"welcome";

    }

    前台使用c标签

    <c:forEach   items="${ulist}"  var="user" >

       ${user.name}

         ${user.age}

    </c:forEach>

    ****前面的几种都使用了model来传值,这也是比较推存的方式,但还有几种方式在这里给大家列出来:

    (3)、ModelAndView  从字面意思我们就能看出这个对象包括,数据模型和视图名称

    Public ModelAndView  select(User user){

    ModelAndView    mav=new  ModelAndView    ("view_value");

    // view 可以按照上面的这样写,也可以按照下面这样写,也就是view的两种赋值方式

    // mav.setViewName("view_value"); 指定视图名

    mav.addObject("key1",value);

    mav.addObject("key2",value);

      return modelAndView ;

    }

    (4)、使用map 来存储model 然后向前台传值

     @RequestMapping(value="/hello.do")

    public String hello(User user,Map<String,Object>  map){

      List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();

      Map<String,Object> map1= newHashMap<String,Object>();

      Map<String,Object> map2= newHashMap<String,Object>();

      map1.put("name","name1");

      map1.put("age", 1);

      map2.put("name","name2");

      map2.put("age", 2);

      list.add(map1);

      list.add(map2);

    //  将list集合放在model中,在前台获取这个集合并进行遍历,map和model是很相似的。

    map.addAttribute("ulist",list);

    return"welcome";

    }

    *************上面都是同步请求的,下面我们看看ajax异步请求数据的传递和接收*************

    • ajax请求向后台传值,前台传一般值
    • ajax请求向后台,前台传json数组格式的值

    1、ajax 请求向后台传值一般格式的值,一般格式也就是jsonObject 格式的数据

      $.ajax({ 

                url:"selectinfo.do", 

                type:"post", 

             // data 就是向后台传递的值,有name和age两个值,而这里传的是Json对象,这个jquery会帮你转换为键值对的格式,就是xx=xx&xxxx=xxxxx...

             //有些时候调用webservice的方法,需要json格式的字符串,所以不能传递json对象,而是json格式的字符串,所以要传递字符串

               data:{name:"name1",age:2}, 

              //  规定返回值的类型,这里是json格式返回

                dataType:"json",

              // data 为后台传过来的值

                success:function(data){ 

                // 在后台传的是一个jsonarray这里使用eval函数进行遍历

                 arr=eval(data);

                 alert("长度"+arr.length);

                 alert(arr);

                 for(var i=0;i<arr.length;i++){

                  alert("内容"+arr[i].title);

                 }

                } 

                }); 

    后台接受,这里数据的接受和前面说的数据的接收是相同的,即可以使用 request,变量,Javabean 等来接收

    (1)、使用request 接收

    @RequestMapping(value="selectinfo.do",method=RequestMethod.POST)

    public void  selectinfo(HttpServletRequest  request,HttpServletResponse   response){

    Stringname= request.getParameter("name");

    Stringage= request.getParameter("age");

    System.out.println("v"+name);

    System.out.println("v"+age);

    List<Map<String,Object>>list= new ArrayList<Map<String,Object>>();

    Map<String,Object>map1= new HashMap<String,Object>();

    Map<String,Object>map2= new HashMap<String,Object>();

    Map<String,Object>map3= new HashMap<String,Object>();

    map1.put("title","map1");

    map1.put("artist","ADG3");

    map1.put("mp3","musics/zjh.mp3");

    map1.put("poster","images/m0.jpg");

    map2.put("title","map2");

    map2.put("artist","ADG3");

    map2.put("mp3","musics/zhm.mp3");

    map2.put("poster","images/m0.jpg");

    map3.put("title", "暖心");

    map3.put("artist","ADG3 Studios");

    map3.put("mp3","musics/zhm.mp3");

    map3.put("poster","images/m0.jpg");

    list.add(map1);

    list.add(map2);

    list.add(map3);

    // 转化为 json数组

    JSONArraystr=JSONArray.fromObject(list);

    try {   

    //  向前台输出值,获取PrintWriter 对象

    PrintWriterout= response.getWriter();

    // 将数据输出到 ajax的success函数中的data这个值

       out.print(str.toString());

    }catch (IOException e) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    }

    System.out.println(str.toString());

    }

    (2)、使用 变量String name  int age 来接收

    @RequestMapping(value="selectinfo.do",method=RequestMethod.POST)

    public void  selectinfo(String name,int age,HttpServletResponse  response){

    Stringname= request.getParameter("name");

    Stringage= request.getParameter("age");

    System.out.println("v"+name);

    System.out.println("v"+age);

    List<Map<String,Object>>list= new ArrayList<Map<String,Object>>();

    Map<String,Object>map1= new HashMap<String,Object>();

    Map<String,Object>map2= new HashMap<String,Object>();

    Map<String,Object>map3= new HashMap<String,Object>();

    map1.put("title","map1");

    map1.put("artist","ADG3");

    map1.put("mp3","musics/zjh.mp3");

    map1.put("poster","images/m0.jpg");

    map2.put("title","map2");

    map2.put("artist","ADG3");

    map2.put("mp3","musics/zhm.mp3");

    map2.put("poster","images/m0.jpg");

    map3.put("title", "暖心");

    map3.put("artist","ADG3 Studios");

    map3.put("mp3","musics/zhm.mp3");

    map3.put("poster","images/m0.jpg");

    list.add(map1);

    list.add(map2);

    list.add(map3);

    // 转化为json数组

    JSONArraystr=JSONArray.fromObject(list);

    try{

                // 获取PrintWriter 对象

    PrintWriterout= response.getWriter();

    // 输出数据

       out.print(str.toString());

    }catch (IOException e) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    }

    System.out.println(str.toString());

    }

    (3)、使用javabean 来接接收

    @RequestMapping(value="selectinfo.do",method=RequestMethod.POST)

    public void  selectinfo(User user,HttpServletResponse   response){

    System.out.println("v"+user.getName());

    System.out.println("v"+user.getId());

    List<Map<String,Object>>list= new ArrayList<Map<String,Object>>();

    Map<String,Object>map1= new HashMap<String,Object>();

    Map<String,Object>map2= new HashMap<String,Object>();

    Map<String,Object>map3= new HashMap<String,Object>();

    map1.put("title","map1");

    map1.put("artist","ADG3");

    map1.put("mp3","musics/zjh.mp3");

    map1.put("poster","images/m0.jpg");

    map2.put("title","map2");

    map2.put("artist","ADG3");

    map2.put("mp3","musics/zhm.mp3");

    map2.put("poster","images/m0.jpg");

    map3.put("title", "暖心");

    map3.put("artist","ADG3 Studios");

    map3.put("mp3","musics/zhm.mp3");

    map3.put("poster","images/m0.jpg");

    list.add(map1);

    list.add(map2);

    list.add(map3);

    // 转化为json数组

    JSONArraystr=JSONArray.fromObject(list);

    try{

                // 获取PrintWriter 对象

    PrintWriterout= response.getWriter();

    // 输出数据

       out.print(str.toString());

    }catch (IOException e) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    }

    System.out.println(str.toString());

    }

    2、ajax 请求向后台传json数组格式的值:

    (1)、在前台ajax发送异步请求,传递数据的格式为jsonarray,具体代码如下:

     <script type="text/javascript">

      var arr=null;

      $(document).ready(function(){

    // jsonObject 中存放了一个jsonarray格式的数据

      varallMenu1={"datas":[{title:"title1",age:1},{title:"title2",age:2},{title:"title3",age:3}]};

       // data 就是向后台传递的值,有name和age两个值,而这里传的是Json对象,这个jquery会帮你转换为键值对的格式,就是xx=xx&xxxx=xxxxx...    

        //有些时候调用webservice的方法,需要json格式的字符串,所以不能传递json对象,而是json格式的字符串,所以要传递字符串

       /* 将json格式的JavaScript对象转化为json格式的字符串进行传递 */ 

    var arrs = JSON.stringify(allMenu1);

     /* 发送异步请求,获取jsonarray 数据 */

      $.ajax({ 

                url:"selectinfo.do", 

                type:"post", 

                data:"val="+arrs, 

                dataType:"json",

                success:function(data){ 

                 arr=eval(data);

                 alert("长度"+arr.length);

                 alert(arr);

                 for(var i=0;i<arr.length;i++){

                  alert("内容"+arr[i].title);

                 }

                } 

                }); 

    });

      </script>

    (2)、后台接收前台传递的jsonarray数组格式的数据

    @RequestMapping(value="selectinfo.do",method=RequestMethod.POST)

    public void  selectinfo(HttpServletRequest  request,HttpServletResponse   response){

    // 通过关键字获取的就是一个jsonobject对象格式的数据

    String  string =request.getParameter("val"); 

    JSONObject  json = new JSONObject();

    // 将string 转化为 json

    json=json.fromObject(string);

    //这个jsonObject对象的key 就是datas 而value 就是一个jsonarray,通过关键子获取jsonarray

    JSONArray  arr=(JSONArray)json.get("datas");

    // 获取数组中的jsonobject数据

    JSONObject  obj1= arr.getJSONObject(0);

    JSONObject  obj2= arr.getJSONObject(1);

    Stringname1=obj1.getString("title");

    Stringname2=obj2.getString("title");

    System.out.println("json数据1"+name1);

    System.out.println("json数据2"+name2);

    List<Map<String,Object>>list= new ArrayList<Map<String,Object>>();

    Map<String,Object>map1= new HashMap<String,Object>();

    Map<String,Object>map2= new HashMap<String,Object>();

    Map<String,Object>map3= new HashMap<String,Object>();

    map1.put("title","map1");

    map1.put("artist","ADG3");

    map1.put("mp3","musics/zjh.mp3");

    map1.put("poster","images/m0.jpg");

    map2.put("title","map2");

    map2.put("artist","ADG3");

    map2.put("mp3","musics/zhm.mp3");

    map2.put("poster","images/m0.jpg");

    map3.put("title", "暖心");

    map3.put("artist","ADG3 Studios");

    map3.put("mp3","musics/zhm.mp3");

    map3.put("poster","images/m0.jpg");

    list.add(map1);

    list.add(map2);

    list.add(map3);

    // 将list集合转化为jsonarray数组

    JSONArraystr=JSONArray.fromObject(list);

    try {    // 其实ajax异步请求和同步请求最大的区别就是这里数据的输出,ajax异步请求数据的输出使用了打印输出流对象来将数据输出

    PrintWriterout= response.getWriter();

       out.print(str.toString());

    }catch (IOException e) {

    //TODO Auto-generated catch block

    e.printStackTrace();

    }

    System.out.println(str.toString());

    }

  • 相关阅读:
    预览图片功能 直接复制就OK
    记录:express返回自定义http状态吗
    Git tag 给当前分支打标签
    css双飞翼和圣杯布局
    简单模拟MVVM数据双向绑定
    JS的自定义事件(观察者模式)
    js模拟触发事件
    QueryString和BASE64
    WebResource.axd文件的配置和使用
    处理json中的异常字符
  • 原文地址:https://www.cnblogs.com/tian830937/p/4770700.html
Copyright © 2011-2022 走看看