学习struts2及MVC
1、MVC模式基础
1.1、MVC模式简介
MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而达到更好的开发和维护效率。在MVC模式中,应用程序被划分成模型(Model)、视图(View)和控制器(Controller)三个部分。其中,模型部分包含了应用程序的业务逻辑和业务数据;视图部分封装了应用程序的输出形式(页面、界面);而控制器部分负责协调模型和视图,根据用户请求来选择要调用哪个模型来处理业务,以及最终由哪个视图为用户做出应答。MVC模式的这三个部分的职责非常明确,而且相互分离,每个部分都可以独立的改变而不影响其他部分,大大提高了应用的灵活性和重用性。
1.2、MVC模式基础
在MVC模式中,一个应用被划分成了模型(Model)、视图(View)和控制器(Controller)三个部分。
1.2.1、模型、视图、控制器各部分的作用
模型(Model):负责封装应用的状态,并实现应用的功能。通常分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如订单信息、用户信息等;而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等。
视图(View):用来将模型的内容展现给用户,用户可以通过视图来请求模型进行更新。视图从模型获得要展示的数据,然后用自己的方式展现给用户,相当于提供界面来与用户进行人机交互;用户在界面上操作或者填写完成后,会点击提交按钮或是以其它触发事件的方式,来向控制器发出请求。
控制器(Controller):用来控制应用程序的流程和处理视图所发出的请求。当控制器接收到用户的请求后,会将用户的数据和模型的更新相映射,也就是调用模型来实现用户请求的功能;然后控制器会选择用于响应的视图,把模型更新后的数据展示给用户。
1.2.2、模型和视图的关系
在MVC中,模型和视图是分离的,通常视图里面不会有任何逻辑实现;而模型也是不依赖于视图的,同一个模型可能会有多种不同的展示方式,即同一个模型可以对应多种不同的视图。例如,在windows操作系统上浏览文件夹时,文件夹就那些,数据并没有变化,但是展示方式就有多种,比如大图标、小图标、详细信息等等展示方式。以tomcat7文件夹下的文件为例,按照不同的展示方式,如图所示:

模型负责输出的内容,而视图负责输出的形式,模型不依赖于视图,模型与视图是解耦的。因此在修改视图时候,不必关心模型,而只需要直接修改视图的展示方式即可。
1.2.3、MVC的组件关系图

MVC的组件关系图描述了模型、视图、控制器的交互关系:
(1)首先是展示视图给用户,用户在视图上进行操作,并填写一些业务数据
(2)然后用户点击提交按钮发出请求
(3)视图发出的用户请求会到达控制器,请求中包含了想要完成什么样的业务功能以及相关的数据。
(4)控制器会处理用户请求,把请求中的数据进行封装,然后选择并调用合适的模型,请求模型进行状态更新,然后选择接下来要展示给用户的视图。
(5)模型处理用户请求的业务功能,同时进行模型状态的维护和更新
(6)当模型状态发生改变的时候,模型会通知相应的视图,告诉视图它的状态发生了改变。
(7)视图接到模型的通知后,会向模型进行状态查询,获取需要展示的数据,然后按照视图本身的展示方式,把这些数据展示出来。
接下来就是等待用户下一次操作,再次从头轮回。
3、MVC模式作用
在早期开发的时候不遵守MVC模式。结果程序结构划分不明确,各个部分功能混乱,在业务功能发生变更时,无论是业务逻辑修改还是显示形式修改,都要修改很多的类,“牵一发而动全身”,导致软件的开发和维护效率低下,错误百出。而遵循MVC模式来开发系统,就会极大的避免上述问题的出现。MVC模式的核心手段是解耦,MVC模式通过仔细的划分功能,把整个应用程序划分成模型、视图、控制器三个部分,然后严密控制三个部分之间的通信,从而得到一个结构清晰、功能分布合理、可重用、可扩展、可维护的应用程序。
因此,使用MVC模式,可以获得以下好处:
低耦合性:在MVC模式中,模型和视图是解耦的,模型不会依赖于视图,视图仅仅从模型中获取需要展示的数据,不会与模型的逻辑处理相关联。
更低的开发成本:MVC模式帮我们清楚的划分了各部分的职责,让程序员各司其职,Java程序员只关心业务逻辑的实现,也就是模型部分;而界面程序员只关心页面展示,也就是视图部分。
更好的可维护性:MVC模式划分出明晰的模型和视图,并使其解耦,在软件需求发生变更的时候,就可以各自独立的改变而不会相互影响,使得程序更容易维护和扩展。
4、Model2模型中的MVC
在Java Web开发中,通常把Servlet+JSP+JavaBean的模型称为Model2模型,这是一个遵循MVC模式的模型,划分如下:
JavaBean作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。
JSP作为表现层,负责提供页面为用户展示数据,提供相应的表单(Form)来用于用户的请求,并在适当的时候(点击按钮)向控制器发出请求来请求模型进行更新。
Serlvet作为控制器,用来接收用户提交的请求,然后获取请求中的数据,将之转换为业务模型需要的数据模型,然后调用业务模型相应的业务方法进行更新,同时根据业务执行结果来选择要返回的视图。
Model2实现MVC的基本结构如图所示:

