(尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.csdn.net/article/details/88375220冷血之心的博客)
Spring MVC学习目录导航:
目录
在上一篇博客中,我们比较详细的记录下了Spring MVC的开发步骤和执行流程,在这篇博客中,我们来总结下SpringMVC中常见的注解,以备时常查阅学习~
Spring从2.5版本开始引入注解,注解的不断拓展使得开发工作变得轻松,接下来我们介绍常用的注解。
@Controller注解:
该注解用于标记一个类是SpringMVC的Controller对象,即一个控制器类。Spring使用自动扫描可以查找到基于注解的控制器类。分发处理器会扫描使用了该注解的类的方法,并且检测该方法是否使用了@RequestMapping注解,使用@RequestMapping注解的方法就是真正处理请求的处理器。为了保证Spring能找到控制器,需要完成如下两件事:
- 在SpringMVC的配置文件的头文件中引入spring-context。
- 使用<context:component-scan>元素开启自动扫描,那么带有@Controller,@Service,@repository,@Component等注解的类将成为Spring的Bean。
自动扫描的配置如下:
<context:component-scan base-package="com.ywq"/>
这个配置的含义就是所有在该基本包下的控制器类都会被自动扫描创建。
@RequestMapping
上边我们提到了@RequestMapping注解,该注解指示了用哪一个类或者方法来处理某一个具体的请求动作,可以用于方法或者类。示例如下:
@RestController
@RequestMapping("/home")
public class IndexController {
@RequestMapping("/")
String get() {
//mapped to hostname:port/home/
return "Hello from get";
}
@RequestMapping("/index")
String index() {
//mapped to hostname:port/home/index/
return "Hello from index";
}
}
如上述代码所示,到 /home 的请求会由 get() 方法来处理,而到 /home/index 的请求会由 index() 来处理。
value属性:
该属性是一个默认属性,如果该注解只有一个属性,那么我们可以省略value,类似案例中的@RequestMapping("/index") 相当于@RequestMapping(value="/index") ,当然,value属性也可以是空字符串。
method属性:
该属性用来指示该方法仅仅处理哪些HTTP的请求方式,
@RequestMapping(value="/index", method=RequestMethod.POST)
以上配置表明仅仅处理POST请求。没指定method属性,则可以处理任意的HTTP请求方式。
consumes属性:
该属性指定处理请求的提交内容类型(Content-Type)
@RequestMapping(value="/index", method=RequestMethod.POST,consumes="application/json")
表明该方法仅仅处理Content-Type为“application/json”类型的请求。
produces属性:
该属性指定返回的内容类型,返回的类型必须是request请求头中所包含的类型。
@RequestMapping(value="/index", method=RequestMethod.POST,produces="application/json")
表明该方法仅仅处理Content-Type为“application/json”类型的请求,并且返回的内容类型也是“application/json”。
params属性:
该属性指定request中必须包含某些参数值时,才会处理该请求。
@RequestMapping(value="/index", method=RequestMethod.POST,params="myParam=myValue")
该方法仅处理其中名为myParam,值为myValue的请求。
headers属性:
@RequestMapping(value="/index", method=RequestMethod.POST,headers="Referer=http://www.fkit.org/")
该方法仅处理request的header中包含了指定Referer请求头和对应值为“http://www.fkit.org/"的请求。
既然SpringMVC是一个Web层的框架,那么前后端交互肯定是不可少的,那么我们还需要注解来实现参数绑定。在org.springframework.web.bind.annotation包中有相关的参数绑定注解,可以分为如下几类:
- 处理request body部分的注解:@RequestParam,@Requestbody
- 处理request uri部分的注解:@PathVariable
- 处理request header部分的注解:@Requestheader,@CookieValue
- 处理attribute类型的注解:@SessionAttributes,@ModelAttribute
接下来我们挨个来介绍这些参数绑定注解.
@RequestParam注解:
该注解用于将指定请求参数赋值给方法中的形参。
@RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(@RequestParam(value="username") String userName, @RequestParam(value="usernick") String userNick){
System.out.println("requestParam Test");
System.out.println("username: " + userName);
System.out.println("usernick: " + userNick);
return "hello";
}
上述代码会将请求中的username参数的值赋给username变量。
@RequestMapping(value="/requestParamTest", method = RequestMethod.GET)
public String requestParamTest(String username, HttpServletRequest request){
System.out.println("requestParam Test");
System.out.println("username: " + username);
String usernick = request.getParameter("usernick");
System.out.println("usernick: " + usernick);
return "hello";
}
@RequestBody:
该注解可以接收json格式的数据,并将其转换成对应的数据类型。
@RequestMapping(value="/findBookByName", method = RequestMethod.POST)
@ResponseBody
public DbBook findBookByName(@RequestBody DbBook book){
System.out.println("book: " + book.toString());
System.out.println("book name: " + book.getTitle());
String bookName = book.getTitle();
DbBook book = wxService.findBookByName(bookName);
return book;
}
@PathVariable:
该注解可以获取请求URL中的动态参数,只有一个属性value,类型为String,表示绑定的名称,如果省略则默认为绑定同名参数。
@RequestMapping(value="/pathVariabletest/{userId}")
public void pathVariableTest(@PathVariable Integer userId)
如果请求为:”http://localhost:8080/Test/pathVariabletest/1“,那么同名变量userId将会被自动赋值为1。
@Requestheader:
该注解用于将请求头的信息数据映射到功能处理方法的参数上。
@RequestMapping(value="/test")
public void requestHeaderTest(@RequestHeader("User-Agent") String userAgent
@RequestHeader(value="Accept") String[] accepts)
@CookieValue:
该注解用于将请求的Cookie数据映射到功能才处理方法的参数上。
@RequestMapping(value="/cookieValueTest")
public void cookieValueTest(@CookieValue(value="JSESSIONID",defaultValue="") String sessionId)
以上配置会自动将JSESSIONID的值设置到sessionId参数上,并且设置了默认值。
@SessionAttributes:
该注解类型允许我们有选择地指定Model中的哪些属性需要庄村到HttpSession对象中。只能声明在类上,不可以声明在方法上。
@SessionAttributes(value={"user"})
@Controller
public class UserController {
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Model model){
User user = new User("jack","123456");
model.addAttribute("user", user);
return "success";
}
}
- 处理方法testSessionAttributes在model中存放了属性名为user的数据。
- 处理结束后,model里的数据会被放入到request中,页面通过request域可以获取到。
- 而这里使用了@SessionAttributes(value={“user”})将model中属性名为user的数据copy一份进了session域中。
在返回的页面success.jsp中通过${requestScope.user}可以在request和session域中获取到属性名为user的数据。
@ModelAttribute:
该注解类型将请求参数绑定到Model对象。只有一个属性value,类型为String,表示绑定的属性名称。被该注解注释的方法会在Controller每一个方法执行前被执行,因此,在一个Controller映射到多个URL时候,要谨慎使用。
总结:
本文总结了SpringMVC中常用的注解,包括@Controller,@RequestMapping以及众多的参数绑定注解。
如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。