Spring框架学习(5.2)SpringMVC常用注解-绑定控制器类处理方法入参

前言

记录学习历程,上接请求映射方式
SpringMVC支持将多种途径传递的参数绑定到控制器类的处理方法的输入参数中

映射URL绑定的占位符到方法入参

使用@PathVariable注解可以将URL中的占位符绑定到控制器方法的入参中
例:上节中restGET方法
HelloController类中:

@RequestMapping(value = "rest/{id}",method = RequestMethod.GET)
    public String restGET(@PathVariable("id") Integer id){
        System.out.println("Rest GET:"+id);
        return "success";
    }

index.jsp中超链接:

<a href="/springmvc/rest/99">Rest GET</a><br><br>

URL中的占位符{id}通过注解@PathVariable绑定到restGET方法的入参id中

绑定请求参数到控制器方法参数

在控制器方法入参处使用@RequestParam注解可以将请求参数传递给方法,通过@RequestParam注解的value属性指定参数名,required属性指定参数是否必须,默认为true,表示请求参数中必须包含对应的参数,如果不存在则抛出异常
defaultValue属性指定默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

@RequestParam(value="参数名",required="true/false",defaultValue="")

(1)在HelloController类中添加方法requestParam

@RequestMapping("/requestParam")
    public String requsetParam
            (
                    @RequestParam(value = "loginName") String loginName,
                    @RequestParam(value = "loginPwd") String loginPwd
            )
   {
        System.out.println("Request Param: loginName "+loginName+",loginPwd "+loginPwd);
        return "success";
    }

(2)在index.jsp中添加超链接

<a href="/springmvc/requestParam?loginName=zhangsan&loginPwd=123456">Requset Param</a>

(3)测试完成
在这里插入图片描述

将请求参数绑定到控制器方法的表单对象

SpringMVC会按照参数名和属性名进行自动匹配,自动为该对象填充属性值,并支持级联
例:
(1)创建实体类包com.springmvc.entity,创建实体类Users、Address
构造方法、set和get方法、toString()方法已省略,右键Generate解决一切

package com.springmvc.entity;

public class Address {
    private String province;
    private String city;
    //构造方法、set和get方法、toString()方法已省略
}
package com.springmvc.entity;

public class Users {
    private String loginName;
    private String loginPwd;
    private Address address;
     //构造方法、set和get方法、toString()方法已省略
}

(2)在HelloController类中添加方法

  @RequestMapping("/savaUsers")
    public String savaUsers(Users users){
        System.out.println(users);
        return "success";
    }

(3)index.jsp创建表单
表单中输入框的name要匹配实体类属性名

  <form action="/springmvc/savaUsers" method="post">
    loginName:<input type="text" name="loginName"><br>
    loginPwd:<input type="text" name="loginPwd"><br>
    province:<input type="text" name="address.province"><br>
    city:<input type="text" name="address.city"><br>
    <input type="submit" value="提交">
  </form>

(4)测试成功
在这里插入图片描述
测试的时候出现了一个bug

严重 [http-nio-8080-exec-5] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [dispatcher] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.springmvc.entity.Users]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.springmvc.entity.Users.<init>()] with root cause
	java.lang.NoSuchMethodException: com.springmvc.entity.Users.<init>()

百度了发现原来在使用注解把类注解为Bean时,默认的构造方法是无参构造方法。。。
所以编写构造方法时要用无参构造方法

  public Users(){
    }

在这里插入图片描述

将请求参数绑定到控制器的Map对象

SpringMVC注解可以将表单数据传递到控制器方法中的Map类型的入参中
例:
(1)entity实体类包中创建一个实体类UsersMap
定义Map<String,Users> 类型的属性usersMap,提供set、get方法

package com.springmvc.entity;

import java.util.Map;

public class UsersMap {
    private Map<String,Users> usersMap;

    public Map<String, Users> getUsersMap() {
        return usersMap;
    }

    public void setUsersMap(Map<String, Users> usersMap) {
        this.usersMap = usersMap;
    }
}

(2)在HelloController中添加方法getUsers
通过set集合和Iterator迭代器的使用获得map中的所有数据

@RequestMapping("/getUsers")
    public String getUsers(UsersMap usersMap){
        Set set=usersMap.getUsersMap().keySet();//Map.keyset(),表示将map对象的所有key值以set集合的形式返回
                                                //Set 是java中一个存储不重复元素,且无序的集合类
        Iterator iterator=set.iterator();//Iterator迭代器的使用
                                        //set中的元素在内存中存放的时候并不连续,而Iterator就像是指针一样,next()就能找到它的下一个元素
        while (iterator.hasNext()){//Iterator迭代器指向下一个key值
            Object keyName=iterator.next();
            Users users=usersMap.getUsersMap().get(keyName);//获得map对象key为keyName的map
            System.out.println(users);
        }
        return "success";
    }

(3)在index.jsp中设置表单
输入两个用户信息

 <form action="/springmvc/getUsers" method="post">
      loginName1:<input type="text" name="usersMap['u1'].loginName"><br>
      loginPwd1:<input type="password" name="usersMap['u1'].loginPwd"><br>
      province1:<input type="text" name="usersMap['u1'].address.province"><br>
      city1:<input type="text" name="usersMap['u1'].address.city"><br>
      loginName2:<input type="text" name="usersMap['u2'].loginName"><br>
      loginPwd2:<input type="password" name="usersMap['u2'].loginPwd"><br>
      province2:<input type="text" name="usersMap['u2'].address.province"><br>
      city1:<input type="text" name="usersMap['u2'].address.city"><br>
      <input type="submit" value="提交">
    </form>

(4)测试成功
在这里插入图片描述

发布了49 篇原创文章 · 获赞 0 · 访问量 1260

猜你喜欢

转载自blog.csdn.net/key_768/article/details/103958215
今日推荐