在springmvc中,许多注解能够帮助我们大大提高开发效率,这里小编讲述一下最常见的七种注解
1. RequestParam注解
- 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
- 属性
- value:请求参数中的名称
- required:请求参数中是否必须提供此参数,默认值是true,必须提供
概念引导:
/* 接收请求 @return */
@RequestMapping(path="/testParam")
public String testParam(@RequestParam(value="username",required=false)String name) {
System.out.println(name);
return "success";
}
注意:传值要与注解中的参数对应,否则将不会被自动封装上,则会变成null值,2.当添加了注解required=false,如果不参入参数也不会抛出400请求错误,如果不添加,默认需要传入参数,否则会报400错误
2. RequestBody注解
- 作用:用于获取请求体的内容(注意:get方法不可以)
- 属性
required:是否必须有请求体,默认值是true
2.1 引导案例:
@RequestMapping(value = "/testBody")
public String testBody(@RequestBody String body){
System.out.println("testBody Method ... ");
System.out.println(body);
return "success";
}
2.2 表单内容如下:
<form action="/test/testBody" method="post">
姓名:<input type="text" name="username" />
密码:<input type="text" name="password" />
金额:<input type="text" name="money" />
<input type="submit" value="提交" />
</form>
2.3 提交页面:
输出结果:
testBody Method …
username=%C3%A7%C2%BD%C2%97%C3%A4%C2%B8%C2%BD%C3%A4%C2%B8%C2%9D%C3%A5%C2%A1%C2%94&password=1024&money=200.5
2.4 注意:解决乱码的问题:在web.xml中配置
<!-- 配置过滤器 -->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
deploy服务器,输出结果:
testBody Method …
username=罗丽丝塔&password=1024&money=200.5
3. PathVariable注解
- 作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
- 属性
- value:指定url中的占位符名称
- Restful风格的URL
- 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
- restful风格的URL优点
- 结构清晰
- 符合标准
- 易于理解
- 扩展方便
3.1 引导案例:
@RequestMapping("/testVaripoty/{id}")
public String testVaripoty(@PathVariable(name = "id") String id){
System.out.println("testVaripoty Method ... ");
System.out.println(id);
return "success";
}
3.2 传值测试:
<a href="testVaripoty/100">测试PathVariable</a>
3.3 结果输出:
testVaripoty Method ...
100
这里注意:这里的写法格式是/路径/{参数名},在传值的时候也是“路径/值”,在传参数的时候不要习惯性的把 ‘ / ’ 写成 ’?‘
4. RequestHeader注解
- 作用:获取指定请求头的值
- 属性
value:请求头的名称
4.1 引导案例:
@RequestMapping(path="/testHeader")
public String testHeader(@RequestHeader(value="Accept") String header) {
System.out.println(header);
return "success";
}
5. CookieValue注解
- 作用:用于获取指定cookie的名称的值
- 属性
value:cookie的名称
5.1 引导案例:
@RequestMapping(path="/testCookie")
public String testCookie(@CookieValue(value="JSESSIONID") String cookieValue) {
System.out.println(cookieValue);
return "success";
}
5.2 注意:JSESSIONID是固定写法,在浏览器中可以看到的,这里写错了也是获取不到的
6. ModelAttribute注解
- 作用
- 出现在方法上:表示当前方法会在控制器方法执行前线执行。
- 出现在参数上:获取指定的数据给参数赋值。
- 两种实现方式:@ModelAttribute中设置返回对象 ; 使用map集合 + @ModelAttribute ( value = key) 的形式 完成
6.1 引导案例:(返回对象方式)
@ModelAttribute
public UserAccount firModol(String username){
System.out.println("welcome ..." + username);
//模拟查询数据库操作
UserAccount userAccount = new UserAccount();
userAccount.setUsername(username);
userAccount.setPassword("1234465");
return userAccount;
}
@RequestMapping("/testModolAttribute")
public String testModolAttribute(UserAccount userAccount){
System.out.println(userAccount);
return "success";
}
6.2 表单填写:
输出结果:
welcome …罗丽丝塔
UserAccount{username=‘罗丽丝塔’, password=‘33333’, money=null}
这里小编对为什么密码是33333做一个解释,@ModelAttribute表示最先被执行,小编在里面设置了密码,模拟查询数据库,但是此时小编提交的新的数据过来,于是将原来的数据覆盖了,就变成了表格中填写的数据,有点类似于修改个人资料的操作
6.3 引导案例(MAP+@ModelAttribute)
@ModelAttribute
public void firModol(String username , Map<String , UserAccount> map){
System.out.println("welcome ..." + username);
UserAccount userAccount = new UserAccount();
userAccount.setUsername(username);
userAccount.setPassword("1234465");
map.put("userAccounts",userAccount);
}
@RequestMapping("/testModolAttribute")
public String testModolAttribute(@ModelAttribute(value = "userAccounts") UserAccount userAccount){
System.out.println(userAccount);
return "success";
}
6.4 form表单填写:
6.5 输出结果:
welcome ...奥尼斯汀
UserAccount{username='奥尼斯汀', password='1024', money=null}
7. SessionAttributes注解
- 作用:用于多次执行控制器方法间的参数共享
- 属性
value:指定存入属性的名称
7.1 引导案例:创建TestSessionAttributes类
@Controller
@SessionAttributes(value = "msg")//将msg存入Session域中
public class TestSessionAttributes {
@RequestMapping("/setSessionAttribute")
//Model底层实现就是存入request域中
public String setSessionAttribute(Model model){
System.out.println("setSessionAttribute ...");
model.addAttribute("msg","美美");
return "success";
}
}
7.2 获取session
@RequestMapping("/getSessionAttribute")
public String getSessionAttribute(ModelMap modelmap){
System.out.println("getSessionAttribute ...");
String msg = (String) modelmap.get("msg");
System.out.println("msg : " + msg);
return "success";
}
7.3 删除Session域
@RequestMapping("/delSessionAttribute")
public String delSessionAttribute(SessionStatus sessionStatus){
System.out.println("delSessionAttribute ...");
sessionStatus.setComplete();
return "success";
}
7.4 jsp页面编写
<a href="setSessionAttribute">setSessionAttribute</a>
<a href="getSessionAttribute">getSessionAttribute</a>
<a href="delSessionAttribute">delSessionAttribute</a>
7.5 success界面编写(注意不要忽略isELIgnored=false)
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success</h1>
${msg}
${sessionScope}
</body>
</html>
7.6 页面测试
7.6.1 点击setSessionAttribute
7.6.2 点击getSessionAttribute
7.6.3 点击delSessionAttribute
这里还有个美美是因为request域中没有被清除,但是session域中已经被清楚了
这里就是常用的七大注解了,如有讲错的地方欢迎大家指正
转载:https://blog.csdn.net/weixin_43409994/article/details/105900984