03springMVC

一、介绍篇

基本概念

1)介绍

  • SpringMVC 是一种基于MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于
    SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建
    Web 应用程序的全功能 MVC 模块。
  • 使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring 的
    Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。
  • SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越
    Struts2,成为最优秀的 MVC 框架。
  • 它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还
    支持RESTful 编程风格的请求。
  • Spring MVC 全名叫Spring Web MVC ,它是Spring家族Web模块的一个重要成员。

2)应用系统三层架构

  • 表现层:
    • 也就是我们常说的web 层
    • 它负责接收客户端请求向客户端响应结果,通常客户端使用http 协议请求web 层,web 层,需要接收 http 请求,完成 http 响应。
    • 表现层包括展示层控制层:控制层负责接收请求,展示层负责结果的展示。
    • 表现层依赖业务层,接收到客户端请求一般会调用业务层进行业务处理,并将处理结果响应给客户端
    • 表现层的设计一般都使用 MVC 模型。(MVC 是表现层的设计模型,和其他层没有关系)
  • 业务层
    • 也就是我们常说的 service 层
    • 它负责业务逻辑处理,和我们开发项目的需求息息相关。web 层依赖业务层,但是业务层不依赖 web 层。
    • 业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的, 事务应该放到业务层来控制)
  • 持久层
    • 也就是我们是常说的 dao 层
    • 负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。
    • 通俗的讲,持久层就是和数据库交互,对数据库表进行曾删改查的

3)MVC设计模式

简介:MVC 是**模型(model)-视图(view)-控制器(controller)**的缩写, 是一种用于设计编写 Web 应用程序
表现层的模式。

MVC 设计模式的三大角色:

  • Model(模型):
    模型包含业务模型和数据模型,数据模型用于封装数据,业务模型用于处理业务。
  • View(视图):
    通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。
    通常视图是依据数据模型创建的。
  • Controller(控制器):
    是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。

六大组件

1)说明

1. 在springmvc 的各个组件中,前端控制器、处理器、视图称为springmvc 的MVC组件
2. 在springmvc 的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc
的三大组件
3. 需要开发的组件有:处理器、视图 

2)六大组件

  • DispatcherServlet:前端控制器

    用户请求到达前端控制器,它就相当于mvc模式中的C,dispatcherServlet是整个流程控制的中心,
    由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
    
  • Handler:处理器

    Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下
    Handler对具体的用户请求进行处理。
    由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
    
  • View:视图

    springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、
    pdfView等。我们最常用的视图就是jsp。
    一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务
    需求开发具体的页面。
    
  • HandlerMapping:处理器映射器

    HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不
    同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
    
  • HandlAdapter:处理器适配器

    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的
    处理器进行执行。
    
  • View Resolver:视图解析器

    View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视
    图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
    

二、项目搭建篇

MVC三层架构

  • 模型(service、dao)

    * 提供要展示的数据。因此包含数据和行为、可以认为是领域模型或者JavaBean组件
    * 现在一般都分离开来:Value Object(数据Dao) 和 服务层(Service)。也就是模型提供了模型数据查询和模型数据的状态更新等,包括业务数据和义务。
    
  • 视图(JSP等)

    * 负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
    
  • 控制器(Controller)

    * 接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作
    
  • 典型的MVC

    JSP + Servlet + JavaBean
    

作用

* 将业务逻辑、数据、显示分离的方法来组织代码
* MVC主要的作用就是降低了控制器(Controller)和视图 (View) 之间的双向耦合度

执行流程

1、用户在前端浏览器上发送请求到前端控制器DispatcherServlet,如果是第一次请求的会先创建该前端控制器对象(并且只会加载一次,servlet是伪单例的(构造器没有私有化))再去执行 init()方法,从spring容器中按照类型注入的方式来对 前端控制器中的组件来完成依赖注入,组件依赖注入完毕之后再去执行 doService()方法;如果不是第一次请求的话,则**直接执行doService()**方法将用户具体请求的url资源名,传给处理器映射器(handlerMapping)

2、处理器映射器 (handlerMapping)根据用户请求的url地址去springmvc 自己的容器中去映射对应的控制器,将映射结果封装成 目标方法 返回给前端控制器(DispatcherServlet),前端控制器将目标方法 传给 处理器适配器(handlerAdapter) 再去容器中适配对应的控制器Controller(在调用对应的控制器之前会进行一次拦截)

