SpringMVC源码(九)SpringMVC注解开发

一 . 在SpringMVC2.5之前,自定义的控制器类的方式并不友好,存在了以下问题:

1) 类必须要继承controller接口,不友好.

2) 每个类只有一个默认处理方法,只能处理一个用户请求

3) 每一个类都需要在xml中进行配置,很麻烦


在Spring2.5之后,便引入了注解方式的控制器定义模式,并且在SpringMVC3.0之后引进了更加强大的注解帮助我们进行参数注入:

a) @Controller注解:用来表示处理器类

b) @RequestMapping注解:处理器类的请求规则

c) @RequestParam注解:请求参数到功能处理器方法的方法参数绑定

d) @ ModelAttribute注解:请求参数到命令对象的绑定

e) @SessionAttributes注解:用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中


Spring3.0引入RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),且又引入了更多的注解支持:

@CookieValue:cookie数据到处理器功能处理方法的方法参数上的绑定;

@RequestHeader:请求头(header)数据到处理器功能处理方法的方法参数上的绑定;

@RequestBody:请求的body体的绑定(通过HttpMessageConverter进行类型转换);

@ResponseBody:处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);

@ResponseStatus:定义处理器功能处理方法/异常处理器返回的状态码和原因;

@ExceptionHandler:注解式声明异常处理器;

@PathVariable:请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,

从而支持RESTful架构风格的URI;


在SpringMVC2.5注解@Controller和RequestMapping需要通过DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter来进行支持,SpringMVC3.0之后这两个类便由RequestMappingHandlerMapping和RequestMappingHandlerAdapter进行了替代.


二 . 先创建一个SpringMVC的配置文件

SpringMVC也有自己的配置文件,类似于Spring的applicationContext.xml,用来装载SpringMVC所需要的Bean.如HandlerMapping和HandlerAdapter等.

SpringMVC-Servlet.xml配置需要的注解HandlerMapping和HandlerAdapter

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
但是在3.0之后SpringMVC便将这两个类进行了替换,便使用RequetMappingHandlerMapping和RequestMappingHandlerAdapter:


创建注解控制器Handler:

具体的处理器控制器Controller.类可以通过实现Controller接口或者注解@Controller,便称为控制器.

//通过Controller注解表明当前这类是个控制器类
@Controller
public class Test{

	//通过RequertMapping定义当前方法的映射路径,在浏览器中通过这个路径访问这个方法
	@RequestMapping("/show1")
	public ModelAndView show1(){
		ModelAndView mv = new ModelAndView("hello");
		mv.addObject("msg","SpringMVC注解程序");
		return mv ;
	}
}
xml配置,会自动扫面这个包下的所有Controller:

	<!-- 不再配置Controller的Bean了,直接配置包扫描 -->
	<context:component-scan base-package="cn.controller" />
配置试图解析器:

<!-- 配置视图解析器 
	-->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<!-- 	前缀 -->
		<property name="prefix" value="/WEB-INF/views/"></property>
	<!-- 	后缀 -->
		<property name="suffix" value=".jsp"></property>
	</bean>
在WEB-INF下面创建一个views包,创建我们的hello.jsp:
<%@pagelanguage="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<metahttp-equiv="Content-Type"content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- 可以用el表达式,直接获取模型中的数据 -->
	<fontcolor="red"size="5">${msg }</font>
</body>
</html>

当访问show1的时候,controller控制器处理完成后便跳转到hello.jsp,并获取了添加的msg对应的数据.


HandlerMapping和HandlerAdapter的具体实现:
1、HandlerMapping实现:使用DefaultAnnotationHandlerMapping(spring3.1之前)或RequestMappingHandlerMapping(spring3.1)
替换之前的BeanNameUrlHandlerMapping。注解式处理器映射会扫描spring容器中的bean,发现bean实现类上拥有@Controller或@RequestMapping注解的bean,并将它们作为处理器。 
2、HandlerAdapter实现:使用AnnotationMethodHandlerAdapter(spring3.1之前)或RequestMappingHandlerAdapter(spring3.1)替换之前的SimpleControllerHandlerAdapter。
注解式处理器适配器会通过反射调用相应的功能处理方法(方法上拥有@RequestMapping注解)。

-----------------------------------------------------------------------------------------------------------------------------------------------

关于SpringMVC的HandlerMapping和HandlerAdapter注解源码介绍:

最原始的开发,需要我们在xml中手动配置HandlerMapping和HandlerAdapter,每一个处理方法对应配置一个Contrller,再加最后的视图解析,SpringMVC程序才能正常流程进行.为了简化开发,SpringMVC默认我们不需要在配置Handler和HandlerAdapter.


为什么不需要在配置HandlerMapping和HandlerAdapter?原因在于SpringMVC的jar中有一个默认配置


它会自动加载我们需要的HandlerMapping和HandlerAdapter,但是他加载的DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter在上文已经提到已经过时换掉,那么就需要我们重新配置HandlerMapping和HandlerAdapter,很麻烦.在此基础上SpringMVC提供了一个类来解决这个问题,只需要配置一个标签即可:

	<!-- 开启注解驱动,就不要配置HandlerMapping和HandlerAdapter了 -->
	<mvc:annotation-driven/>

为什么配置了这个就不要配置注解的HandlerMapping和HandlerAdapter了呢?

这个注解驱动,对应了SpringMVC中的一个类,查看一下这个类:


详细看一下这个类,看一下它的介绍:



这个类注册下面的handler映射:

RequestMappingHandlerMapping命令(0)请求映射到带注释的控制器方法。

BeanNameUrlHandlerMapping命令2地图URL路径控制器bean的名称。

注意:额外的handler映射可能是由于使用了“视图-控制器”或“MVC命名空间元素”的结果而注册的。

这个类注册以下的handleradapter:

RequestMappingHandlerAdapter与注释的控制器方法处理请求。

HttpRequestHandlerAdapter与HttpRequestHandlers处理请求。

SimpleControllerHandlerAdapter与基于接口控制器处理请求。

因此,当我们配置了注解驱动开关,那么注解驱动的类被加载后,会自动加载这几个HandlerMapping和HandlerAdapter,所以我们不需要配置了。

注解驱动相当于是原来默认配置的升级版!


猜你喜欢

转载自blog.csdn.net/superpojo/article/details/74255225