springMVC学习笔记二(请求参数绑定、常用注解和转发与重定向)

请求参数绑定

一、绑定机制

我们都知道,表单中请求参数都是基于 key=value 的。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
例如:

<a href="/param1?username=张三"> 参数绑定</a>

请求参数为username=张三

  @GetMapping("/param1")
    public String test1(String username){
        return "success";
    }
二、支持的数据类型

1、基本类型参数:

  • 包括基本类型和 String 类型

2、POJO 类型参数:

  • POJO 类型参数:

3、数组和集合类型参数:

  • list集合、set集合、map集合、数组
三、使用示例

一、基本类型参数和String

请求地址和参数:

<a href="/param1?username=张三&age=10"> 参数绑定</a>

controller方法会处理请求,并把数据回显给客户端。

@Controller
public class ParamController {

    @GetMapping("/param1")
    public String test1(String username, Integer age, Model model){
        model.addAttribute("username",username);
        model.addAttribute("age",age);
        return "success";
    }
}

成功跳转页面success.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>
姓名:${username}<br>
年龄:${age}
</body>
</html>

测试结果:
点击a标签链接后,会跳转到成功页面。
在这里插入图片描述
说明:在方法上的参数名必须和请求参数的属性名保存一致。不然接收不了传递值。

@GetMapping("/param1")
	//param1?username=张三&age=10">
    public String test1(String name, Integer userage, Model model){
        model.addAttribute("username",name);
        model.addAttribute("age",userage);
        return "success";
    }

在这里插入图片描述
解决方法:@RequestParam注解。说到该注解的时候会说明。

二、POJO 类型参数

实体类User

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String username;
    private char sex;
    private Integer age;
    private String address;
}

请求表单,post提交:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>参数绑定</title>
</head>
<body>
    <a href="/param1?username=张三&age=10"> 参数绑定</a>

<br>
<br>
<form action="/pojoParam" method="post">
    姓名:<input type="text" name="username"><br>
    性别:<input type="text" name="sex"><br>
    年龄:<input type="text" name="age"><br>
    地址:<input type="text" name="address"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

说明:pojo类型参数请求数据的属性名和实体类的属性名必须一致,不然数据传递不了为null。

controller方法处理请求:

 @PostMapping("/pojoParam")
    public String test1(User user, Model model){
        model.addAttribute("user",user);
        return "success";
    }

说明:在方法参数上定义实体类参数,springMVC会自动识别把参数封装。

成功页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>
姓名:${username}<br>
年龄:${age}<br><br><br>

用户:
    姓名:${user.username}<br>
    性别:${user.sex}<br>
    年龄:${user.age}<br>
    地址:${user.address}<br>
</body>
</html>

测试:
填写表单内容:
在这里插入图片描述
结果:
在这里插入图片描述
二、集合类型

POJO 类中包含集合类型参数
User

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User2 {
    private String username;
    private String password;
    private Integer age;
    private List<Account> accounts;
    private Map<String,Account> accountMap;
}

Account

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
    private String name;
    private double money;
}

form表单数据:

<form action="/collectionParam" method="post">
        用户名称:<input type="text" name="username" ><br/>
        用户密码:<input type="password" name="password" ><br/>
        用户年龄:<input type="text" name="age" ><br/>
        账户 1 名称:<input type="text" name="accounts[0].name" ><br/>
        账户 1 金额:<input type="text" name="accounts[0].money" ><br/>
        账户 2 名称:<input type="text" name="accounts[1].name" ><br/>
        账户 2 金额:<input type="text" name="accounts[1].money" ><br/>
        账户 3 名称:<input type="text" name="accountMap['one'].name" ><br/>
        账户 3 金额:<input type="text" name="accountMap['one'].money" ><br/>
        账户 4 名称:<input type="text" name="accountMap['two'].name" ><br/>
        账户 4 金额:<input type="text" name="accountMap['two'].money" ><br/>
        <input type="submit" value="保存">
    </form>

controller处理请求:

 @PostMapping("/collectionParam")
    public String updateAccount(User2 user2, Model model) {
        model.addAttribute("user2",user2);
        return "success";
    }

成功页面:

