Spring从2.5开始引入注解,可以在Spring MVC中使用@Controller、@RequestMapping、@RequestParam、@ModelAttribute等类似的注解
@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。base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理<context:component-scan base-package="org.davieyang.controller">
代码示例
package org.davieyang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* HelloWorldController是一个基于@Controller注解的控制器
* @RequestMapping注解用来映射一个请求,value="/helloWorld"表示请求由helloWorld方法进行处理
* helloWorld方法接收一个 org.springframework.ui.Model类型的参数,本例在model中添加了一个名为message的字符串对象,该对象可以在返回的视图当中通过request对象获取。最后,方法返回一个字符串helloWorld作为视图名称
* 可以同时处理多个请求动作,并且无须实现任何接口。
* org.springframework.stereotype.Controller注解用于指示该类是一个控制器
*/
@Controller
public class HelloWorldController{
@RequestMapping("/helloWorld")
public String helloWorld(Model model) {
model.addAttribute("message", "Hello World!");
return "helloWorld";
}
}
配置springmvc-config.xml
springmvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework/schema/beans"
xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xmlns:p="http://www.springframework/schema/p"
xmlns:mvc="http://www.springframework/schema/mvc"
xmlns:context="http://www.springframework/schema/context"
xsi:schemaLocation="
http://www.springframework/schema/beans
http://www.springframework/schema/beans/spring-beans.xsd
http://www.springframework/schema/mvc
http://www.springframework/schema/mvc/spring-mvc.xsd
http://www.springframework/schema/context
http://www.springframework/schema/context/spring-context.xsd">
<!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件,
如果扫描到有Spring的相关注解的类,则把这些类注册为Spring的bean -->
<context:component-scan base-package="org.fkit.controller"/>
<!-- 默认装配方案 -->
<mvc:annotation-driven/>
<!-- 静态资源处理 -->
<mvc:default-servlet-handler/>
<!-- 视图解析器 p:prefix属性表示前缀 p:suffix 表示后缀 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/content/" p:suffix=".jsp"/>
</beans>
- 由于使用了@Controller注解,因此不需要再在配置文件中使用XML描述 Bean。
<context:component-scan base-package="org.davieyang.controller"/>
指定需要Spring扫描org.davieyang.controller包及其子包下 面的所有java文件 <mvc:annotation-driven>
是一种简写形式,可以让初学者快速应用默认配置方案,<mvc:annotation-driven>
会自动注册RequestMappingHandlerMapping
与Request MappingHandlerAdapter
两个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 type="text/javascript"src="js/jquery-1.11.0.min.js"/>
这种静态资源文件的时候,DispatcherServlet会将“/”看成请求路径,找不到它的时候会导致提示404错误。当在springmvc-config.xml中配置< mvc:default-servlet-handler/>
后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler
, 它就像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理;如果不是静态资源的请求,才由DispatcherServlet继续处理- 最后配置了视图解析器InternalResourceViewResolver来解析视 图,将View呈现给用户。视图解析器中配置的prefix属性表示视图的前缀,suffix表示视图的后缀,返回的视图字符串是“helloWorld”,经过视图解析器解析之后,视图的完整路径为:
/WEB- INF/content/helloWorld.jsp
需要注意的是,此处没有配置处理器映射器和处理器适配器,当用户没有配置这两项时,Spring会使用默认的处理 器映射器和处理器适配器处理请求
配置web.xml
web.xml
在web.xml文件中配置Spring MVC的前端控制器 DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp/xml/ns/javaee
http://xmlns.jcp/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 定义Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 让Spring MVC的前端控制器拦截所有请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Spring MVC 中用于参数绑定的注解有很多,都在
org.springframework.web.bind.annotation
包中,根据它们处理的request的不同内容部分可以分为六类。
- 处理请求参数和内容部分的注解:@RequestMapping、@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
更多推荐
微服务[v1.0.0][Spring MVC常用注解之@Controller]
发布评论