SpringMVC系列之——初相识

前言:

当你在面试时被问到SpringMVC是什么?你心里想到的会是什么答案?其实这种问题从来就不是下定义可以解决的,是什么?是…。我们对一个事物的描述肯定是多维度的,下面我们就来看一下SpringMVC是什么。

MVC:

简介:
springMVC作为实现MVC结构的一个Web框架我们应该先了解一下MVC,什么是MVC?
本身来讲MVC是一种设计模式,它的名字是三个单词的缩写:
Model(模型) - 模型代表一个存取数据的对象。它也可以带有逻辑,在数据变化时更新控制器 。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
其实这样的设计我们见过不少,只是具体的实现不同,但是都是为了解开耦合,分解是一个非常重要的思想,我们根据理解,将一件事分为不同特性的几个模块,分开后又需要一个新的东西去管理分解带来的问题,看似复杂化,但是却增强了业务能力,以及条理性,不同的设计模式之间只是分解方式不同,管理方式不同,具体的会在后面的设计模式系列中讲到。
早期的MVC模式:
在这里插入图片描述
这样一来模型和视图就干自己的事情,两者交互由控制器来实现。而springMVC比这个结果更加复杂更加完善。但是SpringMVC的一个特征就是他是一个MVC框架。

SpringMVC-MVC=Spring

SpringMVC抛开MVC剩下的就是spring,首先它是spring的一个子框架,上个图看一哈
在这里插入图片描述

我们可以看到MVC是它的一部分,自然Spring哪些优秀的技术它也就用上了,比如依赖注入,Aop你想用照样可以办到,具体下回分说。
这样一来我们就从名字这个层面看了一下SpringMVC是什么东西,接下来我们刨开外壳看内部,大概看一下SpringMVC都有哪些组件。

SpringMVC的组件:

先上图在分析(来源网络):
在这里插入图片描述
(1)首先浏览器发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;

(2)DispatcherServlet——>HandlerMapping,处理器映射器将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象;

(3)DispatcherServlet——>HandlerAdapter,处理器适配器将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;

(4)HandlerAdapter——>调用处理器相应功能处理方法,并返回一个ModelAndView对象(包含模型数据、逻辑视图名);

(5)ModelAndView对象(Model部分是业务对象返回的模型数据,View部分为逻辑视图名)——> ViewResolver, 视图解析器将把逻辑视图名解析为具体的View;

(6)View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构;

(7)返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。

就是这样一个流程,当然每一个组件都有很多实现与原理,后面文章慢慢写。

简单一个小实例:

代码只包含SpringMVC的核心代码:
web.xml

    <!-- spring mvc 处理,前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <!--决定什么请求通过Servlet-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- /所有的请求包括(js、css、json等) -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- 查看以前登录过滤 里设置字符集,避免中文乱码 -->
    <filter>
        <filter-name>springCode</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <!-- encoding设置具体类型 -->
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
    <filter-name>springCode</filter-name>
    <!-- 所有的普通的普通请求 /* -->
    <url-pattern>/*</url-pattern>
    </filter-mapping>

这里配置了三个重要的东西:
1)前端控制器,重要参数是我们springMVC的容器配置:spring-mvc.xml
2)servlet-mapping
3)一个过滤器,来处理url防止乱码
spring-mvc.xml

<!-- 使用mvc:annotation-driven代替两个注解映射器和注解适配的配置
     mvc:annotation-driven默认加载很多的参数绑定方法,
     比如json转换解析器默认加载了,如果使用mvc:annotation-driven
     则不用配置RequestMappingHandlerMapping和RequestMappingHandlerAdapter
     实际开发时使用mvc:annotation-driven-->
<mvc:annotation-driven></mvc:annotation-driven>
    <context:component-scan base-package="com.ssm.login.controller"/>
    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--spring自带的对静态资源处理的服务-->
    <mvc:resources mapping="/static/**" location="/static/" />

这里面涉及到了四个组件:
1)处理器映射器:这里我们使用的是mvc:annotation-driven</mvc:annotation-driven>配置自带的一个映射器,也就是注解开发用的映射器。
2)处理器适配器:与上面同源同类
3)处理器:这里我们将我们编译的处理器也就是controller扫描到了容器中(处理器是单例模式,为什么是单例?有什么好处?会带来什么问题?)
4)视图解析器
处理器(controller)

@Controller
@RequestMapping("/index")
public class IndexController {
    @RequestMapping("/inIndex")
    public String getInIndex(){
        return "index";
    }

没有业务逻辑的处理器。
然后在我们项目启动后输入请求就可以看到结果页面了。

小节:

这就是SpringMVC的一个大致内容,当然文章看完只能让你大概了解一下什么是SpringMVC,随着而来的是更多的疑问,可以关注我后续的文章。

最后一句话:

看到此处便是缘,请您再听我一言;
新生博主甚是难,还请原谅把你烦;
博文写了没人看,博主这活没法干;
看了不评就走人,他人怎知行不行;
看了评论又推荐,博主心里笑开颜。
ps:就想皮一下,但还是希望你能指出错误,如果觉得可以夸奖一下就更好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值