3、控制器(controller)根据用户的具体请求,去spring的容器中获取对应的业务逻辑层对象查询数据。

4、业务层对象将查询出的模型数据返回给控制器(handlerMapping)

5、控制器再将模型数据 返回给 处理器适配器(handlerAdapter)

6、处理器适配器接收到模型数据之后,先判断响应结果是 异步请求还是同步请求,(有没有@ResponseBody注解)如果是异步请求,直接将JSON数据写回给浏览器,如果是转发的话 就将 模型数据到 模型视图对象(ModelAndView)中去,模型视图对象主要的就是封装渲染数据和展示页面的,将封装好的模型视图对象(ModelAndView)传给前端控制器(DispatcherServlet)(在传给前端控制器之前在进行一次拦截)

7、前端控制器(DispatcherServlet)再将模型视图对象**传给视图层(view)**进行解析

8、视图层解析模型视图对象,拼接字符串获取的需要渲染的视图,并将数据渲染到该视图上去、再返回给前端控制器

9、前端控制器将视图解析器返回的页面视图响应给浏览器端呈现给用户

10、在springmvc整个的执行过程中只要发生了异常,就会进入自定义的全局异常处理类(ControllerAdvice ExceptionHandler)

xml文件介绍

  • web.xml(前端控制器dispatcherServlet)

    初始化配置信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

  <display-name>Archetype Created Web Application</display-name>

  <!--welcome pages-->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!--配置springmvc DispatcherServlet-->
  <servlet>
    <servlet-name>springMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <!--配置dispatcher.xml作为mvc的配置文件-->
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <!--把applicationContext.xml加入到配置文件中-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>
  • dispatcher-servlet.xml(springMVC配置文件)

    主要配置扫描controller注解的类,视图解析器viewResolver,注解驱动,静态资源标注

    <?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:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
        <!--此文件负责整个mvc中的配置-->
    
        <!--启用spring的一些annotation -->
        <context:annotation-config/>
    
        <!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
        <mvc:annotation-driven/>
    
        <!--静态资源映射-->
        <!--本项目把静态资源放在了webapp的statics目录下,资源映射如下-->
        <mvc:resources mapping="/css/**" location="/WEB-INF/statics/css/"/>
        <mvc:resources mapping="/js/**" location="/WEB-INF/statics/js/"/>
        <mvc:resources mapping="/image/**" location="/WEB-INF/statics/image/"/>
    
        <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀(如果最后一个还是表示文件夹,则最后的斜杠不要漏了) 使用JSP-->
        <!-- 默认的视图解析器 在上边的解析错误时使用 (默认使用html)- -->
        <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
            <property name="prefix" value="/WEB-INF/view/"/><!--设置JSP文件的目录位置-->
            <property name="suffix" value=".jsp"/>
            <property name="exposeContextBeansAsAttributes" value="true"/>
        </bean>
    
        <!-- 自动扫描装配 -->
        <context:component-scan base-package="monkey.mvc01"/>
    </beans>
    
    
  • applicationContext.xml(spring配置文件)

    包含了springmybatis的配置

      1. spring的配置有:**包扫描,事务**(事务管理,事务通知,事务通知切入)
    
      2. mybatis的配置有:**数据源,Sqlsessionfactory,DAO接口扫描**
    
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
      <!--包扫描除了controller-->
    <context:component-scan base-package="monkey">
      <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!--sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--接口扫描-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="cn.itcast.dao"/>
    </bean>
    <!--数据源-->
    <context:property-placeholder location="classpath:jdbcConfig.properties"/>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <property name="driverClass" value="${jdbc.classDriver}"/>
      <property name="jdbcUrl" value="${jdbc.url}"/>
      <property name="user" value="${jdbc.username}"/>
      <property name="password" value="${jdbc.password}"/>
    </bean>
    <!--事务管理-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="*" />
      </tx:attributes>
    </tx:advice>
    <!--事务通知切入-->
    <aop:config>
      <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.service.impl.*.*(..))"/>
    </aop:config>
</beans>

三、应用掌握篇

四、应用了解篇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值