文档章节

SpringMvc 框架

柠檬的橘子
 柠檬的橘子
发布于 2016/11/18 09:50
字数 997
阅读 3
收藏 0
点赞 0
评论 0

简介

springmvc 是spring框架的一个模块,springmvc和spring 无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。

MVC模式最早由Trygve Reenskaug在1978年提出[1],是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长分组:

  • 控制器(Controller)- 负责转发请求,对请求进行处理。
  • 视图(View) - 界面设计人员进行图形界面设计。
  • 模型(Model) - 程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

 

MVC 在B/S 系统下的应用

MVC 是一个设计模式

webmvc的设计模式

 

SpringMVC框架

官方文档

Spring Web MVC 是基于 Servlet API 和 Servlet 容器设计的

 

DispatcherServlet (前端控制器)

理解 DispatcherServlet,首先要理解 dispatcherServlet 与 servletContext 的关系。一个 SerlvetContext 包含多个 DispatcherServlet每个 DispatcherServlet 都包含着一个 ServletContext 的引用。

与大多数流行的 后端 web 框架类似。每个 servlet/dispatcherServlet 包含 ServletContext 上下文。除此之外,每个 dispatcherServlet 毋庸置疑拥有单独的 request。ServletContext 在 request 与 session 之上被整个 WebApplication 共享。

结合 web.xml 去理解:

