SpringMVC 常用注解 详解
SpringMVC 常用注解 详解
SpringMVC 常用注解
1、@RequestMapping 路径映射
2、@RequestParam 获取请求参数
3、@PathVariable 绑定URL 模板变量值
4、@ModelAttribute 用在方法上 / 用在方法参数列表上
5、@SessionAttributes 将值放到session 域中
6、@ResponsBody 与 @RequestBody 传输json 格式数据
本文摘自 https://www.cnblogs.com/xiaoxi
未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
@RequestMapping
@RequestMapping 是一个用来处理请求地址(URL 路径映射)映射的注解(将请求映射到对应的控制器方法中),可以用在类上或方法上,用在类上 设置请求前缀,用在方法上 设置请求后缀。
@RequestMapping 中的方法:
value 指定请求路径
method 指定请求类型
params 指定request 中必须包含某些参数值,才能让该方法执行
headers 指定request 中必须包含指定的header 才能让该方法执行
consumes 指定请求的内容类型 例如:Application/json , text/html
Produces 指定返回的内容类型,仅当request 请求头中的类型包含该指定类型才能返回
@RequestMapping 的方法
一、value指定请求路径
1、指定多个路径 中间使用逗号隔开
@RequestMapping(value={"/updateitem","/updateitems","/list"})
@RequestMapping(value={"/updateitem","/updateitems","/list"})
/**
* 可以多个请求访问该类或者方法,
* 访问路径 : http://localhost:8080/updateitem 或者 http://localhost:8080/list
*/
2、@RequestMapping 作用在类上 // 只要符合请求路径,都可以访问该类
@RequestMapping(value = "/json/info/{itemId}")
@ResponseBody
public Items getItemById(@PathVariable("itemId") int id) {
Items items = itemService.getItemById(id);
return items;
}
/**
*访问地址为:http://localhost:8080/item/queryItem
**/
@RequestMapping 作用在类上
3、同时作用在类上,方法上 // 请求时应符合前缀(类上的@RequestMapping)+后缀(方法上的@RequestMapping)
@Controller
@RequestMapping(value = "/item")
public class ItemController {
@RequestMapping(value = "/json/info-list")
public List<Items> getItemById() {
return itemService.getItemList();
}
}
/**
*访问地址 http://localhost:8080/item/json/info-list
*注意:
* 由于在类上加了 /item ,所以在访问该类的每个方法时,都应该带上前缀/item
**/
@RequestMapping 同时作用在类上与方法上
4、路径中含某变量的值 // 获取路径中的参数,赋值给方法的形参
@RequestMapping("/json/info/{itemId}")
@ResponseBody
public Items getItemById(@PathVariable("itemId") int id) {
Items items = itemService.getItemById(id);
return items;
}
/**
* 获取路径中的参数 itemId 的值,赋值给 int id
**/
获取路径中的参数,赋值给形参
二、method 指定请求类型 {RequestMethod.GET(get 请求), RequestMethod.POST(post请求)}
@Controller
@RequestMapping(value = "/item" , method = RequestMetod.GET)
public class ItemController {
@RequestMapping(value = "/json/info-list")
public List<Items> getItemById() {
return itemService.getItemList();
}
} /**
* Method方法 用来设置请求类型
* 取值 : GET POST
*/
指定请求类型
三、params 指定request 中必须包含某些参数值,才能让该方法执行
@RequestMapping(value = "/ info")
public class ItemController {
@RequestMapping(value = "/qwe",params="action=123")
public List<Items> getItemById(@PathVariable("itemId") int id) {
return itemService.getItemList();
}
}
/**
* 访问地址为:http://localhost:8080// info/qwe?action=123
* 路径中必须包含 “action =123” 参数 该方法才能执行
**/
params 方法的示例
四、headers 指定request 中必须包含指定的header值 才能让该方法执行
@RequestMapping(value = "/info")
public class ItemController {
@RequestMapping(value = "/header",headers="Accept=application/json")
public List<Items> getItemById() {
return itemService.getItemList();
}
}
/**
* 访问地址为:http://localhost:8080// info/header
* 且请求头中必须有 "Accept=application/json" 参数 ,该方法才能执行
**/
headers 方法
五、consumes 指定请求的内容类型例如Application/json , text/html
@RequestMapping(value = "/info")
public class ItemController {
@RequestMapping(value = "/header", consumes ="application/json")
public List<Items> getItemById() {
return itemService.getItemList();
}
}
/**
* 访问地址为:http://localhost:8080// info/header
* 该方法仅处理request Content-Type 为application/json 类型的请求
**/
consumes 方法
六、produces 指定返回的内容类型,仅当request 请求头中的(Accept)类型包含该指定类型才能返回
@RequestMapping(value = "/info")
public class ItemController {
@RequestMapping(value = "/header", produces ="application/json")
public List<Items> getItemById() {
return itemService.getItemList();
}
}
/**
* 访问地址为:http://localhost:8080// info/header
* 该方法仅处理request请求头中(Accept)包含了 “application/json”,
* 同时暗示了返回的内容类型为 “application/json”
**/
produces 方法
@RequestParam 获取url 中的参数
@RequestParam 用于将url 中的的参数,映射到方法的参数上。
@RequestMapping(value = "/info")
public class ItemController {
@RequestMapping(value = "/body")
public String getItemByName(@RequestParam String username) {
return username();
}
}
/**
* 访问地址为:http://localhost:8080// info/body
* 将url 路径中携带的名为username 的参数,赋值给方法username参数
* 即:http://localhost:8080// info/body?username=“张三” 则将张三赋值给username
**/
@RequestParam 注解
@RequestParam 注解有三个参数: value required defaultValue
1、value : 即url 路径中参数的名字
2、required : 是否必须,默认为 true ,表示请求中一定要有相应的参数,否者会抛出异常。
即:若上面代码中,url 路径中没有与方法同名的参数,将会抛出异常。
3、defaultValue : 默认值,表示若请求中没有同名参数时的默认值,设置该参数时,自动将required设为false。
注意:1、若url请求参数中没有对应的username 的参数,则会抛出异常
2、可以设置required 的值为false ,这样若url 请求中没有对应的参数,则会默认为null
如果请求中有多个同名的应该如何接收呢?如给用户授权时,可能授予多个权限,首先看下如下代码:
public String requestparam7(@RequestParam(value="role") String roleList)
如果请求参数类似于url?role=admin&rule=user,则实际roleList参数入参的数据为“admin,user”,即多个数据之间使用“,”分割;我们应该使用如下方式来接收多个请求参数:
public String requestparam7(@RequestParam(value="role") String[] roleList)
或者
public String requestparam8(@RequestParam(value="list") List<String> list)
@PathVariable 绑定URL 模板变量值
@PathVariable 可以将路径(url)中的参数映射到方法的参数上,
// 在请求路径中设置变量{itemId}
@RequestMapping("/json/info/{itemId}")
// 使用@PathVariable("itemId") 获取路径中的变量 itemId 的值
@ResponseBody
public Items getItemById(@PathVariable("itemId") int id) {
Items items = itemService.getItemById(id);
return items;
}
@PathVariable 示例
@ModelAttribute
ModelAttribute可以应用在方法参数上或方法上,他的作用主要是当注解在方法参数上时会将注解的参数对象添加到Model中;当注解在请求处理方法Action上时会将该方法变成一个非请求处理的方法,但其它Action被调用时会首先调用该方法。
@ModelAttribute注释一个方法
被@ModelAttribute注释的方法表示这个方法的目的是增加一个或多个模型(model)属性。这个方法和被@RequestMapping注释的方法一样也支持@RequestParam参数,但是它不能直接被请求映射。实际上,控制器中的@ModelAttribute方法是在同一控制器中的@RequestMapping方法被调用之前调用的。
被@ModelAttribute注释的方法用于填充model属性,例如,为下拉菜单填充内容,或检索一个command对象(如,Account),用它来表示一个HTML表单中的数据。
一个控制器可以有任意数量的@ModelAttribute方法。所有这些方法都在@RequestMapping方法被调用之前调用。
有两种类型的@ModelAttribute方法。一种是:只加入一个属性,用方法的返回类型隐含表示。另一种是:方法接受一个Model类型的参数,这个model可以加入任意多个model属性。
@SessionAttributes 将值放到session 域中
在默认情况下,ModelMap中的属性作用域是request级别,也就是说,当本次请求结束后,ModelMap 中的属性将销毁。如果希望在多个请求中共享ModelMap中的属性,必须将其属性转存到session 中,这样 ModelMap 的属性才可以被跨请求访问。
Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。
package demo.controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes; import demo.model.User; @Controller
@RequestMapping(value="/demo1")
//(1)将ModelMap中属性名为currUser的属性放到Session属性列表中,以便这个属性可以跨请求访问
@SessionAttributes("currUser")
public class Demo1Controller { @RequestMapping(value="/getUser")
public String getUser(ModelMap model){
User user=new User();
user.setUser_name("zhangsan");
user.setUser_age(25);
user.setUser_email("zhangsan@sina.com");
//(2)向ModelMap中添加一个属性
model.addAttribute("currUser",user);
return "/demo/user";
} @RequestMapping(value="/getUser1")
public String getUser1(ModelMap model){
User user=(User)model.get("currUser");
System.out.println(user.getUser_name());
System.out.println(user.getUser_age());
System.out.println(user.getUser_email());
return "demo/user1";
}
}
@SessionAttributes 注解
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="demo.model.User" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
</head>
<body><br>
<%User user=(User)session.getAttribute("currUser");%>
用户名:<%=user.getUser_name() %><br/>
年龄:<%=user.getUser_age() %><br/>
邮箱:<%=user.getUser_email() %><br/><br/>
<a href="<%=path %>/demo1/getUser1">跳转</a>
</body>
</html>
JSP 页面
如上例代码中,我们在getUser 方法上使用了@SessionAttributes 注解,所以在getUser方法中通过@SessionAttributes 注解将 ModelMap 中名为 currUser 的属性放置到 Session 中,所以我们不但可以在 getUser() 请求所对应的 JSP 视图页面中通过 request.getAttribute(“currUser”) 和 session.getAttribute(“currUser”) 获取 user 对象,还可以在下一个请求(getUser1())所对应的 JSP 视图页面中通过 session.getAttribute(“currUser”) 或 session.getAttribute(“currUser”)访问到这个属性。
这里我们仅将一个 ModelMap 的属性放入 Session 中,其实 @SessionAttributes 允许指定多个属性。你可以通过字符串数组的方式指定多个属性,如 @SessionAttributes({“attr1”,"attr2”})。此外,@SessionAttributes 还可以通过属性类型指定要 session 化的 ModelMap 属性,如 @SessionAttributes(types = User.class),当然也可以指定多个类,如 @SessionAttributes(types = {User.class,Dept.class}),还可以联合使用属性名和属性类型指定:@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,"attr2”})。
@Controller
@SessionAttributes("currentUser")
public class GreetingController{
@RequestMapping
public void hello(@ModelAttribute("currentUser") User user){
//user.sayHello()
}
}
通过@ModelAttribute绑定
@SessionAttributes 是用来在 controller 内部共享 model 属性的。
我们可以在需要访问 Session 属性的 controller 上加上 @SessionAttributes,然后在 action 需要的 User 参数上加上 @ModelAttribute,并保证两者的属性名称一致。SpringMVC 就会自动将 @SessionAttributes 定义的属性注入到 ModelMap 对象,在 setup action 的参数列表时,去 ModelMap 中取到这样的对象,再添加到参数列表。只要我们不去调用 SessionStatus 的 setComplete() 方法,这个对象就会一直保留在 Session 中,从而实现 Session 信息的共享。
@SessionAttributes清除
@SessionAttributes需要清除时,使用SessionStatus.setComplete();来清除。注意,它只清除@SessionAttributes的session,不会清除HttpSession的数据。故如用户身份验证对象的session一般不用它来实现,还是用session.setAttribute等传统的方式实现。
@ResponseBody 与 @RequestBody
@ResponseBody 是作用在方法上,表示将该方法的返回结果直接写入到HTTP response body 中,
我们在使用@RequestMapping 注解后,需要将返回值解析,然后将解析结果为跳转路径,加上@ResponseBody 注解后,返回结果不会被解析,而是直接写入HTTP response body 中。
比如:返回json 数据,加上@ResponseBody 后,会直接返回json 格式数据
示例:
@RequestMapping("/json/info/{itemId}")
@ResponseBody
public Items getItemById(@PathVariable("itemId") int id) {
Items items = itemService.getItemById(id);
return items;
}
@ResponseBody
@RequestBody 是作用在形参列表上,表示将HTTP 请求正文出入到方法中,使用适合HTTPMessageConverter 将请求体写入某个对象
比如 : 用来传输 json 格式数据时,使用@RequestBody
// 接收json 格式数据,并返回json 格式数据
@RequestMapping("/json/rec")
@ResponseBody // 返回json 格式数据
public Items getJsonItem(@RequestBody Items items) { // 接收json 格式数据
return items;
}
@RequestBody
SpringMVC 常用注解 详解的更多相关文章
- springmvc常用注解详解
1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
- springMVC的注解详解
springmvc常用注解标签详解 1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业 ...
- Spring Data Jpa (五)@Entity实例里面常用注解详解
详细介绍javax.persistence下面的Entity中常用的注解. 虽然Spring Data JPA已经帮我们对数据的操作封装得很好了,约定大于配置思想,帮我们默认了很多东西.JPA(Jav ...
- SpringMVC @RequestMapping注解详解
@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...
- 一 : springmvc常用注解
springmvc常用注解详解1.@Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层 ...
- 转:springmvc常用注解标签详解
Spring5:@Autowired注解.@Resource注解和@Service注解 - IT·达人 - 博客园--这篇顺序渐进,讲得超级好--此人博客很不错http://www.cnblogs.c ...
- SpringMVC常用注解實例詳解3:@ResponseBody
我的開發環境框架: springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...
- SpringMVC常用注解實例詳解2:@ModelAttribute
我的開發環境框架: springmvc+spring+freemarker開發工具: springsource-tool-suite-2.9.0JDK版本: 1.6.0_29tomcat ...
- SpringMVC 注解详解
SpringMVC常用注解说明 @Bean, @Configuration表示基于Java配置的类@Bean除了配置在@Configuration,也可以在@Component定义,此时没有特殊意义, ...
随机推荐
- 2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)
题目链接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , ...
- 转:字符集和字符编码(Charset & Encoding)
转自:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html ——每个软件开发人员应该无条件掌握的知识! ——Unicode伟大的创 ...
- UVALive 3668 A Funny Stone Game
题目链接:UVALive - 3668 题目大意为给定n堆石子,每次的操作是选择三个数i<j<=k,从i中拿一枚石子,在j和k中分别放入一枚石子.不能操作者输.求先手是否能赢,若可以,则输 ...
- java中参数传递--值传递,引用传递
java中的参数传递——值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...
- day41 - 异步IO、协程
目录 (见右侧目录栏导航) - 1. 前言- 2. IO的五种模型- 3. 协程 - 3.1 协程的概念- 4. Gevent 模块 - 4.1 gevent 基本使用 - 4.2 ...
- /bin、/sbin、/usr/bin、/usr/sbin目录Linux执行文档的区别
/bin./sbin./usr/bin./usr/sbin目录的区别 在linux下我们经常用到的四个应用程序的目录是/bin./sbin./usr/bin./usr/sbin .而四者存放的文件 ...
- Effective C++笔记(三):资源管理
参考:http://www.cnblogs.com/ronny/p/3745098.html 资源:动态分配的内存.文件描述器.互斥锁.图形界面中的字型与笔刷.数据库连接以及网络sockets等, ...
- 使用亚马逊云服务器EC2做深度学习(三)配置TensorFlow
这是<使用亚马逊云服务器EC2做深度学习>系列的第三篇文章. (一)申请竞价实例 (二)配置Jupyter Notebook服务器 (三)配置TensorFlow (四)配置好的系统 ...
- python存取数据进阶技巧-pickle,array模块
我们在存/取数据时,没有必要存成文本形式,多试试二进制形式,文本只是骗骗眼睛的,要更快和更高效 1.数组形式 如果我们需要一个之包含数字的列表,那就试试array.array,注意,不是numpy模块 ...
- Python全栈开发之10、网络编程
网络编程就是如何在程序中实现两台计算机的通信,而两台计算机间的通信其实就是两个进程间的通信,进程间的通信主要通过socket(套接字)来描述ip地址(主机)和端口(进程)来实现的,因此我们学习网络编程 ...