SpringMVC框架学习(二)请求参数的绑定和常用注解学习

请求参数的绑定

绑定机制说明

  1. 绑定机制
    • 表单提交的数据都是k=v格式的 username=haha&password=123
    • SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
    • 要求:提交表单的name和参数的名称是相同的
  2. 支持的数据类型
    • 基本数据类型和字符串类型
    • 实体类型(JavaBean)
    • 集合数据类型(List、map集合等)

使用要求

  1. 如果是基本类型或者 String 类型:
    • 要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
    @RequestMapping("test1")
    public String test1(String username,String password){
        System.out.println(username+": "+password);
        return "success";
    }
  • 页面.jsp:
<a href="test1?username='haha'&&password='123'">传递参数</a>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 如果是 POJO 类型 ,或者它的关联对象 :
    • 要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
//实体类
public class User implements Serializable{
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

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

//方法
//    pojo传参
    @RequestMapping("test2")
    public String test2(User user){
        System.out.println(user);
        return "success";
    }
<form action="/test2" method="post">
    用户:<input type="text" name="username">
    密码:<input type="password" name="password">
    <input type="submit" value="提交">
</form>

在这里插入图片描述
在这里插入图片描述

  1. 如果是集合类型, 有两种方式 :
    • 第一种:要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
      • 给 List 集合中的元素赋值,使用下标。
      • 给 Map 集合中的元素赋值,使用键值对。
    • 第二种:接收的请求参数是 json 格式数据。需要借助一个注解实现。
public class User implements Serializable{
    private String username;
    private String password;

    List<Account> list;
    Map<String,Account> map;

    public List<Account> getList() {
        return list;
    }

    public void setList(List<Account> list) {
        this.list = list;
    }

    public Map<String, Account> getMap() {
        return map;
    }

    public void setMap(Map<String, Account> map) {
        this.map = map;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}
public class Account implements Serializable {
    private String aname;
    private Integer money;

    public String getAname() {
        return aname;
    }

    public void setAname(String aname) {
        this.aname = aname;
    }

    public Integer getMoney() {
        return money;
    }

    public void setMoney(Integer money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "aname='" + aname + '\'' +
                ", money=" + money +
                '}';
    }
}
//    集合传参
    @RequestMapping("test3")
    public String test3(User user){
        System.out.println(user);
        return "success";
    }
<form action="/test3" method="post">
    用户:<input type="text" name="username">
    密码:<input type="password" name="password">

    <%--list集合--%>
    账户:<input type="text" name="list[0].aname">
    余额:<input type="text" name="list[0].money">

    <%--map集合--%>
    账户:<input type="text" name="map['school'].aname">
    余额:<input type="text" name="map['school'].money">
    <input type="submit" value="提交">
</form>

在这里插入图片描述
在这里插入图片描述

  1. SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:HttpServletRequest,HttpServletResponse,HttpSession,java.security.Principal,Locale,InputStream,OutputStream,Reader,Writer
@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request,HttpServletResponse response,HttpSession session) {
	System.out.println(request);
	System.out.println(response);
	System.out.println(session);
	return "success";
}

请求乱码问题

  1. post 请求方式:在 web.xml 中配置一个过滤器
<!-- 配置 springMVC 编码过滤器 -->
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>
      org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
      <!-- 设置过滤器中的属性值 -->
      <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
      <!-- 启动过滤器 -->
      <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
      </init-param>
    </filter>
    <!-- 过滤所有请求 -->
    <filter-mapping>
      <filter-name>CharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 在 springmvc 的配置文件中可以配置,静态资源不过滤:
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>

自定义转码器

  1. 第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。(S:表示接受的类型,T:表示目标类型)
public class StringToDateConverter implements Converter<String, Date> {
	/**
	* 用于把 String 类型转成日期类型
	*/
	@Override
	public Date convert(String source) {
		DateFormat format = null;
		try {
			if(StringUtils.isEmpty(source)) {
			throw new NullPointerException("请输入要转换的日期");
		}
		format = new SimpleDateFormat("yyyy-MM-dd");
		Date date = format.parse(source);
		return date;
		} catch (Exception e) {
			throw new RuntimeException("输入日期有误");
		}
	}
}
  1. 第二步:在 spring 配置文件中配置类型转换器。spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。
<!-- 配置类型转换器工厂 -->
<bean id="converterService"
	class="org.springframework.context.support.ConversionServiceFactoryBean">
	<!-- 给工厂注入一个新的类型转换器 -->
	<property name="converters">
		<array>
			<!-- 配置自定义类型转换器 -->
			<bean class="com.lwb.web.converter.StringToDateConverter"></bean>
		</array>
	</property>
</bean
  1. 第三步:在 annotation-driven 标签中引用配置的类型转换服务
<!-- 引用自定义类型转换器 -->
<mvc:annotation-driven
	conversion-service="converterService">
</mvc:annotation-driven>

常用注解

Request注解

