struts框架介绍,struts框架的设计原理是什么?
struts框架介绍,struts框架的设计原理是什么?详细介绍
本文目录一览: 关于Struts框架简介
(一)个人整理Struts框架简介 一 什么是框架? 所谓框架就是提供了一组统一的接口和编程方式的可以重用组件 同时我们可以在框架中扩充我们自己的特定逻辑 二 MVC设计模式 将应用程序分为 个部分 模型 Model 视图View 控制器Controller 模型组件 负责业务逻辑 模型包含应用程序的核心功能 模型封装了应用程序的状态 有时它包含的唯一功能就是状态 它对视图或控制器一无所知 视图组件 负责表示业务范围的视图 视图提供模型的表示 它是应用程序的 外观 视图可以访问模型的读方法 但不能访问写方法 此外 它对控制器一无所知 当更改模型时 视图应得到通知 控制器组件 负责控制用户输入的流和状态 控制器对用户的输入作出反应 它创建并设置模型 Struts 它是使用 servlet 和 JavaServer Pages 技术的一种MVC 实现 Struts Apache组织的一个项目 MVC 的一种开放源码实现 三 什么是Struts框架 Struts 是一组相互协作的类 servlet 和 JSP 标记组成的一个可重用的 MVC 设计 这个定义表示 Struts 是一个框架 而不是一个库 但 Struts 也包含了丰富的标记库和独立于该框架工作的实用程序类 四 Struts 概览 Client browser(客户浏览器) 来自客户浏览器的每个 HTTP 请求创建一个事件 Web 容器将用一个 HTTP 响应作出响应 Controller(控制器) 控制器接收来自浏览器的请求 并决定将这个请求发往何处 就 Struts 而言 控制器是以 servlet 实现的一个命令设计模式 struts config xml 文件配置控制器命令 业务逻辑 业务逻辑更新模型的状态 并帮助控制应用程序的流程 就 Struts 而言 这是通过作为实际业务逻辑 瘦 包装的 Action 类完成的 Model(模型)的状态 模型表示应用程序的状态 业务对象更新应用程序的状态 ActionForm bean 在会话级或请求级表示模型的状态 而不是在持久级 JSP 文件使用 JSP 标记读取来自 ActionForm bean 的信息 View(视图) 视图就是一个 JSP 文件 其中没有流程逻辑 没有业务逻辑 也没有模型信息 —— 只有标记 标记是使 Struts 有别于其他框架(如 Velocity)的因素之一 五 Struts中的Controller(控制器) 命令设计模式的实现 Struts 的控制器将事件(事件通常是 HTTP post)映射到类的一个 servlet ActionServlet (Command) 创建并使用 Action ActionForm 和 ActionForward 通过struts config xml 文件配置该 Command 从而扩展 Action 和 ActionForm 来解决特定的问题 可以通过扩展 ActionServlet 来添加 Command 功能 在Struts框架中控制器组件由三个部分构成 消息控制模块 用户所有的提交请求都发往消息控制模块 在由消息总线模块根据视图映射模块找到消息处理模块来执行处理逻辑 消息控制模块接收所有用户的请求 并根据请求视图找到处理 Strtus中通过ActionServlet和RequestProcessor类来完成 消息处理模块 该模块执行该消息的逻辑处理 因此通常由用户扩展实现 Struts中通过Action类来实现 视图映射模块 控制器逻辑和视图逻辑之间的结合是通过配置模块和配置文件建立其的链接 Struts中配置模块通过ModuleConfig类来完成 而配置文件由struts config xml文件提供 六 Struts中的View(视图) 视图组件通过JSP组件实现的 Struts框架对视图组件进行了扩展和封装 Struts对视图的扩展提供了一组扩展服务器标签用来提供视图显示以及传递数据到处理缓冲 而处理缓冲由ActionForm的扩展类来实现 Struts框架利用ActionForm Bean来实现视图与控制器之间的数据的交互 维持会话级或请求级的模型的状态 服务器标签主要包括 Html视图标签 Logic逻辑流程控制标签 Bean数据缓冲读取标签 七 Struts中的Model(模型) Struts框架中并没有定义特定的模型组件 而是希望由用户自己决定选择合理的模型组件 J EE中可用的模型组件包括 JavaBean 用户定义组件 EJB 组件 由EJB容器实现组件 JDO 未来J EE数据访问模型 一些扩展框架如 Hibernate 模型中状态的级别 会话级或请求级 ActionForm bean来维持 持久级 模型组件来维持 lishixinzhi/Article/program/Java/ky/201311/28517
Struts是什么?
Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架
Struts是最早的MVC开源框架,它是apache组织基于MVC模式开发的开源的单点控制的web应用框架(framework)。
Struts最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServer Pages 、Servlet、标签库以及面向对象的技术水准。Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。这个框架之所以叫"Struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。这也是一个解释Struts在开发Web应用程序中所扮演的角色的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样,软件工程师使用Struts为业务应用的每一层提供支持。它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。
Struts2简介
一 什么是Struts ?
虽然Struts 号称是一个全新的框架 但这仅仅是相对Struts 而言 Struts 与Struts 相比 确实有很多革命性的改进 但它并不是新发布的新框架 而是在另一个赫赫有名的框架 WebWork基础上发展起来的 从某种程度上来讲 Struts 没有继承Struts 的血统 而是继承WebWork的血统 或者说 WebWork衍生出了Struts 而不是Struts 衍生了Struts 因为Struts 是WebWork的升级 而不是一个全新的框架 因此稳定性 性能等各方面都有很好的保证 而且吸收了Struts 和WebWork两者的优势 因此 是一个非常值得期待的框架
Apache Struts 是一个优雅的 可扩展的JAVA EE web框架 框架设计的目标贯穿整个开发周期 从开发到发布 包括维护的整个过程
Apache Struts 即是之前大家所熟知的WebWork 在经历了几年的各自发展后 WebWork和Struts社区决定合二为一 也即是Struts
Struts 和Struts 的不同
Action 类
◆Struts 要求Action类继承一个抽象基类 Struts 的一个普遍问题是使用抽象类编程而不是接口
◆Struts Action类可以实现一个Action接口 也可实现其他接口 使可选和定制的服务成为可能 Struts 提供一个ActionSupport基类去实现 常用的接口 Action接口不是必须的 任何有execute标识的POJO对象都可以用作Struts 的Action对象
线程模式
◆Struts Action是单例模式并且必须是线程安全的 因为仅有Action的一个实例来处理所有的请求 单例策略限制了Struts Action能作的事 并且要在开发时特别小心 Action资源必须是线程安全的或同步的
◆Struts Action对象为每一个请求产生一个实例 因此没有线程安全问题 (实际上 servlet容器给每个请求产生许多可丢弃的对象 并且不会导致性能和垃圾回收问题)
Servlet 依赖
◆Struts Action 依赖于Servlet API 因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法
◆Struts Action不依赖于容器 允许Action脱离容器单独被测试 如果需要 Struts Action仍然可以访问初始的request和response 但是 其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性
可测性
◆测试Struts Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器) 一个第三方扩展——Struts TestCase——提供了一套Struts 的模拟对象(来进行测试)
◆Struts Action可以通过初始化 设置属性 调用方法来测试 依赖注入 支持也使测试更容易
捕获输入
◆Struts 使用ActionForm对象捕获输入 所有的ActionForm必须继承一个基类 因为其他JavaBean不能用作ActionForm 开发者经常创建多余的类捕获输入 动态Bean(DynaBeans)可以作为创建传统ActionForm的选择 但是 开发者可能是在重新描述(创建)已经存在的JavaBean(仍然会导致有冗余的javabean)
◆ Struts 直接使用Action属性作为输入属性 消除了对第二个输入对象的需求 输入属性可能是有自己(子)属性的rich对象类型 Action属性能够通过web页面上的taglibs访问 Struts 也支持ActionForm模式 rich对象类型 包括业务对象 能够用作输入/输出对象 这种ModelDriven 特性简化了taglib对POJO输入对象的引用
表达式语言
◆Struts 整合了JSTL 因此使用JSTL EL 这种EL有基本对象图遍历 但是对集合和索引属性的支持很弱
◆Struts 可以使用JSTL 但是也支持一个更强大和灵活的表达式语言—— Object Graph Notation Language (OGNL)
绑定值到页面(view)
◆ Struts 使用标准JSP机制把对象绑定到页面中来访问
◆Struts 使用 ValueStack 技术 使taglib能够访问值而不需要把你的页面(view)和对象绑定起来 ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面(view)
类型转换 ◆Struts ActionForm 属性通常都是String类型 Struts 使用Commons Beanutils进行类型转换 每个类一个转换器 对每一个实例来说是不可配置的
◆Struts 使用OGNL进行类型转换 提供基本和常用对象的转换器
校验 ◆Struts 支持在ActionForm的validate方法中手动校验 或者通过Commons Validator的扩展来校验 同一个类可以有不同的校验内容 但不能校验子对象
◆Struts 支持通过validate方法和XWork校验框架来进行校验 XWork校验框架使用为属性类类型定义的校验和内容校验 来支持chain校验子属性Action执行的控制 ◆Struts 支持每一个模块有单独的Request Processors(生命周期) 但是模块中的所有Action必须共享相同的生命周期
◆Struts 支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期 堆栈能够根据需要和不同的Action一起使用
Struts 的工作流程图
工作流程图
工作流程当接收到一个request Interceptor做一些拦截或者初始的工作当外部的ervletrequest到来时初始到了servlet容器 传递给一个标准的过滤器链ActionContextCleanUp这个在集成插件方面非常有用Other filters(SitMesh etc)
调用FilterDispatecher会去查找相应的ActionMapper如果找到了相应的ActionMapper它将会将控制权限交给ActionProxy ActionProxy将会通过ConfigurationManager来查找配置struts xml下一步将会 通过ActionInvocation来负责命令模式的实现(包括调用一些拦截Interceptor框架在调用action之前)
一旦action返回 会查找相应的Result Result类型可以是 jsp或者freeMark 等这些组件和ActionMapper一起返回给请求的url(注意拦截器的执行顺序)
lishixinzhi/Article/program/Java/ky/201311/28090
简述Struts框架
框架中三个部分:模型,视窗和控制器。
模型
在struts框架中,模型分为两个部分:
? 系统的内部状态
? 可以改变状态的操作(事务逻辑)
内部状态通常由一组ActinForm JavaBean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。
大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。
小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。
建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。
视窗
由JSP建立,struts包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。
控制器
struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。
Struts框架有什么用
Struts框架有什么用 1)建立在MVC这种公认的好的模式上的,struts在M,V,C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库,也就是说它的着力点在C和V上,有mvc的一系列有点,如:结构层次分明,高可重用性,增加了程式的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的许可权控制、校验、国际化、日志等。 2)开源专案,并且经受了实战的检验,使其功能越来越强大,体系也日渐完善。 3)与其他技术和框架具有很好的融合性 4)提高了开发速度
MetaSploit框架有什么用 1. Metasploit的开发人员喜欢Ruby。 文章中有好几个地方表达了这种观念。 比如说他们非常讨厌Python的缩排语法(这点跟我相似) 2. Ruby本身的强大超程式设计能力,非常适合Metasploit要实现的特性。 3. 其他原因
javaEE框架有什么用 你做一个专案 就好像盖一座房子 一般情况的话 要盖一座房子你需要什么??当然是材料啦 砖头 水泥 木头什么的 你需要把这些材料一点一点组合起来 盖成一座房子~ 用框架的话 你上来又得就不只是砖头 水泥 木头之类的材料 而是先成的墙 屋顶 窗户 门~~ 你只要把这些元件拼装起来你的房子就造好了~
xposde框架有什么用 xposed框架是在安卓系统下对手机进行美化的软体框架, 对于不想刷机或者不会的小白来说有用, 如果你是高手或者对自己系统的美化程度满意的话,xposed框架能提供的不多。
php有那些框架,框架有什么用 比较流行的有thinkphp vii laraval swoole 框架就是工具 使用框架可以快速开发 里面都是封装好的方法 你可以直接使用 不必像写原生程式码一样 每个功能都要自己手写 框架里面是你只要了解这个方法如果使用就可以 能够大大提高开发效率
dreamweaver框架有什么用啊 框架的意思就是 把几个网页拼合为一个网页,那么拼合而成网页就会形成一个框架。 框架的用途:由于网页是拼合而成,因此可以单独改变这个框架中任意一个网页的显示内容。 假如两个网页 a、b 形成一个框架系统,那么可以在a网页上点一个连结,b网页的内容就发生变化,而a网页内容不变。
reactivecocoa 这个框架有什么用 我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物。ReactiveCocoa是一个高度抽象的程式设计框架,它真的很抽象,初看你不知道它是要干嘛的,等你用上了之后,就发现,有了它你是想干嘛就干嘛,编码从未如此流畅。
google play服务框架有什么用? 有些大型游戏是必须安装谷歌框架的!不然不能玩
Java的快取框架有什么用 (1100)(0)一、什么是快取1、Cache是高速缓冲储存器一种特殊的储存器子系统,其中复制了频繁使用的资料以利于快速访问2、凡是位于速度相差较大的两种硬体/软体之间的,用于协调两者资料传输速度差异的结构,均可称之为Cache二、快取的分类1、基于web应用的系统架构图2、在系统架构的不同层级之间,为了加快访问速度,都可以存在快取作业系统磁碟快取->减少磁碟机械操作资料库快取->减少档案系统I/O应用程式快取->减少对资料库的查询Web伺服器快取->减少应用伺服器请求客户端浏览器快取->减少对网站的访问三、作业系统快取1、档案系统提供的DiskCache:作业系统会把经常访问到的档案内容放入到记忆体当中,由档案系统来管理2、当应用程式通过档案系统访问磁碟档案的时候,作业系统从DiskCache当中读取档案内容,加速了档案读取速度3、DiskCache由作业系统来自动管理,一般不用人工干预,但应当保证实体记忆体充足,以便于作业系统可以使用尽量多的记忆体充当DiskCache,加速档案读取速度4、特殊的应用程式对档案系统DiskCache有很高的要求,会绕开档案系统DiskCache,直接访问磁碟分割槽,自己实现Disk5、Cache策略Oracle的rawdevice(裸装置)–直接抛弃档案系统MySQL的InnoDB:innodb_flush_method=O_DIRECT四、资料库快取1、重要性资料库通常是企业应用系统最核心的部分资料库储存的资料量通常非常庞大资料库查询操作通常很频繁,有时还很复杂以上原因造成资料库查询会引起非常频繁的磁碟I/O读取操作,迫使CPU挂起等待,资料库效能极度低下2、快取策略a、QueryCache以SQL作为key值快取查询结果集一旦查询涉及的表记录被修改,快取就会被自动删除设定合适的QueryCache会极大提高资料库效能QueryCache并非越大越好,过大的QqueryCache会浪费记忆体。MySQL:query_cache_size=128Mb、DataBufferdatabuffer是资料库资料在记忆体中的容器databuffer的命中率直接决定了资料库的效能databuffer越大越好,多多益善MySQL的InnoDBbuffer:innodb_buffer_pool_size=2GMySQL建议bufferpool开大到伺服器实体记忆体60-80%五、应用程式快取1、物件快取由O/RMapping框架例如Hibernate提供,透明性访问,细颗粒度快取资料库查询结果,无需业务程式码显式程式设计,是最省事的快取策略当软体结构按照O/RMapping框架的要求进行针对性设计,使用物件快取将会极大降低Web系统对于资料库的访问请求良好的设计资料库结构和利用物件快取,能够提供极高的效能,物件快取适合OLTP(联机事务处理)应用2、查询快取对资料库查询结果集进行快取,类似资料库的QueryCache适用于一些耗时,但是时效性要求比较低的场景。查询快取和物件快取适用的场景不一样,是互为补充的当查询结果集涉及的表记录被修改以后,需要注意清理快取3、页面快取a、作用针对页面的快取技术不但可以减轻资料库伺服器压力,还可以减轻应用伺服器压力好的页面快取可以极大提高页面渲染速度页面快取的难点在于如何清理过期的快取b、分类I、动态页面静态化利用模板技术将访问过一次的动态页面生成静态,同时修改页面连结,下一次请求直接访问静态连结页面动态页面静态化技术的广泛应用于网际网路CMS/新闻类Web应用,但也有BBS应用使用该技术,例如Discuz!无法进行许可权验证,无法显示个性化资讯可以使用AJAX请求弥补动态页面静态化的某些缺点II、Servlet快取针对URL访问返回的页面结果进行快取,适用于粗粒度的页面快取,例如新闻释出可以进行许可权的检查OScache提供了简单的Servlet快取(通过web.xml中的配置)也可以自己程式设计实现Servlet快取III、页面内部快取针对动态页面的区域性片断内容进行快取,适用于一些个性化但不经常更新的页面(例如部落格)OSCache提供了简单的页面快取可以自行扩充套件JSPTag实现页面区域性快取六、web伺服器端快取基于代理伺服器模式的Web伺服器端快取,如squid/nginxWeb伺服器快取技术被用来实现CDN(内容分发网路contentdeliveryneork)被国内主流入口网站大量采用不需要程式设计,但仅限于新闻释出类网站,页面实时性要求不高七、基于ajax的浏览器快取使用AJAX呼叫的时候,将资料库在浏览器端快取只要不离开当前页面,不重新整理当前页面,就可以直接读取快取资料只适用于使用AJAX技术的页面
python django 测试框架有什么用 Django是一个开放原始码的Web应用框架,由Python写成。采用了MVC的软体设计模式,即模型M,检视V和控制器C。它最初是被开发来用于管 理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软体。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉 普赛爵士吉他手Django Reinhardt来命名的。
什么是struts,有什么用
现在Aapche Struts存在漏洞要及时修复
可以在腾讯智慧安全页面申请使用腾讯御点
然后使用这个软件上面的修复漏洞功能
直接对电脑的漏洞进行检测和修复就可以了
Struts是一个基于Sun J2EE平台的MVC应用框架, 它把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间。
struts是一个被认为比较好的MVC框架,他是开发难度加大,时间变长,但却使结构清晰,易于维护和扩展
什么是struts1框架?
struts采用的是MVC(Model-View -Controller) 模式( Patterns ) 以增加程序代码弹性,MVC模式将程序代码整理切割为三部分,Model 部分是业务与应用领域( Business domain) 相关逻辑、管理状态之对象,Controller 部分接收来自View 所输入的资料并与Model 部分互动,是业务流程控制( Flow Control) 之处,View 部分则负责展现资料、接收使用者输入资料。
框架中三个部分:模型,视窗和控制器。
◆模型
在struts框架中,模型分为两个部分:
a. 系统的内部状态
b. 可以改变状态的操作(事务逻辑)
内部状态通常由一组ActinForm JavaBean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。
大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。
小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。
建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。
◆视窗
由JSP建立,struts包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。
◆控制器
struts中,基本的控制器组件是ActionServlet类中的实例servlet,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义
struts框架的设计原理是什么?
Struts是MVC的一种实现,它很好地结合了jsp、Java
Servlet、Java
Bean等技术,工作原理如下。1.控制在Struts中,ActionServlet起着一个控制层(controller)的作用。ActionServlet是一个通用的控制组件,这个控制组件提供了处理所有发送到Struts的HTTP请求的入口点,它截取和分发这些请求到相应的动作类(这些动作类都是Action类的子类)。另外控制组件也可以负责用相应的请求参数填充ActionForm(通常称为FormBean),并传给动作类(通常称为ActionBean)。动作类实现核心商业逻辑,它可以访问Java
bean或EJB。所有这些控制逻辑利用Strut-config.xml文件来配置。2.视图主要是由jsp来控制页面输出。它接收到Action
Form中的数据,利用html、taglib、bean、logic等显示数据。3.样式在Struts中,主要存在3种bean,分别是:Action、ActionForm\EJB\或者Java
Bean。ActionForm用来封装客户请求信息,Action取得ActionForm中的数据,再由EJB或者Java
Bean进行处理。样式图如图3.3所示。4.Struts框架的工作机制ActionServlet将request转发给RequestProcessor类进行处理。RequestProcessor类根据提交过来的url,如*.do,从ActionMapping类中得到相对应的ActionForm类和Action类。然后将request的参数对应到ActionForm类中,进行validate()验证。如果验证成功,则调用Action的perform()方法来执行Action,最终返回到ActionFoward类。如果验证失败,则调用ActionErrors类。
一句两句也说不清楚,我这边有本关于struts电子书,你邮箱留一下我发给你吧
struts是什么?
Struts最早是作为Apache Jakarta项目的组成部分问世运作。项目的创立者希望通过对该项目的研究,改进和提高Java Server Pages、Servlet、标签库以及面向对象的技术水准。 Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。它的目的是为了减少在运用MVC设计模型来开发Web应用的时间。你仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。 Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点,使开发者能更深入的了解其内部实现机制
引用:http://zhidao.baidu.com/topic?ct=29&tn=iktopic&word=struts
MVC框架
Struts最早是作为Apache Jakarta项目的组成部分问世运作。项目的创立者希望通过对该项目的研究,改进和提高Java Server Pages、Servlet、标签库以及面向对象的技术水准。
Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。它的目的是为了减少在运用MVC设计模型来开发Web应用的时间。你仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。
Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点,使开发者能更深入的了解其内部实现机制。
除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活动用,能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts的工作原理,如图所示:
Struts框架
struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。
本章详细讨论struts架构。我们将看到struts是如何清晰地区分控制,事务逻辑和外观,从而简化了开发应用程序过程的。我们还将介绍struts提供的类如何使得开发工作更加简单,这些类包括:
? 控制程序流程的类
? 实现和执行程序事务逻辑的类
? 自定义的标记库使得创建和验证HTML表单更加容易
1. Struts压缩包内容
文件夹jakarta-struts-1.0.2包含两个目录,lib和webapps。在lib目录中有使用struts创建应用程序是所需的文件:
文件 描述
jdbc2_0-stdext.jar 包含JDBC2.0 Optional Package API类。如果我们要使用struts提供的数据资源,就需要将这个文件拷贝到WEB-INF\lib下
Struts.jar 包含struts中所有的java类。同样也需要拷贝到WEB-INF\lib下
*.tld 标记库描述器文件,描述了多个struts标记库中的自定义标记。同样要拷贝到WEB-INF\lib下
在webapps目录下有如下文件:
Web应用程序 描述
Struts-blank.war 一个简单的web应用程序
Struts-documentation.war 包含struts站点上所有struts文档
Struts-example.war Struts很多特性的示范
Struts-exercisetaglib.war 主要用于对自定义标签库进行增加而使用的测试页,但也可以示范如何使用struts标记
Struts-template.war 包含struts模板标记的介绍和范例
Struts-upload.war 一个简单的例子,示范如何使用struts框架上传文件
2.Struts体系结构
让我们从MVC角度观察struts框架中的组件
框架中三个部分:模型,视窗和控制器。
模型
在struts框架中,模型分为两个部分:
? 系统的内部状态
? 可以改变状态的操作(事务逻辑)
内部状态通常由一组ActinForm JavaBean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。
大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。
小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。
建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。
视窗
由JSP建立,struts包含扩展自定义标签库,可以简化创建完全国际化用户界面的过程。
控制器
struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。
3.Struts框架中的组件
(由于ROSE工具还未能下载,只能找来这幅图,它说明了一定问题,特别是ActionErrors,但它并没有将ActionMapping,JSP和Tag Library包含进来,有时间作完替换)
框架中所使用的组件:
ActionServlet 控制器
ActionClass 包含事务逻辑
ActionForm 显示模块数据
ActionMapping 帮助控制器将请求映射到操作
ActionForward 用来指示操作转移的对象
ActionError 用来存储和回收错误
Struts标记库 可以减轻开发显示层次的工作
下面我们看看各自在框架中所扮演的角色和责任。
3.1 Struts配置文件
这是将struts组件结合在一起的东东:struts-config.xml。默认值
\WEB-INF\struts-config.xml。配置文件可以定义:
? 全局转发
? ActionMapping类 帮助控制器将请求映射到操作
? ActionForm bean 显示模块数据
? JDBC数据源
配置全局转发
全局转发用来在JSP页之间创建逻辑名称映射。转发都可以通过对调用操作映射的实例来获得,例如:
actionMappingInstace.findForward(“logicalName”);
全局转发的例子:(所有的例子我没有进行解释,一是结合表可以理解,二是例子大部分来自系列四的示例,你应该在作完实验后,再来看一遍)
属性 描述
Name 全局转发的名字
Path 与目标URL的相对路径
配置ActionMapping
ActionMapping对象帮助进行框架内部的流程控制,它们可将请求URI映射到Action类,并且将Action类与ActionForm bean相关联。ActionServlet在内部使用这些映射,并将控制转移到特定Action类的实例。所有Action类使用perform()方法实现特定应用程序代码,返回一个ActionForward对象,其中包括响应转发的目标资源名称。例如:
<action path="/createBook"
type="BookAction"
name="bookForm"
scope="request"
input="/CreateBook.jsp">
属性 描述
Path Action类的相对路径
Name 与本操作关联的Action bean的名称
Type 连接到本映射的Action类的全称(可有包名)
Scope ActionForm bean的作用域(请求或会话)
Prefix 用来匹配请求参数与bean属性的前缀
Suffix 用来匹配请求参数与bean属性的后缀
attribute 作用域名称。
className ActionMapping对象的类的完全限定名默认的类是org.apache.struts.action.ActionMapping
input 输入表单的路径,指向bean发生输入错误必须返回的控制
unknown 设为true,操作将被作为所有没有定义的ActionMapping的URI的默认操作
validate 设置为true,则在调用Action对象上的perform()方法前,ActionServlet将调用ActionForm bean的validate()方法来进行输入检查
通过
元素,可以定义资源的逻辑名称,该资源是Action类的响应要转发的目标。
属性 描述
Id ID
ClassName ActionForward类的完全限定名,默认是org.apache.struts.action.ActionForward
Name 操作类访问ActionForward时所用的逻辑名
Path 响应转发的目标资源的路径
redirect 若设置为true,则ActionServlet使用sendRedirect()方法来转发资源
配置ActionForm Bean
ActionServlet使用ActionForm来保存请求的参数,这些bean的属性名称与HTTP请求参数中的名称相对应,控制器将请求参数传递到ActionForm bean的实例,然后将这个实例传送到Action类。例子:
属性 描述
Id ID
className ActionForm bean的完全限定名,默认值是org.apache.struts.action.ActionFormBean
Name 表单bean在相关作用域的名称,这个属性用来将bean与ActionMapping进行关联
Type 类的完全限定名
配置JDBC数据源
用
元素可以定义多个数据源。
属性 描述
Id ID
Key Action类使用这个名称来寻找连接
Type 实现JDBC接口的类的名称
下面属性需要
元素定义,在框架1.1版本中已不在使用,但你可用
元素。例子:
<data-source id="”DS1”"
key=”conPool”
type=”org.apache.struts.util.GenericDataSource”
<set-property id="”SP1”"
autoCommit="true"
description="Example Data Source Configuration"
driverClass="org.test.mm.mysql.Driver"
maxCount="4"
minCount="2"
url="jdbc:mysql://localhost/test"
user="struts"
password="wrox" />
属性 描述
desciption 数据源的描述
autoCommit 数据源创建的连接所使用的默认自动更新数据库模式
driverClass 数据源所使用的类,用来显示JDBC驱动程序接口
loginTimeout 数据库登陆时间的限制,以秒为单位
maxCount 最多能建立的连接数目
minCount 要创建的最少连接数目
password 数据库访问的密码
readOnly 创建只读的连接
User 访问数据库的用户名
url JDBC的URL
通过指定关键字名称,Action类可以访问数据源,比如:
javax.sql.DataSource ds = servlet.findDataSource(“conPool”);
javax.sql.Connection con = ds.getConnection();
3.2 ActionServlet类
框架中的控制器组件是有org.apache.struts.action.ActionServlet类实现的,这个类是javax.servlet.http.HttpServlet类的扩展。
Struts controller基本功能是:
1. 截获用户的Http请求
2. 把这个请求映射到相应的Action类,如果这是此类收到的第一个请求,将初始化实例并缓存。
3. 创建或发现一个ActionForm bean实例(看配置文件是否定义),然后将请求过程移植到bean.
4. 调用Action实例的perform()方法并将ActioForm bean,Action Mapping对象,request和response对象传给它。
如:public ActionForword perform(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
5.perform返回一个ActionForword对象,此对象连接到相应的jsp页面.
ActionServlet配置
我们需要在web.xml中声明ActionServlet,并且将它配置成启动时进行加载。以下为可以配置的初始化参数:
参数 默认值 描述
application null 应用程序的资源集合的类
bufferSize 4096 文件上传的缓冲区大小
config /WEB-INF/struts-config.xml 配置文件的位置和名称
content Text/html 默认的内容类型
debug 0 程序调试的级别
detail 0 程序调试细节的级别
factory null 消息资源工厂,用于国际化中解释消息资源
formBean org.apache.struts.action.ActionFormBean 封装ActionForm bean信息的类的名称
forward org.apache.struts.action.ActionForward 封装ActionForward对象信息的类的名称
locale true 为true,将在用户会话中存储一个本地对象
mapping org.apache.struts.action.ActionForward 封装ActionMapping信息的类的名称
maxFileSize 250M 上传文件的最大尺寸
multipartClass org.apache.struts.action.ActionForward 处理多部分请求的类的名称
noCache False HTTP标头是否要设置为禁止缓寸
Null True 设置为true,对于无效的信息关键字将返回null
tempDir 作为一个servlet参数提供给程序的工作目录 处理下载文件是使用的临时工作目录
validate True 是否使用新格式的配置文件
vallidating True 是否对配置文件进行有效性分析
大多数情况下,标准的servlet就能够满足用户需要。
第一次收到特定请求的URI时,ActionServlet将适当的Action类进行实例化,然后ActionServlet在Action类实例中以servlet为变量名存储一个引用。当被实例化后,Action类会被暂存以备再用。
ActionServlet也提供一些方法,由Action类用来访问数据源和转发目标之类的资源。
ActionServlet方法
ActinServlet提供了一组能够被Action对象使用的方法。
Struts API的全部信息在struts-documentation.war中可以找到。动态的添加或删除,这些方法只影响应用程序当前的实例:
public void addFormBean(ActionFormBean formBean)
public void removeFormBean(ActionFormBean formBean)
public void addForward(ActionForward actionForward)
public void removeForward(ActionForward actionForward)
public void addMapping(ActionMapping actionMapping)
public void removeMapping(ActionMapping actionMapping)
根据名称查找对象:
public ActionFormBean findFormBean(String name)
public ActionForward findForward(String name)
public ActionMapping findMapping(String name)
用来处理数据源:
public void addDataSource(String key , DataSource ds)
public DataSource findDataSource(String key)
我们还可以:
? 使用destroy()方法结束ActionServlet
? 使用reload()方法从struts配置文件将信息重新加载。
3.3 ActionMapping类
将特定请求映射到特定Action的相关信息存储在ActionMapping中,ActionServelt将ActionMapping传送到Action类的perform()方法,Action将使用ActionMapping的findForward()方法,此方法返回一个指定名称的ActionForward,这样Action就完成了本地转发。若没有找到具体的ActionForward,就返回一个null.
public ActionForward findForward(String name)
可在映射中动态添加ActionForward:
public void addForward(ActionForward forward)
可返回与映射关联的表单bean:
public String getName()
可返回映射的属性域(会话或请求)
public String getScope()
3.4 Action类
Action类真正实现应用程序的事务逻辑,它们负责处理请求。在收到请求后,ActionServlet会:
? 为这个请求选择适当的Action
? 如果需要,创建Action的一个实例
? 调用Action的perform()方法
如果ActionServlet不能找到有效的映射,它会调用默认的Action类(在配置文件中定义)。如果找到了ActionServlet将适当的ActionMapping类转发给Action,这个Action使用ActionMapping找到本地转发,然后获得并设置ActionMapping属性。根据servlet的环境和被覆盖的perform()方法的签名,ActionServlet也会传送ServletRequest对象或HttpServletRequest对象。
所有Action类都扩展org.apache.struts.action.Action类,并且覆盖类中定义的某一个perform()方法。有两个perform()方法:
处理非HTTP(一般的)请求:
public ActionForward perform(ActionMapping action,
AcionForm form,
ServletRequest request,
ServletResponse response)
throws IOException,ServletException
处理HTTP请求:
public ActionForward perform(ActionMapping action,
AcionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws IOException,ServletException
Action类必须以“线程安全”的方式进行编程,因为控制器会令多个同时发生的请求共享同一个实例,相应的,在设计Action类时就需要注意以下几点:
? 不能使用实例或静态变量存储特定请求的状态信息,它们会在同一个操作中共享跨越请求的全局资源
? 如果要访问的资源(如JavaBean和会话变量)在并行访问时需要进行保护,那么访问就要进行同步
Action类的方法
除了perform()方法外,还有以下方法:
可以获得或设置与请求相关联的区域:
public Locale getLocale(HttpServletRequest request)
public void setLocale(HttpServletRequest request,Locale locale)
为应用程序获得消息资源:
public MessageResources getResources()
检查用户是否点击表单上的“取消”键,如果是,将返回true:
public Boolean isCancelled(HttpServletRequest request)
当应用程序发生错误时,Action类能够使用下面方法存储错误信息:
public void saveErrors(HttpServletRequest request,ActionErrors errors)
ActionError实例被用来存储错误信息,这个方法在错误关键字下的请求属性列表中存储ActionError对象。通过使用在struts标记库中定义的自定义标记,JSP页能够显示这些错误信息,稍后我们就介绍。
3.5 ActionForm类
框架假设用户在应用程序中为每个表单都创建了一个ActionForm bean,对于每个在struts-config.xml文件中定义的bean,框架在调用Action类的perform()方法之前会进行以下操作:
? 在相关联的关键字下,它检查用于适当类的bean实例的用户会话,如果在会话中没有可用的bean,它就会自动创建一个新的bean并添加到用户的会话中。
? 对于请求中每个与bean属性名称对应的参数,Action调用相应的设置方法。
? 当Action perform()被调用时,最新的ActionForm bean传送给它,参数值就可以立即使用了。
ActionForm类扩展org.apache.struts.action.ActionForm类,程序开发人员创建的bean能够包含额外的属性,而且ActionServlet可能使用反射(允许从已加载的对象中回收信息)访问它。
ActionForm类提供了另一种处理错误的手段,提供两个方法:
Public ActionErrors validate(ActionMappin mapping,
ServletRequest request)
Public ActionErrors validate(ActionMappin mapping,
HttpServletRequest request)
你应该在自己的bean里覆盖validate()方法,并在配置文件里设置
元素的validate为true。在ActionServlet调用Action类前,它会调用validate(),如果返回的ActionErrors不是null,则ActinForm会根据错误关键字将ActionErrors存储在请求属性列表中。
如果返回的不是null,而且长度大于0,则根据错误关键字将实例存储在请求的属性列表中,然后ActionServlet将响应转发到配置文件
元素的input属性所指向的目标。
如果需要执行特定的数据有效性检查,最好在Action类中进行这个操作,而不是在ActionForm类中进行。
方法reset()可将bean的属性恢复到默认值:
public void reset(ActionMapping mapping,HttpServletRequest request)
public void reset(ActionMapping mapping,ServletRequest request)
典型的ActionFrom bean只有属性的设置与读取方法(getXXX),而没有实现事务逻辑的方法。只有简单的输入检查逻辑,使用的目的是为了存储用户在相关表单中输入的最新数据,以便可以将同一网页进行再生,同时提供一组错误信息,这样就可以让用户修改不正确的输入数据。而真正对数据有效性进行检查的是Action类或适当的事务逻辑bean。
3.6 ActionForward类
目的是控制器将Action类的处理结果转发至目的地。
Action类获得ActionForward实例的句柄,然后可用三种方法返回到ActionServlet,所以我们可以这样使用findForward():
? ActionServlet根据名称获取一个全局转发
? ActionMappin实例被传送到perform()方法,并根据名称找到一个本地转发
另一种是调用下面的一个构造器来创建它们自己的一个实例:
public ActionForward()
public ActionForward(String path)
public ActionForward(String path,Boolean redirect)
3.7 错误处理
struts提供了两个类来处理错误:ActionErrors和ActionError,它们都扩展org.apache.struts.action。ActionErrors保存着ActionError对象的集合,其中每一个代表了独立的错误信息。每个ActionError都包含了关键字,能够映射到资源文件中存储的错误信息,而这个资源文件是在ActionServlet初始化参数中指定的。
ActionError类
ActionError类定义了一组重载的构造器来创建错误信息,第一个构造器方法使用一个字符串作为参数,例如:
ActionError error = new ActionError(“error.Invalid”);
实例error映射到应用程序资源文件中的一个错误消息:
error.invalid=
Invalid Number
如果在JSP页使用
,用户就会看见加粗的Invalid Number。
另一种使用了java.text.MessageFormat类,可在消息中指定替换字符串,例如:
error.invalid=
Invalid Number
创建一个错误消息:
ActionError error = new ActionError(‘error.invalid’,new Double(-1));
JSP页显示:Invalild Number –1
还有获得特定消息的错误关键字:
public String getKey()
还有获得替换字符串数组:
public String[] getValues()
ActionError类
ActionError类从不独立进行错误处理,它们总是被存储在ActionErrors对象中。ActionErrors对象保存ActionError类的集合以及它们特定的属性值,我们可以使用自己定义的属性值,或是使用ActionErrors.GLOBAL_ERROR.
下面是典型Action类的perform()中错误处理情况:
MyForm form = (MyForm) form;
if (number == -1) {
ActionErrors errors = new ActionErrors();
ActionError error = new ActionError(“error.Invalid”,new Double(-1));
errors.add(ActionErrors.GLOBAL_ERROR,error);
saveErrors(req,errors);
String input = mapping.getInput();
Return new ActionForward(input);
}
ActionErrors有如下有用方法:
方法 描述
clear() 清除所有错误信息
empty() 如果ActionErrors对象是空的,它返回true
get() 返回错误信息。若无参数,所有信息将作为一个Iterator对象返回
properties() 返回包含属性名称的Iterator,这些属性至少有一个错误
size() 返回错误的数目(整型数)
目前还有基于struts二次开发出来的功能更强大的架构
这些用eclipse开发都可以找到功能非常完善的插件
开发的"傻瓜"程度很高
但是理解起来会比较困难
一旦理解透彻 开发则得心应手
Struts2
Struts2在Struts1的基础上有了很大的进步,并且集成了WebWork