目录
RequestMapping 注解
源码:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping { }
作用:
用于建立请求 URL 和处理请求方法之间的对应关系。
出现位置:
类上:
请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
它出现的目的是为了使我们的 URL 可以按照模块化管理:
例如:
账户模块:
/account/add
/account/update
/account/delete
...
订单模块:
/order/add
/order/update
/order/delete
红色的部分就是把 RequsetMappding 写在类上,使我们的 URL 更加精细。
方法上:
请求 URL 的第二级访问目录。
属性:
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和
配置的一模一样。
例如:
params = {"accountName"},表示请求参数必须有 accountName
params = {"moeny!100"},表示请求参数中 money 不能是 100。
headers:用于指定限制请求消息头的条件。
注意:
以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。
示例
示例1
@Controller("accountController")
@RequestMapping("/account")
public class AccountController {
@RequestMapping("/findAccount")
public String findAccount() {
System.out.println("查询了账户。。。。");
return "success"; } }
jsp中代码:
//jsp 中的代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>requestmapping 的使用</title>
</head> <body>
<!-- 第一种访问方式 --> <a href="${pageContext.request.contextPath}/account/findAccount">
查询账户
</a> <br/>
<!-- 第二种访问方式 --> <a href="account/findAccount">查询账户</a>
</body>
</html>
//注意:
//当我们使用此种方式配置时,在 jsp 中第二种写法时,不要在访问 URL 前面加/,否则无法找到资源。
method 属性的示例
/**
* 保存账户
* @return
*/
@RequestMapping(value="/saveAccount",method=RequestMethod.POST)
public String saveAccount() {
System.out.println("保存了账户");
return "success"; }
//jsp 代码:
<!-- 请求方式的示例 --> <a href="account/saveAccount">保存账户,get 请求</a> <br/>
<form action="account/saveAccount" method="post"> <input type="submit" value="保存账户,post 请求">
</form>
params 属性的示例:
/**
* 删除账户
* @return
*/
@RequestMapping(value="/removeAccount",params= {"accountName","money>100"})
public String removeAccount() {
System.out.println("删除了账户");
return "success"; }
//jsp 中的代码:
<!-- 请求参数的示例 --> <a href="account/removeAccount?accountName=aaa&money>100">删除账户,金额 100</a> <br/>
<a href="account/removeAccount?accountName=aaa&money>150">删除账户,金额 150</a>
//注意:
//当我们点击第一个超链接时,可以访问成功。
//当我们点击第二个超链接时,无法访问。
RequestParam
使用说明
作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value
:请求参数中的名称。
required
:请求参数中是否必须提供此参数。默认值:
true
。表示必须提供,如果不提供将报错。
使用示例
//控制器中的代码:
/**
* requestParams 注解的使用
* @param username
* @return
*/
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,
@RequestParam(value="age",required=false)Integer age){
System.out.println(username+","+age);
return "success"; }
//jsp 中的代码:
<!-- requestParams 注解的使用 --> <a href="springmvc/useRequestParam?name=test">requestParam 注解</a>
RequestBody
使用说明
作用:
用于获取请求体内容。直接使用得到是
key=value&key=value...
结构的数据。
get
请求方式不适用。
属性:
required
:是否必须有请求体。默认值是
:true
。当取值为
true
时
,get
请求方式会报错。如果取值
为
false
,
get
请求得到是
null
。
使用示例
/**
* RequestBody 注解
* @param user
* @return
*/
@RequestMapping("/useRequestBody")
public String useRequestBody(@RequestBody(required=false) String body){
System.out.println(body);
return "success"; }
post 请求 jsp 代码:
<!-- request body 注解 --> <form action="springmvc/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>
get 请求 jsp 代码:
<a href="springmvc/useRequestBody?body=test">requestBody 注解 get 请求</a>
PathVaribale
使用说明
作用:
用于绑定
url
中的占位符。例如:请求
url
中
/delete/
{id}
,这个
{id}
就是
url
占位符。
url
支持占位符是
spring3.0
之后加入的。是
springmvc
支持
rest
风格
URL
的一个重要标志。
属性:
value
:用于指定
url
中占位符名称。
required
:是否必须提供占位符。
使用示例
/**
* PathVariable 注解
* @param user
* @return
*/
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
System.out.println(id);
return "success"; }
jsp 代码:
<!-- PathVariable 注解 --> <a href="springmvc/usePathVariable/100">pathVariable 注解</a>
RequestHeader
使用说明
作用:
用于获取请求消息头。
属性:
value
:提供消息头名称
required
:是否必须有此消息头
注:
在实际开发中一般不怎么用。
使用示例
控制器中代码:
/**
* RequestHeader 注解
* @param user
* @return
*/
@RequestMapping("/useRequestHeader")
public String useRequestHeader(@RequestHeader(value="Accept-Language",
required=false)String requestHeader){
System.out.println(requestHeader);
return "success"; }
jsp 中代码:
<!-- RequestHeader 注解 --> <a href="springmvc/useRequestHeader">获取请求消息头</a>
CookieValue
使用说明
作用:
用于把指定
cookie
名称的值传入控制器方法参数。
属性:
value
:指定
cookie
的名称。
required
:是否必须有此
cookie
。
使用示例
控制器中的代码:
/*** Cookie 注解注解
* @param user
* @return
*/
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)
String cookieValue){
System.out.println(cookieValue);
return "success"; }
jsp 中的代码:
<!-- CookieValue 注解 --> <a href="springmvc/useCookieValue">绑定 cookie 的值</a>
ModelAttribute
使用说明
作用:
该注解是
SpringMVC4.3
版本以后新加入的。它可以用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可
以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值。
属性:
value
:用于获取数据的
key
。
key
可以是
POJO
的属性名称,也可以是
map
结构的
key
。
应用场景:
当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:
我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数
据是肯定没有此字段的内容,一旦更新会把该字段内容置为
null
,此时就可以使用此注解解决问题。
使用示例
基于 POJO 属性的基本使用:
控制器代码:
/**
* 被 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"; }
jps 代码:
<!-- ModelAttribute 注解的基本使用 -->
<a href="springmvc/testModelAttribute?username=test">测试 modelattribute</a>
基于
POJO
属性的基本使用:
控制器中的代码:
/**
* 查询数据库中用户信息
* @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; }
jsp 中的代码:
<!-- 修改用户信息 --> <form action="springmvc/updateUser" method="post">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
SessionAttribute
使用说明
作用:
用于多次执行控制器方法间的参数共享。
属性:
value
:用于指定存入的属性名称
type
:用于指定存入的数据类型。
使用示例
控制器中的代码:
@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("a
ge"));
return "success";
}
@RequestMapping("/testClean")
public String complete(SessionStatus sessionStatus){
sessionStatus.setComplete();
return "success";
}
}
jsp 中的代码:
<!-- SessionAttribute 注解的使用 --> <a href="springmvc/testPut">存入 SessionAttribute</a> <hr/>
<a href="springmvc/testGet">取出 SessionAttribute</a> <hr/>
<a href="springmvc/testClean">清除 SessionAttribute</a>