  1. 作用:用于建立请求 URL 和处理请求方法之间的对应关系。
  2. 出现位置:
    • 类上:
      • 请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理:
    • 方法上:请求 URL 的第二级访问目录。
  3. 属性:
    • value:用于指定请求的 URL。它和 path 属性的作用是一样的。
    • method:用于指定请求的方式。
    • params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
      • 例如:
        • params = {“accountName”},表示请求参数必须有 accountName
        • params = {“moeny!100”},表示请求参数中 money 不能是 100。
    • headers:用于指定限制请求消息头的条件。
    • 注意:以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。

RequestParam

  1. 作用:
    • 把请求中指定名称的参数给控制器中的形参赋值。
  2. 属性:
    • value:请求参数中的名称。
    • required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,@RequestParam(value="age",required=false)Integer age){
System.out.println(username+","+age);
return "success";
}

RequestBody

  1. 作用:
    • 用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。(get 请求方式不适用。)
  2. 属性:
    • required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null。
@RequestMapping("/useRequestBody")
public String useRequestBody(@RequestBody(required=false) String body){
	System.out.println(body);
	return "success";
}

PathVaribale

  1. 作用:
    • 用于绑定 url 中的占位符。例如:请求 url 中 /findById/{id},这个{id}就是 url 占位符。
    • url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
  2. 属性:
    • value:用于指定 url 中占位符名称。
    • required:是否必须提供占位符。
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
@RequestMapping("/usePathVariable/{aid}")
public String usePathVariable(@PathVariable("aid") Integer id){
	System.out.println(id);
	return "success";
}

RequestHeader

  1. 作用:用于获取请求消息头。
  2. 属性:
    • value:提供消息头名称
    • required:是否必须有此消息头
@RequestMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",required=false)String requestHeader){
	System.out.println(requestHeader);
	return "success";
}

CookieValue

  1. 作用:
    • 用于把指定 cookie 名称的值传入控制器方法参数。
  2. 属性:
    • value:指定 cookie 的名称。
    • required:是否必须有此 cookie。
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)
	String cookieValue){
	System.out.println(cookieValue);
	return "success";
}

ModelAttribute

  1. 作用:
    • 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
      • 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
      • 出现在参数上,获取指定的数据给参数赋值。
  2. 属性:
    • value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
@ModelAttribute
public void showModel(User user) {
	System.out.println("执行了 showModel 方法"+user.getUsername());
}
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
	System.out.println("执行了控制器的方法"+user.getUsername());
	return "success";
}

SessionAttribute

  1. 作用:
    • 用于多次执行控制器方法间的参数共享。
  2. 属性:
    • value:用于指定存入的属性名称
    • type:用于指定存入的数据类型。
<!-- SessionAttribute 注解的使用 -->
<a href="springmvc/testPut">存入 SessionAttribute</a>
<hr/>
<a href="springmvc/testGet">取出 SessionAttribute</a>
<hr/>
<a href="springmvc/testClean">清除 SessionAttribute</a>
@RequestMapping("/springmvc")
@SessionAttributes(value ={"username","password"},types={Integer.class})
public class SessionAttributeController {
	@RequestMapping("/testPut")
	public String testPut(Model model){
		model.addAttribute("username", "泰斯特");
		model.addAttribute("password","123456");
		model.addAttribute("age", 31);
		//跳转之前将数据保存到 username、password 和 age 中,因为注解@SessionAttribute 中有
		这几个参数
		return "success";
	}
	@RequestMapping("/testGet")
	public String testGet(ModelMap model){
		System.out.println(model.get("username")+";"+model.get("password")+";"+model.get("a
		ge"));
		return "success";
	}
	@RequestMapping("/testClean")
	public String complete(SessionStatus sessionStatus){
		sessionStatus.setComplete();
		return "success";
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41816516/article/details/106817202