SpringMVC详解 (一)概述及原理

1.MVC设计模式

  • Model1时代:很多学Java后端比较晚的朋友可能并没有接触过Model1模式下的JavaWeb应用开发。在Model1模式下,整个Web应用几乎全部用JSP页面组成,只用少量的JavaBean来处理数据库连接、访问等操作。这个模式下JSP即是控制层又是表现层。显而易见,这种模式存在很多问题。比如①将控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;②前端和后端相互依赖,难以进回测试并且开发效率极低;
  • Model2时代: JavaBean(Model)+JSP(View)+Servlet(Controller)这种开发模式是早期的JavaWeb MVC 开发模式。

Model:系统涉及的数据,也就是dao和beano
View:展示模型中的数据,只是用来展示。
Controller:处理用户请求都发送给,返回数据给JSP并展示给用户。

Model2模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是很多Javaweb开发相关的MVC框架应运而生比如Struts2,但Struts2比较笨重。随着Spring轻量级开发框架的流行Spring生态圈出现了SpringMVC框架,SpringMVC是当前最优秀的MVC框架。相比Struts2,SpringMVC使用更加简单和方便,开发效率更高,并且springMVC运行速度更快。

  • MVC是一种设计模式,SpringMVC是一款很优秀的MVC框架。它可以帮助我们进行更简洁的Web层的开发,并且它天生与Spring框架集成。SpringMVC下一般把后端项目分为Service层(处理业务)、Dao层(数据库操作)、Entity(实体类)、Controller(控制层,返回数据给前台页面)。
    在这里插入图片描述

SpringMVC的简单流程

在这里插入图片描述

SpringMVC的工作原理

在这里插入图片描述
流程说明:
1.客户端发送请求,直接请求DispatcherServlet
2.DispatcherServlet ——> HandlerMapping,处理器映射器会将请求映射为HandlerExecutionChain对象返回给DispatcherServlet,该对象里面包含了一个Handler处理器对象和多个HandlerInterceptor拦截器对象(如果设置了拦截器则生成拦截器对象,没有则不生成)
3.解析到对应的Handle(也就是平时我们所说的Controller控制器)后,开始由HandleAdapter适配器
处理。
4.HandlerAdapter会根据Handle来调用真正的处理器来处理请求,并处理相应的业务逻辑。
5.处理器处理完业务后,会返回ModelAndView对象。Model是返回的数据对象,View是个逻辑上的VIew。
6.DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
7.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
8.把View返回给请求者。

SpringMVC的配置文件

1.配置DispatcherServlet

DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。

 <!--   配置springmvc核心servlet-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

2.DispatcherServlet的配置文件

但是,我们在搭建SpringMVC框架时,往往总是把DispatcherServlet的配置文件放错位置。网上有的说:springDispatcherServletMVC-servlet.xml(暂且命名这么一个springDispatcherServletMVC的dispatchservlet配置文件)应该放在WEB-INF下面(与web.xml放一起);有的说:应该直接把springDispatcherServletMVC-servlet.xml放在src文件夹下面;有的说:在java resources下面新建一个config的resource folder,把配置文件都放在这个资源文件夹下面。那么到底哪种是正确的呢?
答案是:这个要根据web.xml中DispatcherServlet的配置声明有关系。

3.url-pattern的配置

url-pattern配置有三种:

  • *.do 访问以.do结尾的由DispatcherServlet进行解析.
  • /(斜杠) 所有访问的地址都由DispatcherServlet进行解析,对于静态的文件解析需要配置,不让DispatcherServlet进行解析.
    注意:使用此种方式可以实现 RESTful风格的url.
  • /* 配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet进行解析,但是不能根据这个jsp页面找到handler所以会报错.

2.SpringMVC配置文件

springmvc的配置文件一般都是在web.xml里面指定位置的。其实,springmvc的配置文件有默认位置。因此,存在两种配置方式。

2.1 用指定位置配置方式,即在web.xml配置文件中指定springmvc配置文件的位置。

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

上面代码中,明确了contextConfigLocation的地址为:classpath:(即在classess文件夹下面),而且命名为springmvc.xml(或者其他名称都可以),指定配置文件位置时,这个配置文件的名字可以随便取。 
在这里插入图片描述

2.2采用默认位置配置方式

当web.xml中DispatcherServlet配置声明中,没有明确DispatcherServlet前端控制器配置文件的位置时,则系统默认DispatcherServlet前端控制器配置文件放在WEB-INF文件夹下。

<!--  Spring MVC 的Servlet,它将加载WEB-INF/springDispatcherServlet-servlet.xml 的配置文件,以启动Spring MVC模块-->   
    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

2.3springmvc配置文件的内容

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       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/aop
			    http://www.springframework.org/schema/aop/spring-aop.xsd
			    http://www.springframework.org/schema/tx
			    http://www.springframework.org/schema/tx/spring-tx.xsd
			    http://www.springframework.org/schema/mvc
			    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--注解扫描-->
    <!-- 设置自动注入bean的扫描范围,use-default-filters默认为true,
    会扫描所有的java类进行注入  Use-dafault-filters=false”的情况下:
    <context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描
    springmvc和application文件都需要配置,但mvc文件只扫描controller类,
    application扫描不是controller类 -->
    
    <context:component-scan base-package="com.zua" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <!--
    会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,
    是spring MVC为@Controllers分发请求所必须的。它提供了数据绑定支持,读取json的支持
    -->
    <mvc:annotation-driven/>

    <!--视图解析器,对应pages文件夹下以.jsp为后缀的视图-->
    <bean id="view" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
	<!--解除静态资源拦截-->
    <mvc:default-servlet-handler/>

</beans>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值