Struts学习(一)
1、Struts开发基础
1.1 MVC的基本概念
mvc将一个应用系统的输入、处理和输出流程按照Model(模型)、View(视图)和Controller(控制器)三部分进行分离,划分成模型层、视图层和控制层。三层之间以最少的耦合来协同工作,从而提高了应用
系统的可扩展性和可维护性。
MVC思想的核心就是分层。它将系统的各个组件进行分类,不同的组件扮演不同的角色,然后将系统中的组件分隔到不同的层中,这些组件将被严格限制在其所在的层内。各层之间则以松散耦合的方式组合在一起,从而保证良好的封装性。MVC三层之间的关系如图所示。

1. 模型层
模型层代表的是数据和其对应的业务逻辑。它负责对数据进行处理和更新。通常,模型和现实世界对数据的处理过程类似,业务处理的过程对于视图层和控制层来说是黑箱操作:模型层接受视图层(通过控制层传送到)的请求数据,并返回最终的处理结果,以更新视图层。
2.视图层
视图层实际上是模型层中各个模型的具体表现形式。它通过模型得到数据,然后再根据需要进行显示。视图层必须保持着与模型层的数据模型一致,即当模型层的数据发生变化时,视图层必须随之变化。
3.控制层
控制层在MVC结构中连接模型层和视图层,起到了纽带的作用。它将视图层的交互信息进行过滤等处理后,再传送到模型层相应的逻辑业务处理程序进行处理。
在Web应用中,视图层首先向控制层发送信息,控制层接收到请求后,再把请求信息传递给模型层,告知模型应该做什么处理,接着,模型接受请求数据,并产生最终的处理结果。模型层对应的动作包括:业务处理和模型状态的改变,最后根据模型层产生的结果,控制层将数据反馈给用户,并在浏览器中显示。
总的来说,MVC有如下特点:
- 低耦合性。MVC架构通过分层,降低了层与层之间的耦合,提高了程序的可扩展性,有助于程序员灵活的进行编码。
- 一个模型可以对应多个视图。按照MVC的设计模式,一个模型对应多个视图,可以提高代码的可维护性。即使模型发生改变,也方便维护。
- 模型返回的数据与显示逻辑分离。模型数据可以应用任何的显示技术,各层只负责自己的任务,而不用去管其他层的任务。
- 有利于工程化管理。MVC将不同的模型和不同的视图组合在一起进行管理,层与层之间分离,每一层都有各自的特色。由于代码可复用,因此降低了软件开发周期。
1.2 Struts的工作原理
1.Struts概述
Struts1是真正意义上的MVC模式,,但Struts1在性能高效、松耦低侵入等方面存在着不足之处。所以Struts2出现弥补了Struts1这方面的缺陷和不足,并且还提供了更加灵活与强大的功能。
Struts2并不是Struts1的升级版,而是一个全新的框架。它将Struts技术与WebWork技术完美地结合起来,所以功能更加灵活。
2.Struts2工作流程
Struts2是一个全新的开发框架,如图所示为Struts2的体系结构图。
- 橙色是Servlet Filters,过滤器链,所有的请求都要经过Filter链的处理。
- 浅蓝色是Struts Core,Struts2的核心部分,Struts2中已经做好的功能,在实际开发中不需要动它们。
- 浅绿色是Interceptors,Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;当然,也可以自定义拦截器,用来实现具体业务需要的功能。
- 浅黄色是User Created,由开发人员创建的,包括struts.xml、Action、Template,是每个使用Struts2来进行开发的人员都必须会的。
各自功能:
- FilterDispatcher是整个Struts2的调度中心,根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
- ActionMapper提供了HTTP请求与action执行之间的映射,简单点说,ActionMapper会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
- ActionProxy是一个特别的中间层,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
- ConfigurationManager是xwork配置的管理中心,通俗的讲,可以把它看做struts.xml这个配置文件在内存中的对应。
- struts.xml是Stuts2的应用配置文件,负责诸如URL与Action之间映射的配置、以及执行后页面跳转的Result配置等。
- ActionInvocation:真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会执行这些拦截器、Action以及相应的Result。
- Interceptor(拦截器):拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。类似于我们熟悉的javax.servlet.Filter。
- Action:动作类是Struts2中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
- Result:Result就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的Result实现,Struts2中支持多种视图类型,比如Jsp,FreeMarker等。
- Templates:各种视图类型的页面模板,比如JSP就是一种模板页面技术。
- Tag Subsystem:Struts2的标签库,它抽象了三种不同的视图技术JSP、velocity、freemarker,可以在不同的视图技术中,几乎没有差别的使用这些标签。
Struts2处理请求步骤:
- 用户发出一个HttpServletRequest请求。
- 该请求经过一系列的过滤器Filter来传送。
- 调用FilterDispatcher。FilterDispatcher是控制器的核心,它通过询问ActionMapper来确定该请求是否需要调用某个Action。如果需要调用某个Action,则FilterDispatcher就把请求转交给ActionProxy处理。
- ActionProxy通过配置管理器Configuration Mannager询问框架的配置文件Struts.xml,从而找到需要调用的Action类。
- ActionProxy创建一个ActionInvocation的实例,该实例使用命名模式来调用。在Action执行的前后,ActionInvocation实例根据配置文件加载与Action相关的所有拦截器Interceptor。
- 一旦Action执行完毕,ActionInvocation实例就根据Struts.xml文件中的配置找到相对应的返回结果。返回结果通常是一个JSP或者FreeMarker的模板。其中,FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或Http。
Struts学习(一)的更多相关文章
- struts 学习
1.在Struts2的Action中取得请求参数值的几种方法 public class GetRequestParameterAction extends ActionSupport { privat ...
- Struts学习总结 学习
ContextMap 包含值栈包含 root(list结构)和context(map结构) 值栈包含contextMap的引用. Actioncontext是工具类 可以获取他们 Struts2拥 ...
- mzy,struts学习(一)
大家都在讲struts已经过时了,现在都是前后台分离,没有必要去学一个淘汰的框架,但是怎么讲呢?我觉得,struts能够流行那么多年,肯定有它的原因,肯定有很多优秀和好的地方,有一个指导过我的人给我讲 ...
- struts学习
1.集成tomcat到eclipse http://www.eclipsetotale.com/tomcatPlugin.html 下载最新的plug后,解压.解压后的文件放到eclipse的plug ...
- Struts学习总结-04 上传文件
1. upload.jsp <%@ page language="java" import="java.util.*" pageEncoding=&quo ...
- Struts学习总结-02 类型转换
一 类型转换 input.jsp <%@ page language="java" import="java.util.*" pageEncoding=& ...
- struts 学习之问一
今天在进行struts全局类型和局部类型转换时,发现一个问题,如下: 当输入一个点的坐标时,我使用全局转换提示错误,找不到类,当改变成局部类型转换时,可以成功转换,不知道这个是什么原因,难道全局不可以 ...
- Struts学习之流程汇总
struts2 架构图如下图所示: 依照上图,我们可以看出一个请求在struts的处理大概有如下步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的 ...
- Struts学习之手动验证
* 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法 * 要继承ActionSupport类或者实现Validateable接口 ...
- Struts学习之文件上传
* 单文件上传: * 在动作类action中声明相关属性: * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型: ...
随机推荐
- kafka消费者示范代码(Java)
1.将kafka里lib目录下(除jar包外还有别的东西)所有的jar包导入工程中. 2.代码 public static void main(String[] args) { //声明连接属性 Pr ...
- make all age=20 makefile 传参数
你可以直接在Make的时候,在命令行下面传入一个参数或者变量,它会覆盖掉Makefile里面的变量或者参数.比如,在你的Makefile里面定义了一个变量age. .PHONY:all AGE = a ...
- golang rabbitmq实践 (二 实现简单的消息收发)
1:驱动 本来打算自己写一个驱动的,后来发现github上面已经有了,那我就直接拿现成的了, 驱动采用 github.com/streadway/amqp ,直接import就可以啦! 2:excha ...
- 一个ros包依赖另一个ros包提供的库
背景: 编写一个点云配准的ros包,记为A,在其中打算使用多种点云配准算法. 同一个ros工作空间下有另一个ros包,记为B,B中提供了几种点云配准算法,并将它们都编译成一个库文件并安装在工作空间中. ...
- Springboot application 本地HTTPS配置
使用keytool 命令,生成一个数字证书: keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore key.p1 ...
- Linux小记 -- [已解决]Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings
问题描述 操作系统:Ubuntu Server 18.04 LTS Ubuntu每次启动时产生如下motd(message of today)输出 Failed to connect to https ...
- 第四周实验总结&实验报告
实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...
- 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)
目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...
- Loading class `com.mysql.jdbc.Driver'. This is deprecated警告处理,jdbc更新处
1.报错信息是这样的; 处理:提示信息表明数据库驱动com.mysql.jdbc.Driver'已经被弃用了.应当使用新的驱动com.mysql.cj.jdbc.Driver' 所以,按照提示更改jd ...
- word文档每章的页眉页脚设置
1. 每章后面插入分隔符,下一页. 2. 编辑页眉,取消选中链接的上一页,然后编辑页眉即可.