Servlet+JSP+JavaBean模型基本的响应顺序:当用户发出一个请求后,这个请求会被控制器Servlet接收到;Servlet将请求的数据转换成数据模型JavaBean,然后调用业务逻辑模型JavaBean的方法,并将业务逻辑模型返回的结果放到合适的地方,比如请求的属性里;最后根据业务逻辑模型的返回结果,由控制器来选择合适的视图 (JSP),由视图把数据展现给用户。
2、Struts2基础
Struts2是基于MVC的轻量级的web应用框架。
所谓框架:就是能完成一定功能的半成品软件。在没有框架的时候,所有的工作都要乖乖的从零做起;有了框架,它为我们提供了一定的功能,就可以在框架的基础上做起,大大提高开发的效率和质量。
web应用框架,这说明Struts2的应用范围是Web应用而不是其它地方。Struts2更注重将Web应用领域的日常工作和常见问题抽象化,提供一个平台让我们能快速的完成Web应用开发。
轻量级:是相对于重量级而言,指的是Struts2在运行的时候,对Web服务器的资源消耗较少,比如CPU、内存等,但是运行速度相对较快。
基于MVC,说明基于Struts2开发的Web应用自然就能实现MVC,也说明Struts2着力于在MVC的各个部分为我们的开发提供相应帮助。
Struts2基本组成
WebWork与Struts合并之后,根据功能的细分和设计,拆分出一个叫xwork的部分,用来处理与Web无关的部分,也就是与Servlet无关的部分,比如:用户数据的类型转换、动作调用之前的数据验证、动作的调用等等。其余与Web相关的部分,也就是与servlet相关的部分,被称为struts2部分。因此请注意,此处的“Struts2”可以理解为一个模块,是Struts2框架的一部分,如:如何接收用户请求的数据,如何跳转到下一个页面等等。其中struts2部分调用了xwork部分,但是xwork部分是不依赖于Struts2部分的,xwork是完全独立的、纯Java的应用。因此,可以用下图来表示struts2部分和xwork部分的关系。

Struts2能干什么
了解了Struts2是什么和有什么后,看看Struts2可以做什么?
Struts2通过简单、集中的配置来调度动作类,使得我们配置和修改都非常容易。
Struts2提供简单、统一的表达式语言来访问所有可供访问的数据。
Struts2提供内存式的数据中心,所有可供访问的数据都集中存放在内存中,在调用中不需要将数据传来传去,都去这个内存数据中心访问即可。
Struts2提供在动作类执行的前或后附加执行一定功能的能力,能实现AOP。
Struts2提供标准的、强大的验证框架和国际化框架,且与Struts2的其他特性紧密结合。
类似的功能很多,不胜枚举。
3 、Struts2和MVC
Struts2是一种基于MVC的Web应用框架,下面看看Struts2和MVC的关系。这里只是先讲一下Struts2是如何跟MVC对应的,其中一些名词所代表的具体功能,比如前端控制器(FilterDispatcher)、动作(Action)、结果(Result)等。在之后的学习中会不断深入具体的细节。

