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>会自动注册 RequestMappingHandlerMappingRequest 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]