从零学习Spring MVC框架「环境搭建和MVC架构」

Web项目聚集地

环境搭建

这是Spring MVC框架教程的第一篇,首先为大家讲解MVC架构思想,MVC模式并不是Javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型「Model」、视图「View」和控制器「Controller」,即为MVC。

图源见文末

我们直接拿例子来解释,最典型的MVC就是Jsp+servlet+Javabean模式。比如登陆的案例,在视图层即Jsp中有一个表单,用户填写用户名和密码,点击提交。这时候会跳转到控制层,控制层Servlet会接受到表单提交的用户名和密码。

图源:www.processon.com

注意:我们并不会在Servlet里面进行业务逻辑和数据库SQL编写,这样会显得杂乱不堪。MVC架构的思想是,控制层接到用户名和密码送给Service层,在Service层中进行业务逻辑的编写,比如判断当前有没有此用户、密码是否正确。

判断密码的正确性需要和数据库进行交互,此时就需要另一个Dao层,Dao是专门和数据库打交道,在Dao层中可以利用JDBCUtil进行SQL的编写,并把查询的结果返回给Service层。Service层有了Dao层的返回结果便可以进一步判断密码是否正确、用户名存不存在,从而给控制层一个答复。

控制层接到Service层的答复后进行跳转,比如:密码错误时,返回Json值到视图层,视图层进行渲染展示给用户,密码正确就可以直接跳转到主页面。这样分工明确才有利于项目的扩展和维护,我们学习的SSM框架便是很好的实践:

图源:www.processon.com

对于我们学习的SSM框架中,Spring MVC便是充当控制层的角色,即可以近似理解为提到了上面登陆例子中的Servlet,Mybatis作为数据访问层的解决方案,近似理解为登陆例子中JDBC,而Spring是横跨三层的一种容器框架。

1简介

Spring的模型-视图-控制器(MVC)框架是围绕一个 DispatcherServlet 来设计的,这个Servlet非常重要,此Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区 与主题渲染等,甚至还能支持文件上传。这个Servlet是框架的核心,暂时不理解没关系。

处理器是你的应用中注解 了 @Controller 和 @RequestMapping 的类和方法,Spring为处理器方法提供了极其多样灵活的 配置。Spring 3.0以后提供了 @Controller 注解机制、 @PathVariable 注解以及一些其他的特 性,也就是说你可以使用RESTful 风格的接口。

上方的简介涉及的名称和注解不理解没关系,只需要有个大体的印象即可,我们会慢慢的为大家解释清楚。

2. 起步

学习Spring MVC框架,首先我们搭建一个环境出来,在搭建环境的过程中就会对此框架有个大体的了解,开始我们的环境搭建。

去官网下载相应的Jar包,解压后这样的:

Jar包就在libs此文件夹里,docs是相关文档,schema是xml上方的约束。

libs下有我们需要的Jar包,它是class文件,docs是文档,source是源码java文件,准备好了Jar包我们就开始环境搭建。

3. 案例截图

4. 导入Jar包

5. web.xml


SpringMVC01

mvc

org.springframework.web.servlet.DispatcherServlet

1

mvc

/

index.html

在上方web.xml中,配置了一个用于调度控制的Servlet,在我们框架的学习过程中,DispatcherServlet是特别重要的,也是框架的核心。所有的请求驱动都围绕这个控制器开分派请求,分别Servlet的配置进行解释:

全限定类名

org.springframework.web.servlet.DispatcherServlet此全限定类名可以在导入的Jar文件spring-webmvc-4.2.1.RELEASE.jar的第一个包org.springframework.web.servlet中找到。

在中添加的作用是在web服务器(tomcat)启动时会不会创建这个Servlet实例,即是否在Web服务器启动时调用该Servlet的 init()方法,而不是真正访问时才创建实例。

值大于等于0时,Web容器启动时就加载并初始化此Servlet,数字越小,被创建的越早。

当值小于0或不指定时,Servlet在真正被使用时才被创建。

值相同时,容器自己选择次序。