控制器——FilterDispatcher
用户请求首先到达前端控制器FilterDispatcher。FilterDispatcher负责根据用户提交的URL和struts.xml中的配置,来选择合适的动作(Action),让这个Action来处理用户的请求。FilterDispatcher其实是一个过滤器(Filter,servlet规范中的一种web组件),它是Struts2核心包里已经做好的类,不需要我们去开发,只是要在项目的web.xml中配置一下即可。FilterDispatcher体现了J2EE核心设计模式中的前端控制器模式。
动作——Action
在用户请求经过FilterDispatcher之后,被分发到了合适的动作Action对象。Action负责把用户请求中的参数组装成合适的数据模型,并调用相应的业务逻辑进行真正的功能处理,获取下一个视图展示所需要的数据。Struts2 的Action,相比于别的web框架的动作处理,它实现了与Servlet API的解耦,使得Action里面不需要再直接去引用和使用HttpServletRequest与HttpServletResponse等接口。 因而使得Action的单元测试更加简单,而且强大的类型转换也使得我们少做了很多重复的工作。
视图——Result
视图结果用来把动作中获取到的数据展现给用户。在Struts2中有多种优秀的结果展示方式,常规的jsp,模板 freemarker、velocity,还有各种其它专业的展示方式,如图表jfreechart、报表JasperReports、将XML转化为 HTML的XSLT等等。而且各种视图结果在同一个工程里面可以混合出现。
看到这里,大家应该大致知道了Struts2是什么,能干什么,粗略的了解到Struts2里面有什么了,接下来就是究竟如何使用Struts2来开发基于MVC的Web应用了
学习struts2及MVC的更多相关文章
- 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例
在上一篇文章中,我们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 在本文章中,我们将使用“ ...
- 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面
在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...
- 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序
学习ASP.NET MVC系列: 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器 学习ASP ...
- 从零开始学习ASP.NET MVC 1.0
转自:http://www.cnblogs.com/zhangziqiu/archive/2009/02/27/ASPNET-MVC-1.html <从零开始学习ASP.NET MVC 1.0& ...
- 学习ASP.NET MVC(十一)——分页
在这一篇文章中,我们将学习如何在MVC页面中实现分页的方法.分页功能是一个非常实用,常用的功能,当数据量过多的时候,必然要使用分页.在今天这篇文章中,我们学习如果在MVC页面中使用PagedList. ...
- 第1章-Struts2 概述 --- Struts2和MVC
(一)Struts2和MVC的关系图: (1)控制器---FilterDispatcher 用户请求首先达到前段控制器(FilterDispatcher).FilterDispatcher负责根据用户 ...
- 菜鸟学习Spring Web MVC之一
---恢复内容开始--- 当当当!!沉寂两日,学习Spring Web MVC去了.吐槽:近日跟同行探讨了下,前端攻城师,左肩担着设计师绘图,右肩担着JAVA代码?!我虽设计过UI,但这只算是PS技巧 ...
- 系列文章--从零开始学习ASP.NET MVC 1.0
从零开始学习ASP.NET MVC 1.0 (一) 开天辟地入门篇 从零开始学习 ASP.NET MVC 1.0 (二) 识别URL的Routing组件 从零开始学习 ASP.NET MVC 1.0 ...
- struts2针对mvc的框架 spring针对解耦与事务的框架
struts2针对mvc的框架 spring针对解耦与事务的框架
随机推荐
- vue 修改端口
- 2018.5.13 oracle遇到的问题
安装Oracle 11g 出现交换空间不够 在计算机那里右键打开属性进入高级系统设置然后找到第一个设置找到高级然后更改一下自定义范围(云服务器是16-10000) 然后确定 完成了. 快安装结束之后显 ...
- Understanding NFS Caching
Understanding NFS Caching Filesystem caching is a great tool for improving performance, but it is im ...
- Sql Server 查询今天,昨天,近七天....数据
今天数据: 昨天数据: 7天内数据: 30天内数据: 本月数据: 本年数据: 查询今天是今年的第几天: select datepart(dayofyear,getDate()) 查询今天是本月的第几天 ...
- JavaScript的基础知识
1,标识符 标识符是程序中常量或变量命名的一种术语称呼,并不是所有的字符组成都是一个合法的标识符,规范如下: 标识符的组成部分可以是字母,数字,下划线或美元($)符号 标识符开头是字母,下划线或美元( ...
- PostgreSQL学习(1)-- 安装pageinspect extension
1.源码编译 pageinspect的源码在postgre源码包的contrib目录下,解压postgre源码包后进入对应的目录. [root@localhost pageinspect]# pwd ...
- 【离线 线段树分治】bzoj4025: 二分图
昨天mac的gdb挂了,今天怎么笔记本的gdb也挂了…… Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这 ...
- vue 项目白屏解决方案
在做的项目是使用 vue-cli 脚手架为基础的,只能使用微信浏览器打开的.在某次更新功能代码后,被反馈在一些手机上会出现白屏.经过一番探索,多管齐下解决了问题 白屏可能的原因: es6 代码没有被编 ...
- php 关于金额的几种计算方式
php 关于金额的几种计算方式 平常开始开发过程中,多多少少都会遇到点关于金额的计算,比如设置返利.提现手续费.折扣啊等等诸如此类的比例,然后再计算出之后的实际的费用. 下面,以折扣为例,来实现这类计 ...
- 使用GD库做图片水印
png图片作为水印加到其他类型图片后,背景变黑色 原因: imagecopy函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝. 然后直接上代码: / ...