3.1 @Controller注解
org.springframework. stereotype.Controller
注解用于指示Spring
类的实例是一个控制器,使用@Controller
注解的类不需要继承特定的父类或者实现特定的接口,相对之前的版本实现Controller
接口变得更加简单。而且Controller
接口的实现类只能处理一个单一请求动作,而@Controller
注解的控制器可以支持同时处理多个请求动作,更加灵活。@Controller
用于标记一个类,使用它标记的类就是一个Spring MVC Controller
对象,即一个控制器类。Spring
使用扫描机制査找应用程序中所有基于注解的控制器类。分发处理器会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping
注解,而使用@RequestMapping
注解的方法才是真正处理请求的处理器。为了保证Spring
能找到控制器,需要完成如下这两件事情:
- 在
Spring MVC
的配置文件的头文件
中引入spring-context
- 使用
<context:component-scan/>
元素- 该元素的功能为:启动包扫描功能,以便注册带有
@Controller
、@Service
、@Repository
、@Component
等注解的类成为Spring
的Bean
。 <context:component-scan/>
元素的base- package
属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。
配置文件中的示例如下所示:1
2<context:component-scan
base-package="org.fkit.controller" />
- 该元素的功能为:启动包扫描功能,以便注册带有
应该将所有控制器类都放在基本包下,并且指定扫描该包,即org.fkit.controller
,而不应该指定扫描org.fkit
包,以免Spring MVC
扫描了无关的包.
示例: @Controller注解的使用
新建一个项目ControllerTest
,加入所需的jar
文件,示例代码如下
HelloWorldController
1 | package org.fkit.controller; |
HelloWorldController
是一个基于@Controller
注解的控制器,helloWorld
方法上面的@RequestMapping
注解用来映射一个请求,@RequestMapping
注解的参数:"/helloWorld"
表示/helloWorld
这个请求由helloWorld
方法进行处理。 helloWorld
方法接收一个org.springframework.ui.Model
类型的参数,本例在model
中添加了一个名为message
的字符串对象,该对象可以在返回的视图当中通过request
对象获取。最后,方法返回一个字符串helloWorld
作为视图名称.
springmvc-config.xml
1 |
|
springmvc-config.xml
文件配置信息解释如下:
映射URL和控制器
由于使用了
@Controller
注解,因此不需要再在配置文件中使用XML
如下描述Bean
。1
2<!-- 配置Handle,映射"/hello"请求 -->
<bean name="/hello" class="org.fkit.controller.HelloController"/><context:component-scan base-package="org.fkit.controller" />
指定需要Spring
扫描org.fkit.controller
包及其子包下面的所有java
文件。
使用默认装配方案
<mvc: annotation-driven />
是一种简写形式,可以让初学者快速应用默认配置方案。<mvc:annotation-driven/>
会自动注册RequestMappingHandlerMapping
与RequestMappingHandlerAdapter
两个Bean
,这是Spring MVC
为@Controllers
分发请求所必需的,并且还提供了:- 数据绑定支持、
@NumberFormatAnnotation
支持、@DateTimeFormat
支持、@Valid
支持、- 读写
XML
的支持(JAXB)
- 和读写
JSON
的支持(默认为Jackson)
等功能。本例处理Ajax
请求时,就使用到了对JSON
的支持功能。
静态资源处理器
<mvc: default-servlet-handler/>
是Spring MVC
的静态资源处理器,在web.xml
中,如果将DispatcherServlet
请求映射配置为"/"
,则Spring MVC
将捕获Web
容器所有的请求,包括静态资源的请求,而引入类似<script src="js/jquery-1.1.0.min.js"/>
这种静态资源文件的时候,DispatcherServlet
会将"/"
看成请求路径,找不到它的时候会导致提示404错误。当在springmvc-config.xml
中配置<mvc:default-servlet-handler />
后,会在Spring MVC
上下文中定义一个org.springframework.webservlet.resource.DefaultServletHttpRequestHandler
,它就像一个检查员,对进入DispatcherServlet
的URL
进行筛查,如果发现是静态资源的请求,就将该请求转由web
应用服务器默认的Servlet
处理:如果不是静态资源的请求,才由DispatcherServlet
继续处理。
视图解析器
最后配置了视图解析器InternalResourceViewResolver
来解析视图,将View
呈现给用户。视图解析器中配置的prefix
属性表示视图的前缀
,suffix
表示视图的后缀
,
例如返回的视图字符串是"helloWorld"
,经过视图解析器解析之后,视图的完整路径为前缀helloWorld后缀,也就是:/WEB-INF/content/helloWorld.jsp
。
使用默认的处理器映射器和处理器适配器
需要注意的是,此处没有配置处理器映射器
和处理器适配器
,当用户没有配置这两项时, Spring
会使用默认的处理器映射器和处理器适配器处理请求
此外,还需要在web.xml
文件中配置Spring MVC
的前端控制器DispatcherServlet
,因为每次配置基本一致此处不再赘述,读者可自行配置。
测试
部署ControllerTest
这个Web
应用,在浏览器中输入如下URL
来测试应用:
1 | http://localhost:8080/ControllerTest/helloWorld |
之后,会看到浏览器中显示HelloWorld!
,这表示Spring MVC
访问成功。
用于参数绑定的注解
Spring MVC
中用于参数绑定的注解
有很多,都在org.springframework.web.bind.annotation
包中,根据它们处理的request
的不同内容部分可以分为六类。
处理请求参数和内容部分的注解
@RequestMapp
,@RequestParam
、@GetMapping
、@PostMapping
,PutMapping
、@ DeleteMapping
、@PatchMapping
、@Requestbody
.、@ResponseBody
、@RequestPart
,@RestController
处理请求URL部分的注解
@PathVariable
、@MatrixVariable
、@CrossOrigin
。
处理请求头部分的注解
@RequestHeader
, @CookieValue
处理属性类型的注解
RequestAttribute
、@SessionAttribute
、@SessionAttributes
、@ModelAttribute
。
处理异常类型的注解
ExceptionHandler
、@ ControllerAdvice
、@RestControllerAdvice
、@ResponseStatus
。
绑定表单数据的注解
@InitBinder
。
接下来重点讲解常用的Spring MVC
注解。@InitBinder
注解用于解决类型转换问题,在第6章中讲解@RequestPart
注解用于绑定multipart/form-data"
参数,常用于文件上传,在第7章中讲解.
原文链接: 3.1 @Controller注解