在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;

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

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

注:最好是将@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 中还是存放在模型中.

我们请求 /testController/sayHello.do 的时候使用 @ModelAttribute 标记的方法会先执行,然后把它们返回的对象存放到模型中。最终访问到 sayHello 方法的时候,使用 @ModelAttribute 标记的方法参数都能被正确的注入值。
输出结果 :
userName 小败笔, userName myUser
由执行结果我们可以看出来,此时 session 中没有包含任何属性,也就是说上面的那些对象都是存放在模型属性中,而不是存放在 session 属性中。那要如何才能存放在 session 属性中呢?这个时候我们先引入一个新的概念 @SessionAttributes ,它的用法会在讲完 @ModelAttribute 之后介绍,这里我们就先拿来用一下。我们在TestController 类上加上 @SessionAttributes 属性标记哪些是需要存放到 session 中的。看下面的代码:
下面的程式和上面的只有类的头部多加了一个 SessionAttribute 来确认要把什么类型的值放到 Session 中.

在上面代码中我们指定了属性为 intValue 或 stringValue 或者类型为 User 的都会放到 Session中.但是 , 第一次访问这个请求的时候画面不会输出我们想在的值.只会输出下面红色部分.那是因为只有当这个方法跑完之后程式才会往 Session 存储值.所以当第二次访问的时候才可以从 Session 拿这些值.输出下面红色与黑色的值.
输出结果 :
userName 小败笔, userName myUser
myUser
intValue
stringValue
当 @ModelAttribute 标记在处理器方法参数上的时候,表示该参数的值将从模型或者 Session 中取对应名称的属性值,该名称可以通过 @ModelAttribute(“attributeName”) 来指定,若未指定,则使用参数类型的类名称(首字母小写)作为属性名称。
以上就是今天主讲的主要内容,明天我们将继续讲解 SpringMVC的其他注解.欢迎持续关注.
1400 GB JAVA, GO, Python, C,C++,电子书 免费送
