首页 > 代码库 > Spring@MVC 深入学习之——初探spring mvc
Spring@MVC 深入学习之——初探spring mvc
一、简介
Spring MVC是Spring框架的最重要的模块之一,它构建于Spring IoC容器之上,大量使用容器的特性简化其配置。MVC模式消除了业务逻辑与UI的耦合。模式负责封装视图展示的应用数据;视图只显示数据,不包含任何业务逻辑;控制器负责接收用户请求并调用后端服务进行业务处理,处理之后,后端服务可能返回某些数据供视图显示。其核心思想是分离业务逻辑与UI,使系统能够独立修改,互不影响。
Spring MVC应用,模式通常由服务层处理和持续层存储的领域对象组成。视图通常是用Java标准标记库(JSTL)编写的JSP模版,视图也可能定义为PDF文件、Excel文件、REST风格的Web服务以及Flex接口。
二、框架原理
Spring MVC 核心组件是一个控制器,通常称为调度Servlet(Dispatcher Servelet),配置在Java Web部署描述符(Web.xml文件)中。实现了JavaEE设计模式之一 (前端控制器Front controller),作为Spring MVC框架的前端控制器,每个Web请求通过它来管理整个请求处理过程。
MVC处理流程:web请求-->控制器类(对应的处理程序方法)-->后台服务处理请求-->返回视图
1>控制器类必须以@Controller注解标记,加上注解的控制器不需要实现框架专用的接口或者扩展框架专用的基类。
2>控制器类的处理方法,必须用@RequestMapping注解修饰。
3>处理程序方法结束请求处理之后,将控制委派给一个视图,其表现为处理程序方法的返回值。考虑程序的灵活性,处理程序方法返回值不代表视图的具体实现,而是一个逻辑视图,没有文件扩展名。处理程序方法的返回值可以是一个String类型值(代表逻辑视图名称 )或者Void,这种情况下,根据处理程序方法或者控制器名称确定默认逻辑视图名称。当控制器类接收一个视图时,它依靠一个视图解析器将逻辑视图名称解析为具体的视图实现。视图解析器是Web应用上下文中配置的一个实现ViewResolver接口的Bean,它的任务是返回逻辑视图名称的具体视图实现(HTML、JSP、PDF或其他实现).
三、配置使用Spring @MVC
1>在web.xml文件中定义DispatcherServlet实例;
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
类型为DispatcherServlet的servlet接收web请求并为它们分配相关处理程序的核心servlet类,URL模式可以设置为更细粒度的模式,在较大应用中,为各种servlet分配不同的模式更有意义。另一方面,DispatcherServlet决定加载哪个Spring MVC配置文件,默认查找文件名为servlet名称加上-servlet.xml的文件,即demo-servlet.xml,可通过Servlet参数contextConfigLocation明确加载的配置文件。建议为每一层组件声明一个bean配置文件。
2>加载其他配置文件
在web.xml中定义servlet监听器ContextLoaderListener,默认加载配置文件/WEB-INF/applicationContext.xml,通过设置参数contextConfigLocation,指定要加载的其他配置文件。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/*-service.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
ContextLoaderListener加载指定的bean配置文件到根应用上下文中,而每个DispachterServlet将其配置文件加载到自己的应用上下文,并且引用根应用上下文为其上级。因此,DispatcherServlet实例加载的上下文可以访问甚至覆盖根应用上下文中声明的bean,但DispatcherServlet实例加载的上下文无法互相访问。
3>激活Spring MVC注解扫描
在web.xml中添加<context:component-scan>元素启用Spring的组件扫描功能。因为@RequestMapping注解将URL请求映射到控制器类及其对应的处理程序方法,因此需再应用上下文中注册一个DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例,这些实例分别在类级别和方法级别处理@RequestMapping注解。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:conponant-scan base-package="组件所在的子包"/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
</beans>
4>创建Spring MVC控制器
创建控制器:在定义的任意类前添加@Control注解这个类;
映射处理方法:类级别或者方法级别
第一种映射策略是将一个特殊的URL模式映射到一个控制器类:在控制器类前添加@RequestMapping("/URL")
然后映射特定的HTTP方法到每个处理程序方法:在方法名称前添加@RequestMapping(method=RequestMethod.GET)/(method=RequestMethod.POST)
第二种映射策略是在方法级别使用@RequestMapping注解,同时声明两个值——URL路由和默认HTTP GET处理程序方法:在方法名称前添加@RequestMapping(vlaue="/URL",method=RequestMethod.GET)。
5>创建JSP视图
在Spring MVC应用中,视图常常是JSTL编写的JSP模版。当DispatcherServlet接受到处理程序返回的视图名称,它将逻辑视图名称解析为视图实现以供显示。例如,在demo-servlet.xml中配置InternalResourceViewResolver,将视图名称解析为/WEB-INF/jsp/目录中的JSP文件
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" vlaue="/WEB-INF/jsp/" />
<property name="suffix" value="http://www.mamicode.com/.jsp" />
</bean>
至此,Spring MVC基本的一个流程和配置讲解完毕,欢迎大家评论交流!