用户:<br>
    用户名称:${user2.username}<br>
    用户密码:${user2.password}<br>
    用户年龄:${user2.age}<br>
    账户:<br>
        账户1姓名:${user2.accounts[0].name}<br>
        账户1金额:${user2.accounts[0].money}<br>
        账户2姓名:${user2.accounts[1].name}<br>
        账户2金额:${user2.accounts[1].money}<br>
        map:<br>
        ${user2.accountMap}

填写表单:
在这里插入图片描述
参数结果:
在这里插入图片描述

常用注解

一、@RequestParam

注解作用:把请求中指定名称的参数给控制器中的形参赋值。
属性:

  • value:请求参数中的名称。
  • required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

案例演示:
请求:

<a href="/param1?username=张三&age=10"> 参数绑定</a>

controller方法处理请求

@GetMapping("/param1")
    public String test1(@RequestParam(value = "username",required = true) String name, @RequestParam(value = "age",required = true) Integer userage, Model model){
        model.addAttribute("username",name);
        model.addAttribute("age",userage);
        return "success";
    }

说明:

  • 当页面参数名和方法参数不一致时,可以用注解value属性指定和请求参数一致的属性名。如果不指定,数据不能封装进去。
  • required属性赋值为false时,请求不提供参数时,数据为null。required属性赋值为true时,请求必须提供参数,不然程序报错。

二、@RequestBody

注解作用:

  • 用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。
  • get 请求方式不适用。把请求中指定名称的参数给控制器中的形参赋值。

属性:

  • value:请求参数中的名称。
  • required:用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。get 请求方式不适用。

请求表单:

<form action="/useRequestBody" method="post">
        用户名称:<input type="text" name="username" ><br/>
        用户密码:<input type="password" name="password" ><br/>
        用户年龄:<input type="text" name="age" ><br/>
        <input type="submit" value="保存">
    </form>

controller处理方法:

@PostMapping("/useRequestBody")
    public String useRequestBody(@RequestBody(required = false) String body) {
        System.out.println(body);
        return "success";

    }

测试结果:

username=admin&password=123456&age=20

三、@PathVariable

注解作用:

  • 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
  • url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。

属性:

  • value:用于指定 url 中占位符名称。
  • required:是否必须提供占位符。

示例使用:

请求:

<!-- PathVariable 注解 -->
    <a href="/usePathVariable/100">pathVariable 注解</a>

controller处理方法:

@GetMapping("/usePathVariable/{id}")
    public String usePathVariable(@PathVariable("id") Integer id){
        System.out.println("id="+id);
        return "success";
    }

测试结果:

id=100

四、@RequestHeader

作用:

  • 用于获取请求消息头。

属性:

  • value:提供消息头名称。
  • required:是否必须有此消息头

jsp 中代码:

<!-- RequestHeader 注解 -->
<a href="/useRequestHeader">获取请求消息头</a>

controller处理方法:

@GetMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
System.out.println(requestHeader);
return "success";
}

五、@CookieValue

作用:

  • 用于把指定 cookie 名称的值传入控制器方法参数。

属性:

  • value:指定 cookie 的名称。
  • required:是否必须有此 cookie。

使用示例:

请求:

<!-- CookieValue 注解 -->
<a href="/useCookieValue">绑定 cookie 的值</a>

controller处理方法:

@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) 
String cookieValue){
System.out.println(cookieValue);
return "success";
}

六、@ModelAttribute

作用:

  • 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。
  • 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
  • 出现在参数上,获取指定的数据给参数赋值。

属性:

  • value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。

1、 基于 POJO 属性的基本使用示例:

jps 代码:

<a href="/testModelAttribute?username=test">测试 modelattribute</a>

controller处理方法:

/**
* 被 ModelAttribute 修饰的方法
* @param user
*/
@ModelAttribute
public void showModel(User user) {
System.out.println("执行了 showModel 方法"+user.getUsername());
}

