Spring mvc 下通过前台传参数到后台Controller 的方法

先把自己知道的写出来 后面持续更新

把前台的参数传递到Controller中

1:可以在方法中传递request 对象 

如:    @RequestMapping("/queryUser")
    public ModelAndView queryUser(HttpServletRequest request) throws IOException{
    
        //设置request 中的编码格式 防止中文乱码
        request.setCharacterEncoding("utf-8");
        String trueName = request.getParameter("trueName");
、}


2:通过参数绑定和上面在方法中一样 在里面传入 从页面传过来参数的类型和值  比如 Sting  name

    public ModelAndView queryUser(String name) throws IOException{
    
       在代码里就可以获取到name的值

     其实这种方法 跟request.getParameter("name") z结果是一样的


     如果是form 表单的话就是一个数组了 String[] id

        request.getParameterValues(“id"”)  一致

、}

以上两种大体来讲性质是一样的 都是通过name来获得 前台的值 并且它们前台的名称  和后台的名称 得保持一致


3:通过@RequestParam(value="id") 来绑定request传过来的值

   public ModelAndView queryUser(@RequestParam(value="id")Integer id_test) throws IOException{
    
      代码里直接可以把id_test 拿来用  通过@RequestParam 参数绑定 就消除了名称一直的问题

、}


那么问题来了既然request都可以获取到前台传递过来的参数 为什么还会有2,3两种方式呢?????


不传request,减少侵入性,更符合MVC的的设计思想  本人猜想 欢迎各位网友指正


4:将对象绑定到方法中    UserVo   这个类可以是组装的类  spring mvc中没有对此有特定的要求

public String enterUpdateUser(UserVo userVo){

}

页面如:

<input type="text" name="address" value="dd"/>

注意:在前台穿过来的参数(address)必须为为类UserVo的属性  并且有相应属性的set方法

这样才可以将值设进类UserVo中

这种方法的特点是这个对象必须在程序中存在这个类  并且前台穿过来的所有参数都得是这个类中的属性

然后可以通过get 方法将所有的属性获取到 



5:这种方法是方法4的升级版,因为方法4传递的是一个对象,一般实际开发中把form 表单提交的话 就会涉及到多个对象 所以我们就需要将对象装进一个List集合中(listUser)   所以我们就会在方法中继续封装一个类(ListTest)中, 同时这个类会把 listTest 当做他自己的一个属性 并且有get/set方法 

可以在方法中传递集合   不过集合中必须存放 方法4中的类 如:

组装类:

public class ListTest {
    List<User> listUser;

    public List<User> getListUser() {
        return listUser;
    }

    public void setListUser(List<User> listUser) {
        this.listUser = listUser;
    }

}

Controller方法

public String enterUpdateUser(ListTesttest){

}

jsp页面:

     <td><input type="text" name="listUser[0].address" value="${user.address}" /></td>
    <td><input type="text" name="listUser[0].id" value="${user.id}" /></td>

    <td><input type="text" name="listUser[1].address" value="${user.address}" /></td>
    <td><input type="text" name="listUser[1].id" value="${user.id}" /></td>

    <td><input type="text" name="listUser[2].address" value="${user.address}" /></td>
    <td><input type="text" name="listUser[2].id" value="${user.id}" /></td>

这样的话就将页面三个对象(User)封装了起来  放进了List(listUser)中  并且把List作为组装类(ListTest)的普通属性

动态生成序号的方式

<c:forEach items="${usersList }" var="user" varStatus="status">
  <tr>

    <td width="2%"><input type="checkbox" name="listUser${status.index}" id="check" value="${user.id}"></td>

</c:forEach>

6:方法6也是将数据通过JSON字符串传给后台不 

先普及下Json字符串和Json对象的区别

json字符串:var b = '{"title":"JavaScript高级程序设计","authors":"aa","edition":"3","year":"2011"}'  ;

json对象: var object ={"name":"tom","sex":"男","age":"23"};

Json.parse(b) 将Json字符串转换为 Json对象

Json.stringify(object); 将Json对象转换为Json字符串

两者的区别就是字符串只一个整体用单引号括起来的       后者是直接放在一个大括号里面 是一个对象

在js中一般通过解析[object,object]类型的数据

@RequestBody 可以获取从前台传过来的Json字符串 这样就可以将前台拼接的Json字符串接收

并且将对象放进到List<User>中

@ResponseBody 是将Json对象数据响应给前台   如果return 返回的值是字符串格式的就会将其作为页面解析

如果return返回值是 json对象的话 就会将其原样返回

好了言归正传,将前台的数据组装成Json字符串并且将其传回Controller中,如下方法

    @ResponseBody
    @RequestMapping(value="/enterUpdateUser", method={RequestMethod.POST,RequestMethod.GET})
        public String enterUpdateUser(@RequestBody List<User> user){
        
            System.err.println(user.toString());
            System.out.println(user.get(0).getAddress());
          
              return "{\"result\":\"success\"}";   或者 return "sucess"; 这两种涉及到ajax 中提交中的dataType 类型


    }

前台页面:

function query(){

   var userList= new Array();

Json对象:

  userList.push({id:"1",address:"江西南昌 "});
  userList.push({id:"2",address:"上海虹口 "});
  $.ajax({
  url:"${pageContext.request.contextPath}/user/enterUpdateUser.action",
  type:"post",
  data:JSON.stringify(userList),//将Json对象转换为json字符串
  dataType:"json",//传递到Controller的数据类型  类型也可以为text 这样Controller 返回字符串也能够接收
  contentType:"application/json",//响应的数据
  success:function(data){
      alert(JSON.stringify(data));
      for(var a in data){
      alert(a);
      alert(data[a]);
      var value = $("input[name='listUser[2].address']").val();
      $("input[name='listUser[2].address']").val("测试数据");
      }
   },error:function(data){
  }
});
 }

这样就可以实现 前台单个参数,多个参数,对象,集合的形式进入Controller 中了  不过这些方法都是可以通过获取request中的值来实现


7 前台通过CheckBox的方式传递被选中的CheckBox

JSP页面中:

     <input type="button" value="测试 " οnclick="submit()">

<form id="test" action="......../array.action" method="get">

<input type="checkBox" name="totCheck" id="totCheck"  οnclick="array()"  value="全选框">

<c:forEach items="${list} " var=“str">

     <input type="checkBox" name="id" id="test_box" value="${id} />

</c:forEach>

</form>

javaScript:

       function array(){

            //当点击全选框时   如果全选框已经被选中   则将所有选中的子checkBox 取消全选

            如果全选框未被选中怎讲下面的子checkBox 选中  具体代码实现如下

if($("input[name='totCheckBox']").attr("checked")=="checked")  {

//两种方式全选

      $("input[name='id']").each(function(){

        $(this).attr("checked",true);


});

//或者 也是将所有的子checkBox选中

$("input[name='id']").attr("checked",true);

}else{

$("input[name='id']").attr("checked",false);


}

}


后台代码获取:

注意:Integer 这个一定要是包装类   不能是基本数据类型

    @RequestMapping("/array")
    public String arry(Integer[] id){
        System.out.println(id.length);
        
        
        return "string";
    }










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坑里水库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值