前言
Spring MVC作为Spring框架中的核心组件之一,其强大的功能在于能简洁高效地处理HTTP请求和响应。在开发Web应用时,理解和正确使用Spring MVC的注解,尤其是@RequestMapping
注解,至关重要。本文将详细讲解@RequestMapping
注解的使用方法,及其如何绑定请求参数到控制器方法的参数。
一、@RequestMapping注解的使用
@RequestMapping
注解是Spring MVC中最常用的注解之一,主要用于处理HTTP请求。它通过建立请求URL和处理方法之间的映射关系,从而确定请求的处理逻辑。
1.1 作用与基本使用
@RequestMapping
可以作用在方法上和类上:
- 作用在类上:指定请求的一级路径。
- 作用在方法上:指定请求的二级路径。
路径可以省略“/”,表示从应用的根目录开始。
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {
/**
* 处理请求 /role/save
* method="GET" 指定请求方式
* params="请求路径上传的参数"
*/
@RequestMapping(path = "/save", method = RequestMethod.GET)
public String save() {
System.out.println("保存角色...");
return "suc";
}
@RequestMapping(value = "/delete")
public String delete() {
System.out.println("删除角色...");
return "suc";
}
}
1.2 RequestMapping的属性
@RequestMapping
注解的常用属性包括:
path
或value
:指定请求的路径。method
:指定请求方式,如GET、POST等。params
:指定请求参数,当请求包含特定参数时,才会匹配该方法。
@RequestMapping(path = "/save", method = RequestMethod.POST, params = "action=save")
public String save() {
// 处理POST请求,且必须包含参数action=save
return "suc";
}
二、请求参数绑定
Spring MVC提供了自动绑定请求参数到控制器方法的功能。无论是简单的基础类型,还是复杂的JavaBean,Spring都能自动进行类型转换。
2.1 参数绑定机制
当用户提交一个表单时,Spring MVC会自动将表单提交的参数(k=v
格式)与控制器方法的参数进行绑定。默认情况下,表单的name
属性值与方法的参数名称需要一致。
2.2 支持的数据类型
Spring MVC支持以下类型的请求参数绑定:
- 基本数据类型:如
int
,boolean
,String
等。 - 实体类型(JavaBean):当参数为一个Java对象时,Spring MVC会将请求参数映射到该对象的属性。
- 集合类型:如
List
,Map
等集合类。
例子:基本数据类型和JavaBean
@Controller
@RequestMapping("/user")
public class UserController {
// 绑定基础数据类型
@RequestMapping("/save")
public String save(String username, Integer age) {
System.out.println("Username: " + username);
System.out.println("Age: " + age);
return "suc";
}
// 绑定JavaBean
@RequestMapping("/save1")
public String save1(User user) {
System.out.println(user);
return "suc";
}
// 绑定JavaBean包含对象的情况
@RequestMapping("/save2")
public String save2(User user) {
System.out.println(user);
return "suc";
}
// 绑定JavaBean包含集合的情况
@RequestMapping("/save3")
public String save3(User user) {
System.out.println(user);
return "suc";
}
}
JSP页面:表单提交
<html>
<head>
<meta charset="utf-8">
<title>请求参数绑定</title>
</head>
<body>
<h1>基础数据类型绑定</h1>
<form action="/user/save" method="get">
<input type="text" name="username"/><br/>
<input type="text" name="age"/><br/>
<input type="submit"/>
</form>
<h1>JavaBean绑定</h1>
<form action="/user/save1" method="post">
<input type="text" name="username"/><br/>
<input type="text" name="age"/><br/>
<input type="submit"/>
</form>
<h1>JavaBean包含对象绑定</h1>
<form action="/user/save2" method="post">
<input type="text" name="username"/><br/>
<input type="text" name="age"/><br/>
<input type="text" name="account.money"/><br/>
<input type="submit"/>
</form>
<h1>JavaBean包含集合绑定</h1>
<form action="/user/save3" method="post">
<input type="text" name="username"/><br/>
<input type="text" name="age"/><br/>
<input type="text" name="account.money"/><br/>
<input type="text" name="accounts[0].money"/><br/>
<input type="text" name="accounts[1].money"/><br/>
<input type="submit"/>
</form>
</body>
</html>
2.3 实体类与集合类型的绑定
- JavaBean:通过
name
和JavaBean
中的属性名匹配进行绑定。如果JavaBean包含其他引用类型,表单字段需要采用对象.属性
的方式命名。 - 集合类型:当表单中包含多个同名参数时,Spring MVC会自动封装成
List
或Map
等集合。
2.4 使用原生ServletAPI对象
除了使用Spring MVC的自动绑定功能外,我们还可以直接使用Servlet API(HttpServletRequest
,HttpServletResponse
等)进行操作:
@RequestMapping(value = "/save6.do", method = RequestMethod.POST)
public String save6(HttpServletRequest request, HttpServletResponse response) {
String username = request.getParameter("username");
System.out.println("Username: " + username);
HttpSession session = request.getSession();
System.out.println(session);
System.out.println(response);
return "suc";
}
三、不常用的注解
3.1 @RequestParam注解
@RequestParam
注解用于将HTTP请求中的指定参数绑定到方法参数中。它常用于请求参数的个别处理,特别是当请求参数的名称与方法参数的名称不一致时。
使用方法
@Controller
@RequestMapping("/dept")
public class DeptController {
@RequestMapping("/save")
public String save(@RequestParam(value = "username", required = false) String name) {
System.out.println("Username: " + name);
return "suc";
}
}
- value:指定请求参数的名称。
- required:指定该参数是否必须提供,默认值是
true
,如果未提供,则抛出MissingServletRequestParameterException
。
3.2 @RequestParam常见用法
- 指定请求参数名称:
@RequestParam("username")
public String saveUser(@RequestParam("username") String username) {
return "suc";
}
- 设置默认值:
@RequestParam(value = "username", defaultValue = "guest")
public String saveUser(@RequestParam("username") String username) {
return "suc";
}
结论
通过@RequestMapping
及其相关注解,Spring MVC简化了Web请求的处理过程,使得控制器能够更方便地与请求进行交互。掌握请求参数绑定、@RequestParam
的使用方法,以及如何处理表单数据和复杂类型,能帮助我们更高效地开发Web应用。在实际项目中,我们可以根据需求选择合适的注解进行处理,提高开发效率和代码可读性。