springMVC是spring框架的一个模块, springMVC和springMVC无需通过中间整合层进行整合,基于MVC的web框架(mvc是一个设计模式, springMVC是其在B/S系统下的应用)
表示层
业务逻辑层:BLL
数据层:DAO
spring跨越三层
前端控制器[DispatcherServlet] (一般无需开发)
接收客户的request,返回响应request,相当于转发器,中央处理器
能减少和其他组件的耦合性
处理器映射器[HandlerMapping] (无需开发)
根据请求的url查找Handler
处理器适配器[HandlerAdapter]
按照特定的规则(HandlerAdapter要求的规则)去执行Handler
注意:编写Handler时按照HandlerAdapter要求去做,这样适配器才能执行Handler
处理器[Handler](需要开发)
编写Handler时按照HandlerAdapter要求去做,这样适配器才能执行Handler
视图解析器[View Resolver](无需开发)
根据逻辑视图名进行解析,将视图解析为真正的视图(View对象)
视图[View](要写jsp)
接口,实现类就是支持不同的View类型(jsp/excel/pdf/freemaker等)
需求
商品订单管理案例,以案例为驱动
功能:商品的订单查询
环境搭建
数据库搭建/依赖的jar包等
想要将eclipse程序可以导到MYEclipse中,需要将build\classes改为
WebRoot\WEB-INF\classes
配置前端控制器
web.xml中配置servlet,配置springMVC框架的前端控制器servlet,即:
org.springframework.web.servlet.DispatcherServlet
对所有的url进行访问控制,需要指定HandlerMapping,用于在查找Handler时返回Handler
前端控制器的配置参数:
配置处理器映射器
classpath下的springmvc.xml,实际上就是配置一个spring的applicationContext.xml,创建springmvc所需的对象,这些对象不同于spring和mybatis整合所需创建的对象applicationContext.xml,springmvc-config.xml仅仅用于用于前端控制器实现查找Handler时返回执行链所需的对象的创建
创建Handler,并在前端控制器中配置Handler的bean对象
创建Handler
需要实现controller接口,才能由HanderAdapter即处理器适配器
org.springframework.web.portlet.mvc.SimpleControllerHandlerAdapter执行
需要创建的对象为ModelAndView的对象
使用
ModelAndView的对象的addObject()
此方法类似request的setAttribute方法进行数据传递
ModelAndView的对象的setViewName()
此方法设置数据传递的jsp页面,在创建Handler的时候就会将jsp页面的访问路径设为Handler的name属性
前端控制器中配置Handler的bean对象
处理器适配器
所有的处理器适配器,都实现HandlerAdapter
视图解析器
其他的非注解的处理器映射器和处理器适配器
映射器
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems1.action">controllers的bean的idprop>
<prop key="/queryItems2.action">controllers的bean的idprop>
props>
property>
bean>
适配器
<bean
class="org.springframework.web.portlet.mvc.SimpleControllerHandlerAdapter">
bean>
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter">
bean>
DispatcherServlet.properties
不配置处理器映射器处理器适配器等,也可以使用Handler,这是因为
/org/springframework/web/servlet/DispatcherServlet.properties中配置了默认的处理器映射器处理器适配器等必须配置
注解开发的版本问题
注解映射器
spring3.1之前使用注解映射器为
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
spring3.1之后使用注解映射器为
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
注解适配器
spring3.1之前使用注解适配器为
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
spring3.1之后使用注解适配器为
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
注意:在使用注解开发的时候,需要使用注解开发的相对应的适配器和映射器,不能一个用新的,一个用旧的
springMVC注解开发
配置注解映射器和适配器
学习使用的:
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">bean>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">bean>
工作开发使用的:
<mvc:annotation-driven>mvc:annotation-driven>
开发注解的Handler
使用注解的映射器和注解的适配器(注解映射器适配器必须配对使用)
注解:
@Controller 标识此类为控制器
@RequestMapping("/url") 将方法和url进行映射,标注在方法上的时候,就是直接将方法对应的ModelAndView对应相对应的url,配置在类上,就会对整个类的所有的方法都指定同一个url,即访问此url,所有的方法对应的ModelAndView都会访问
@RequestMapping其他的属性
属性名 数据类型 描述
name String
value String[]
method RequestMethod[]
params String[]
headers String[]
consumes String[]
produces String[]
组合注解
原本的注解的方式为GET,需要配置为
@ResultMapping(value=””,metthod=RequestMethod.GET)
可以简化为@GetMapping(value=”/url”)
原本的注解的方式为POST,需要配置为
@ResultMapping(value=”/url”,metthod=RequestMethod.POST)
可以简化为@PostMapping(value=”/url”)
在spring容器中加载配置的Handler
通过源码分析,查看springmvc的执行过程
前端控制器org.springframework.web.servlet.DispatcherServlet的入口为
xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
bean>
<mvc:annotation-driven>mvc:annotation-driven>
<context:component-scan base-package="springMVC02.controller">context:component-scan>
beans>
原始的web开发和springMVC比较
原始的servlet:
通过servlet的配置进行url路径的映射,每一个servlet对应一个url路径,servlet通过不同的域对象,,将数据发送给相对应的jsp,再将jsp进行数据转发,发送个客户端
springMVC:
通过DispatcherServlet这个前端控制器,对所有的访问路径进行拦截,在前端控制器这个servlet的配置中,配置了初始化参数springmvc-Config.xml,指定了前端控制器对应的Handler的处理方法,即只配置一个servlet,通过这个servlet配置所有的jsp对应的url进行拦截,通过以访问的url对应的资源路径,找到对应的Handler,通过Handler找到对应的jsp页面,jsp页面的数据通过ModelAndView将数据传递给对应的jsp