/**
* 接收请求的方法
* @param user
* @return
*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("执行了控制器的方法"+user.getUsername());
return "success";
}

测试结果:

执行了 showModel 方法test
执行了控制器的方法test

2、 基于 Map 的应用场景示例 一:ModelAttribute 修饰方法带返回值

需求:

  • 修改用户信息,要求用户的密码不能修改

jsp 的代码:

<!-- 修改用户信息 -->
<form action="springmvc/updateUser" method="post">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>

controller处理方法:

  /**
     * 模拟修改用户方法
     * @param user
     * @return
     */
    @PostMapping("/updateUser")
    public String updateUser(User user){
        System.out.println("控制器中处理请求的方法:修改用户:"+user);
        return "success";
    }


    @ModelAttribute
    public User showModel(String username) {
        //模拟去数据库查询
        User abc = findUserByName(username);
        System.out.println("执行了 showModel 方法"+abc);
        return abc;
    }

    private User findUserByName(String username) {
        User user = new User();
        user.setUsername(username);
        user.setAge(19);
        user.setPassword("123456");
        return user;

    }

测试:
在这里插入图片描述
测试结果:
在这里插入图片描述

3 、基于 Map 的应用场景示例 1:ModelAttribute 修饰方法不带返回值

需求:
修改用户信息,要求用户的密码不能修改。

请求表单:

<!-- 修改用户信息 -->
<form action="springmvc/updateUser" method="post">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>

controller处理方法:

	/**
	* 查询数据库中用户信息
	* @param user
	*/
	@ModelAttribute
	public void showModel(String username,Map<String,User> map) {
		//模拟去数据库查询
		User user = findUserByName(username);
		System.out.println("执行了 showModel 方法"+user);
		map.put("abc",user);
	}
	/**
	* 模拟修改用户方法
	* @param user
	* @return
	*/
	@RequestMapping("/updateUser")
	public String testModelAttribute(@ModelAttribute("abc")User user) {
		System.out.println("控制器中处理请求的方法:修改用户:"+user);
		return "success";
	}
	/**
	* 模拟去数据库查询
	* @param username
	* @return
	*/
	private User findUserByName(String username) {
		User user = new User();
		user.setUsername(username);
		user.setAge(19);
		user.setPassword("123456");
		return user;
	}

七、@SessionAttribute

作用:

  • 用于多次执行控制器方法间的参数共享。

属性:

  • value:用于指定存入的属性名称。
  • type:用于指定存入的数据类型。

使用示例:
jsp 中的代码:

<!-- SessionAttribute 注解的使用 -->
<a href="/testPut">存入 SessionAttribute</a>
<hr/>
<a href="/testGet">取出 SessionAttribute</a>
<hr/>
<a href="s/testClean">清除 SessionAttribute</a>

controller处理方法:

	@Controller("sessionAttributeController")
	@RequestMapping("/springmvc")
	@SessionAttributes(value ={"username","password"},types={Integer.class}) 
public class SessionAttributeController {
	/**
	* 把数据存入 SessionAttribute
	* @param model
	* @return
	* Model 是 spring 提供的一个接口,该接口有一个实现类 ExtendedModelMap
	* 该类继承了 ModelMap,而 ModelMap 就是 LinkedHashMap 子类
	*/
	@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("age")); 
	 	return "success"; 
	 } 
	 
	 @RequestMapping("/testClean") 
	 public String complete(SessionStatus sessionStatus){ 
		 sessionStatus.setComplete(); 
	 	return "success"; 
	 } 
}

转发与重定向

forward 转发

controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:

@RequestMapping("/testForward")
public String testForward() {
	System.out.println("AccountController 的 testForward 方法执行了。。。。");
	return "forward:/WEB-INF/pages/success.jsp";
}

也可以转发到controller内处理方法的请求:

@GetMapping("/hello2")
    public String hello2(){
        return "forward:/hello";
    }

说明:如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。它相当于“request.getRequestDispatcher(“url”).forward(request,response)”。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。

Redirect 重定向

contrller 方法提供了一个 String 类型返回值之后,它需要在返回值里使用:redirect:。

@RequestMapping("/testRedirect")
public String testRedirect() {
	System.out.println("AccountController 的 testRedirect 方法执行了。。。。");
	return "redirect:testReturnModelAndView";
}

也可以重定向到controller内处理方法的请求。

@GetMapping("/hello3")
    public String hello3(){
        return "redirect:/hello2";
    }

说明:它相当于“response.sendRedirect(url)”。需要注意的是,如果是重定向到 jsp 页面,则 jsp 页面不能写在 WEB-INF 目录中,否则无法找到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值