不要写/*,否则所有的Jsp页面会报404错误,我们使用的是 /:表示包括静态文件,css、js等一并拦截,这就需要对静态文件进行处理,否则出现就会没有样式的情况,具体处理在后面文章给出。同样还可以使用/*.do来拦截以.do结尾的请求,这也是开发中常用的。

mvc

在DispatcherServlet加载的时候需要一个Spring MVC 的配置文件,默认情况下,应用会去WEB-INF文件夹下查找对应的[name]-servlet.xml文件。对应我们的的xml配置就是是mvc-servlet.xml,也就是说mvc中参数名一定和Spring mvc的配置文件相同,如图:

点击放大图片

并非一定要把Spring MVC的配置文件放在WEB-INF下面,你可以在Servlet的配置文件添加配置来指定配置文件路径。

6. HelloWorldController.java

@Controller

publicclassHelloWorldController{

@RequestMapping("/test01")

publicModelAndViewtest01(){

System.out.println("Hello World!");

returnnull;

}

@RequestMapping("/webjujidi")

publicModelAndViewupload(){

System.out.println("web项目聚集地");

returnnull;

}

}

我们创建一个类HelloWorldController,在类的上方添加@Controller注解,表明此类的实例是一个控制器,我们请求会在Controller中匹配方法进行处理,@RequestMapping注解类型用来映射一个请求和请求的方法,@RequestMapping("/test01")此注解表明凡是请求/test01路径都会被test01方法处理,即打印出Hello World。

在Spring MVC中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。

在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 注解标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。

7. mvc-servlet.xml


xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd

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-4.3.xsd"

>



上面的xml就是Spring MVC的配置文件,这个文件用来编辑Spring MVC相关的配置,对配置的两行进行讲解:

这是一种简写形式,完全可以手动配置替代这种简写形式,此配置会自动注册为RequestMappingHandlerMapping和RequestMappingHandlerAdapter两个Bean,这是Spring MVC为@Controller分发请求所必须的。

在Controller中我们使用了@Controller和@RequestMapping注解,但是使用它们需要在Spring MVC的配置文件中添加配置用来启动Spring MVC的注解。

在xml配置了这个标签后,Spring可以自动去扫描base-pack下面或者子包下面的java文件,如果可以扫描到含有@Component @Controller@Service等这些注解的类,则把这些类注册为bean。

这里是自动扫描带@Controller注解的类注册为bean,没有学习Spring可能对这个地方不理解,不过没关系,我们会马上推出Spring的教程,你先暂时理解为:配置了它后,就可以找到带@Controller注解的类,我们就可以使用它了即可。

8. 运行截图

注意观察,箭头的指向,我们在浏览器中请求 test01路径,此时test01的请求会被Servlet拦截,然后去匹配Controller中哪个方法上方@RequestMapping注解的值和test01相同,便会执行相应的方法。

注意观察,箭头的指向,我们在浏览器中请求/web路径,此时/web的请求会被Servlet拦截,然后去匹配Controller中哪个方法上方@RequestMapping注解的值和/web相同,便会执行相应的方法。

9. 工作原理

如果看到这里你能明白个大概就说明你已经入门了,接下来我会详细的和你解释一些刚刚的案例是怎么样的流程,以及Spring MVC的工作原理。

对于我们刚刚搭建的案例工作流程是这样的:用户发送请求至前端控制器DispatcherServlet。DispatcherServlet收到请求调用HandlerMapping处理器映射器。处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成,我们没有使用)返回DispatcherServlet。

DispatcherServlet调用HandlerAdapter处理器适配器。HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。Controller执行方法在控制台打印"Hello World"等。

我们案例的视图层可以简单的理解为是控制台,但实际开发中并非这样,我只是为了降低难度,不想第一篇文章涉及太多概念,让读者失去学习的兴趣,而实际开发中Spring MVC的工作流程可以看下图:

图源:www.processon.com

10. 流程解释

用户发送请求至前端控制器DispatcherServlet。

DispatcherServlet收到请求调用HandlerMapping处理器映射器。

处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

DispatcherServlet调用HandlerAdapter处理器适配器。

HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

Controller执行方法在控制台打印"Hello World"等,我们测试学习使用的控制台,开发中执行完毕常常返回ModelAndView。

HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

ViewReslover解析后返回具体View。

DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

DispatcherServlet响应用户。

上方是对比较完整的Spring MVC搭建的web项目工作原理的描述,我们刚开始的案例很多概念没有涉及到,如ModelAndView、视图解析器等,以后我们会逐渐完善项目,并且一一讲解。

如果喜欢,欢迎关注我的微信公众号:Web项目聚集地

图一:my.oschina.net/TaciturnKnightYQ/blog/539875?p=1

图二、三:www.processon.com

推荐阅读

1. Linux养成计划(一)

2.Linux养成计划(二)

3.SSM框架开发「内容管理系统」

4.读书无用论,是历史最大阴谋!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容