<web-app>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>app1</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/app1-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app1</servlet-name>
        <url-pattern>/app1/*</url-pattern>
    </servlet-mapping>

</web-app>

再结合具体代码去理解:

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletCxt) {

        // Load Spring web application configuration
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
        ac.register(AppConfig.class);
        ac.refresh();

        // Create and register the DispatcherServlet
        DispatcherServlet servlet = new DispatcherServlet(ac);
        ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/app/*");
    }
}

 

ServletContext

作为 WebApplication 中的一个重要组件!每个 DispatcherServlet 都拥有一个 ServletContext 副本(引用)。而 DispatcherServlet 中除了逻辑代码就是 ServletContext,那么 ServletContext 作为多个 DispatcherServlet 共享的存在,到底包含哪些内容?

① ServletContext 包含着对 根上下文的引用。它与 root上下文的关系是单向的,父子容器关系,子访问父,父不能访问子。(Spring 容器 IoC实现)

② 每个 Web应用 有一个 ServletContext,而一个 Web应用是一系列 Servlets 的集合。 因此可以把 公有的信息共享到整个全局上下文中(调用使用 setAttribute 方法)。但是,对于 distributed 分布式系统,由于 ServletContext 是每个 webApplication 的每个 虚拟机都有一个,不要使用它去共享信息(不是真正的全局)。 除了公共信息,还有一些公共组件: 路由,视图解析器,控制器。(Java EE 实现)

③ ServletContext 包含了与 Servlet 容器 交互的方法,包括配置容器的端口,容器的根 url地址等,servlet3.0 可以在应用程序中而不是非要在容器中配置这些参数。(Java EE 实现)

基本处理流程

前端控制器设计模式

用户发出请求 -> 上下文响应 -> 经过 locale resolver,theme resolver,multipart file resolver ,解析 -> 搜索合适的 servlet 处理,执行链 preprocessors, postprocessors, and controllers,直接返回或填充 model -> 回收 model,渲染视图。

 

实际应用

servlet 除了自带的 Interception 拦截器,还支持 Filter(如 cors filter),这类 Filter 不包括在 servlet 中。注解 请看,RestTemplate 请看

 

参考资料

https://zh.wikipedia.org/wiki/MVC

https://spring.io/docs/reference

http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html

© 著作权归作者所有

柠檬的橘子
粉丝 6
博文 177
码字总数 86091
作品 0
芜湖
后端工程师
spring boot框架学习6-spring boot的web开发(2)

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定...

凯哥java
2017/11/06
0
0
spring boot框架学习4-spring boot核心(3)

本节主要: 1:spring boot 为我们提供的 starter pom 都有哪些 2:怎么添加xml配置文件 3:日志相关 本文是《凯哥陪你学系列-框架学习之spring boot框架学习》中第四篇 spring boot框架学习...

凯哥java
2017/10/31
0
0
2014-03-09 Spring的学习(0)-----Spring目录文件组织

Spring压缩包目录说明 目录名 相关介绍 aspectj 在Spring框架下使用aspectj的源代码和测试程序文, 是java最早的提供AOP的应用框架 dist Spring 的发布包,关于发布包下面会详细进行说明。 do...

查封炉台
2014/03/09
0
0
spring boot框架学习5-spring boot的web开发(1)

本章节主要内容: 通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定...

凯哥java
2017/11/01
0
0
【第1章 Spring概述与结构】1.2 Spring模块与结构

上一节:【第1章 Spring概述与结构】1.1 Spring起源与概述 基于Java Beans的配置管理,采用IOC的原理,特别是对依赖注入技术的使用。这些都用来减少各组件间对实施细则的相互依赖性。 一个核...

陶邦仁
2015/05/21
0
0
【spring系列】spring框架结构

Spring 框架的 7 个模块 Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图所示。 图 1. Spring ...

磊神Ray
2011/10/11
0
0
Spring MVC 到 Spring BOOT的简化之路

背景 从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信有过Spring MVC开发经验的朋友能深刻体会到这一痛苦。因为...

临江仙卜算子
05/09
0
0
项目中SpringMVC、Spring和Struts的区别讲解

导读:近期做到的项目中,用到的框架师SSM(SpringMVC+Spring+Mybatis),那么在这之前用过SSH,这里主要是区分一下SpringMVC和Struts,但是由于SpringMVC和Spring真的也挺容易迷糊的,所以,...

yiguang_820的博客
2017/12/11
0
0
Spring实战读书笔记(1)

Spring的根本使命是? 简化Java开发 为了降低Java开发的复杂性,Spring采取了哪4种关键策略? 1、基于POJO的轻量级和最小侵入性编程 2、通过依赖注入和面向接口实现松耦合 3、基于切面和惯例...

祥林会跟你远走高飞
2014/12/30
0
0
详解spring 每个jar的作用

spring.jar 是包含有完整发布模块的单个jar 包。但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2.jar。 spring-src.zip就是所有的源代码压缩包。 除了spring....

mosaic101
2015/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

线程安全,底层实现原理和JMM

让多线程下的类安全起来:无状态、加锁、让类不可变、栈封闭(方法封装) 、安全的发布对象(不暴露成员) 死锁 一定发生在多个线程争夺多个资源里的情况下,发生的原因是每个线程拿到了某个(某...

这很耳东先生
6分钟前
0
0
MyBatis源码解读之延迟加载

1. 目的 本文主要解读MyBatis 延迟加载实现原理 2. 延迟加载如何使用 Setting 参数配置 设置参数 描述 有效值 默认值 lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延...

无忌
12分钟前
0
0
javascript 类变量的实现

代码如下: function echo(){ for(let i=0;i<arguments.length;i++) console.log(arguments[i]);}function extend(o, p){for (prop in p) {o[prop] = p[prop]}retur......

backbye
16分钟前
0
2
编程语言对比分析:Python与Java和JavaScript(图)

编程语言对比分析:Python与Java和JavaScript(图): 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?[图] 编程语言生而为何? 我们人类从原始社会就是用语言表达自己,互相沟通...

原创小博客
24分钟前
0
0
Akka构建Reactive应用《one》

看到这Akka的官网,描述使用java或者scala构建响应式,并发和分布式应用更加简单,听着很高级的样子,下面的小字写着消息驱动,但是在quickstart里面又写容错事件驱动,就是这么钻牛角尖。 ...

woshixin
36分钟前
0
0
ffmpeg源码分析 (四)

io_open 承接上一篇,对于avformat_open_input的分析还差其中非常重要的一步,就是io_open,该函数用于打开FFmpeg的输入输出文件。 在init_input中有这么一句 if ((ret = s->io_open(s, &s-...

街角的小丑
38分钟前
0
0
String,StringBuffer ,StringBuilder的区别

不同点 一、基类不同 StringBuffer、StringBuilder 都继承自AbStractStringBuilder,String 直接继承自 Object 2、底层容器“不同” 虽然底层都是字符数组,但是String的是final修饰的不可变...

不开心的时候不要学习
53分钟前
0
0
nodejs 文件操作

写文件code // 加载文件模块var fs = require("fs");var content = 'Hello World, 你好世界!';//params 文件名,内容,编码,回调fs.writeFile('./hello.txt',content,'utf8',function (er......

yanhl
55分钟前
0
0
SpringBoot mybits 查询为0条数据 但是在Navicat 中可以查询到数据

1.页面请求: 数据库查询: 2018-07-16 17:56:25.054 DEBUG 17312 --- [nio-9010-exec-3] c.s.h.m.C.selectSelective : ==> Preparing: select id, card_number, customer_id, customer_nam......

kuchawyz
今天
0
0
译:Self-Modifying cod 和cacheflush

date: 2014-11-26 09:53 翻译自: http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code Cache处在CPU核心与内存存储器之间,它给我们的感觉是,它具......

我叫半桶水
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部