SpringMVC复习(三)之请求数据传入

1. 请求处理方法签名

  • Spring MVC 通过分析处理方法的签名,HTTP请求信息绑定到处理方法的相应人参中。
  • Spring MVC 对控制器处理方法签名的限制是很宽松的,几乎可以按喜欢的任何方式对方法进行签名。
  • 必要时可以对方法及方法入参标注相应的注解( @PathVariable@RequestParam@RequestHeader 等)、
  • Spring MVC 框架会将 HTTP 请求的信息绑定到相应的方法入参中,并根据方法的返回值类型做出相应的后续处理。

2 原生SpringMVC获取参数

默认方式获取请求参数: 直接给控制器方法入参上写一个和请求参数名相同的变量。这个变量就来接收请求参数的值;
* 带:有值
* 没带:null;

前端

<a href="handle?username=tomcat">helloworld</a><br/>

后端

@RequestMapping("/handle")
    public String  handle(String username){
        System.out.println("这个变量的值"+username);
		//这个变量的值tomcat
        return "success";
    }

3. @RequestParam注解

@RequestParam:获取请求参数的;参数默认是必须带的;

@RequestParam("user")String username 等效于原来的username =request.getParameter("user")
前端

<a href="handle01?user=tomcat">helloworld</a><br/>

后端

@RequestMapping("/handle01")
    public String  handle01(@RequestParam("user")String username){
        System.out.println("这个变量的值"+username);
		//这个变量的值tomcat
        return "success";
    }
  • 在处理方法入参处使用 @RequestParam 可以把请求参数传递给请求方法

@RequestParam三个属性

  • value:参数名,指定要获取的参数的key
  • required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
  • defaultValue: 默认值,当没有传递参数时使用该值

@PathVariable@RequestParam 的区别

@PathVariable 是获得请求路径上占位符的值

@PathVariable("user") 对应的url /book/{user}

@RequestParam是获得请求参数的值(?后)

@RequestParam("user")对应的url/book?user=admin

4. @RequestHeader 注解

  • 使用 @RequestHeader 绑定请求报头的属性值
  • 请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中
    @RequestHeader("User-Agent")String userAgent 等效于原来的userAgent = request.getHeader(“User-Agent”)
    如果请求头中没有这个值就会报错
    @RequestHeader() 注解注解有三个属性value() required() defaultValue()
  • value:参数名,指定要获取的参数的key
  • required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
  • defaultValue: 默认值,当没有传递参数时使用该值
//了解: 映射请求头信息 用法同 @RequestParam
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept-Language") String al){
System.out.println("testRequestHeader - Accept-Language:"+al);
return "success";
}
<!-- 测试 请求头@RequestHeader 注解使用 -->
<a href="springmvc/testRequestHeader">testRequestHeader</a>

5. @CookieValue 注解

  • 使用 @CookieValue 绑定请求中的 Cookie 值
  • @CookieValue 可让处理方法入参绑定某个 Cookie 值

以前的操作
获取某个cookie的值; 以前的操作获取某个cookie;

Cookie[] cookies =request.getCookies(); 
for(Cookie c:cookies){
  if(c.getName().equals("JSESSIONID")){ 
  String   cv = c.getValue();
} }

@CookieValue

  • value:参数名,指定要获取的参数的key
  • required:是否必须。默认为 true, 表示请求参数中必须包含对应的参数,若不存在,将抛出异常
  • defaultValue: 默认值,当没有传递参数时使用该值
@RequestMapping("/handle01")
	public String handle01(@CookieValue(value="JSESSIONID",required=false)String jid) {
		System.out.println("cookie中的jid的值"+jid);
		return "success";
	}

6. 使用POJO作为参数

  • 使用 POJO 对象绑定请求参数值
  • Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性值。支持级联属性。如:dept.deptId、dept.address.tel
    如果我们的请求参数是一个POJO;
    • SpringMVC会自动的为这个POJO进行赋值?
      1)原来将POJO中的每一个属性,从request参数中尝试获取出来,并封装即可;
      2)还可以级联封装;属性的属性
      3)请求参数的参数名和对象中的属性名一一对应就行

① 增加控制器方法、表单页面
后端

/**
 * Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配, 自动为该对象填充属性值。
 * 支持级联属性
 *                 如:dept.deptId、dept.address.tel 等
 */
@RequestMapping("/testPOJO")
public String testPojo(User user) {
System.out.println("testPojo: " + user);
return "success";
}

前台

<!-- 测试 POJO 对象传参,支持级联属性 -->
<form action=" testPOJO" method="POST">
username: <input type="text" name="username"/><br>
password: <input type="password" name="password"/><br>
email: <input type="text" name="email"/><br>
age: <input type="text" name="age"/><br>
city: <input type="text" name="address.city"/><br>
province: <input type="text" name="address.province"/>
<input type="submit" value="Submit"/>
</form>

② 增加实体类

public class Address {
 
private String province;
private String city;
 
//get/set
  
}
public class User {
private Integer id ;
private String username;
private String password;
 
private String email;
private int age;
 
private Address address;
 
//get/set 
}

③ 如果中文有乱码,需要配置字符编码过滤器,且配置其他过滤器之前,如(HiddenHttpMethodFilter),否则不起作用。
提交的数据可能有乱码:

  • 请求乱码:
    • GET请求:改server.xml;在8080端口处URIEncoding=“UTF-8”
    • POST请求:
      在第一次获取请求参数之前设置
    • request.setCharacterEncoding(“UTF-8”);
      SpringMVC有这个filter.CharacterEncodingFilter
  • 响应乱码:
    • response.setContentType(“text/html;charset=utf-8”)

	<filter>
		<filter-name>CharacterEncodingFilterfilter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
		
		<init-param>
			<param-name>encodingparam-name>
			<param-value>UTF-8param-value>
		init-param>
		<init-param>
			
			<param-name>forceEncodingparam-name>	
			<param-value>trueparam-value>
		init-param>
		
	filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilterfilter-name>
		<url-pattern>/*url-pattern>
	filter-mapping>
	
                    

你可能感兴趣的:(JAVA框架)