SpringMVC常用注解标签详解 (一)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SpringMVC常用注解标签详解 (一)

在SpringMVC 中,所有的 Controller 请求都是由DispatcherServlet分配过来的.他将请求数据封装成一个 Model之后丢给Controller,然后再将 Model 带回的 View进行解析展示.在 SpringMVC 中我们只需要一个注解就可以把一个没有任何继承关系的普通 Java 类变成一个 Controller.然后加上 RequestMapping 来确定他的访问路径.他就可以被访问到了.

上面的说明只能说明他现在是一个 Controller 了,但还没有在 Spring 容易中进行注册.我们需要在 Spring 的 XML 文件中告诉 Spring 我们的 Controller 都放在哪些位置.如下.

context:component-scan base-package = “com.river.contro” /


 这个注解主要作用其实就是一个路径.专业名字叫关系映射.他一般用于 Controller 的类与某个方法中.这个注解有6个参数需要我们了解.

指定请求的实际地址,指定的地址可以是URI Template 模式;

指定请求的method类型, GET、POST、PUT、DELETE等;

指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

指定request中必须包含某些参数值是,才让该方法处理;

指定request中必须包含某些指定的header值,才能让该方法处理请求;


 @Resource@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

@Autowired为Spring提供的注解,需要导入包:

org.springframework.beans.factory.annotation.Autowired;

SpringMVC常用注解标签详解 (一)

 @Autowired注解是按照类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
SpringMVC常用注解标签详解 (一)

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

SpringMVC常用注解标签详解 (一)

:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。


 **代表的是**:该Controller的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用在BaseController当中,所有的Controller继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。

@SessionAttributes即将值放到session作用域中,写在class上面。

SpringMVC支持使用@ModelAttribute和@SessionAttributes 在不同的模型(model)和控制器之间共享数据。@ModelAttribute 主要有两种使用方式,一种是标注在方法上,一种是标注在 Controller 方法参数上。

    当@ModelAttribute 标记在方法上的时候,该方法将在处理器方法执行之前执行,然后把返回的对象存放在 session 或模型属性中,属性名称可以使用 @ModelAttribute(“attributeName”) 在标记方法的时候指定,若未指定,则使用返回类型的类名称(首字母小写)作为属性名称。关于 @ModelAttribute 标记在方法上时对应的属性是存放在 session 中还是存放在模型中.

SpringMVC常用注解标签详解 (一)

 我们请求 /testController/sayHello.do 的时候使用 @ModelAttribute 标记的方法会先执行,然后把它们返回的对象存放到模型中。最终访问到 sayHello 方法的时候,使用 @ModelAttribute 标记的方法参数都能被正确的注入值。

输出结果 : 

userName 小败笔, userName  myUser


 由执行结果我们可以看出来,此时 session 中没有包含任何属性,也就是说上面的那些对象都是存放在模型属性中,而不是存放在 session 属性中。那要如何才能存放在 session 属性中呢?这个时候我们先引入一个新的概念 @SessionAttributes ,它的用法会在讲完 @ModelAttribute 之后介绍,这里我们就先拿来用一下。我们在TestController 类上加上 @SessionAttributes 属性标记哪些是需要存放到 session 中的。看下面的代码:

下面的程式和上面的只有类的头部多加了一个 SessionAttribute 来确认要把什么类型的值放到 Session 中.

SpringMVC常用注解标签详解 (一)

 在上面代码中我们指定了属性为 intValue 或 stringValue 或者类型为 User 的都会放到 Session中.但是 , 第一次访问这个请求的时候画面不会输出我们想在的值.只会输出下面红色部分.那是因为只有当这个方法跑完之后程式才会往 Session 存储值.所以当第二次访问的时候才可以从 Session 拿这些值.输出下面红色与黑色的值.

输出结果 : 

userName 小败笔, userName  myUser

myUser

intValue

stringValue

当 @ModelAttribute 标记在处理器方法参数上的时候,表示该参数的值将从模型或者 Session 中取对应名称的属性值,该名称可以通过 @ModelAttribute(“attributeName”) 来指定,若未指定,则使用参数类型的类名称(首字母小写)作为属性名称。

以上就是今天主讲的主要内容,明天我们将继续讲解 SpringMVC的其他注解.欢迎持续关注.

1400 GB JAVA, GO, Python, C,C++,电子书 免费送

SpringMVC常用注解标签详解 (一)
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SpringMVC常用注解标签详解 (一)


 上一篇
下一篇 
SpringMVC常用注解标签详解 (二) SpringMVC常用注解标签详解 (二)
上一篇文章我们写了SpringMVC的一些注解,本篇我们来进一步聊一下 SpringMVC 的其他注解,上一篇没有看的可以去公众号的历史推广中看一下也可点击下方链接查阅。 该注解主要是用于将请求URL中的模板变量映射到功能处理方
2021-04-05