Struts
struts是开源软件。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的选择。
名称:struts
类别:开源软件
作用:减少在运用MVC设计模型来开发Web应用的时间
1、基本简介
Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的*项目。它通过采用JavaServlet/JSP技术,实现了基于JavaEEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
2、发展历史
Struts最早是作为ApacheJakarta项目的组成部分,项目的创立者希望通过对该项目的研究,改进和提高JavaServerPages、Servlet、标签库以及面向对象的技术水准。Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架。这个框架之所以叫"Struts",是为了提醒我们记住那些支撑我们房屋,建筑,桥梁,甚至我们踩高跷时候的基础支撑。这也是一个解释Struts在开发Web应用程序中所扮演的角色的精彩描述。当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。同样,软件工程师使用Struts为业务应用的每一层提供支持。它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。我们仍然需要学习和应用该架构,不过它将可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的优点来建立可扩展的应用,Struts是一个不错的选择。
早期Smalltalk程序语言便采用了MVC(Model-View-Controller)模式(Patterns)以增加程序代码弹性,MVC模式将程序代码整理切割为三部分,Model部分是业务与应用领域(Businessdomain)相关逻辑、管理状态之对象,Controller部分接收来自View所输入的资料并与Model部分互动,是业务流程控制(FlowControl)之处,View部分则负责展现资料、接收使用者输入资料。在Java应用中,JFC/Swing、AWT、JSP皆是可用作View的技术规格,而JavaBean与EnterpriseJavaBean规格则可用于Model程序代码,一旦应用程序以MVC模式加以适当的分割,Model部分程序代码可在不同使用者接口外观的应用程序中重复使用。
随着JSP与Servlet技术大量应用于以Web为基础的应用程序,Java开发人员群体认为应以较佳的模式以提升Web应用程序的可维护性与重复使用性。早期JSP规格书中曾列举两种可行之JSP应用架构,分别为Model1与Model2。
在Model1架构中,JSP直接处理Web浏览器送来的请求(Request),并辅以JavaBean处理应用相关逻辑。Model1架构单纯编写比较容易,但在Model1中JSP可能同时肩负View与Controller角色,两类程序代码有可能混杂而不易维护。而Model2中将Servlet纳入架构中扮演前端Controller角色,将Web浏览器送出的请求集中送至Servlet,Servlet可集中管理使用者登入、权限控制、多国语言转换等前置处理,再视需求转向给对应的JSP处理。Model2中采用了较佳的MVC模式,但增加了编写复杂度。
Struts是Apache软件基金下Jakarta项目的一部分。除Struts之外,还有其他成功的开源产品,包括Tomcat,Ant和Velocity。2000年CraigR.McClanahan先生贡献了他编写的JSPModel2架构的ApplicationFramework原始程序代码给Apache基金会,成为ApacheJakarta计划StrutsFramework前身。
开始的代码基础从2000年5月开始开发,直到2001年6月,1.0版本发布。有30多个开发者参与进来,并有数千人参与到讨论组中。Struts代码基础由一个志愿的Commnitter团队来管理。到2002年,Struts小组共有9个志愿Commnitter。
Struts框架的主要架构设计和开发者是CraigR.McClanahan。Craig也是Tomcat4的主要架构师,以及JavaWebServicesDeveloperPack的主要架构师和实现者。他是Sun(于2010年1月被oracle收购)的JavaServerFaces(JSR-127)以及J2EE平台的Web层架构的规范领导。CraigR.McClanahan先生是JCPExpertGroup成员之一,曾参与JSP规格制定与Tomcat4之编写,因此StrutsFramework广受Java开发人员群体所重视。Borland自2002年底开始于开发工具JBuilder中支持StrutsFramework。
Struts是Apache基金会Jakarta项目组的一个OpenSource项目,它采用MVC模式,能够很好地帮助java开发者利用J2EE开发Web应用。和其他的java架构一样,Struts也是面向对象设计,将MVC模式"分离显示逻辑和业务逻辑"的能力发挥得淋漓尽致。Structs框架的核心是一个弹性的控制层,基于如JavaServlets,JavaBeans,ResourceBundles与XML等标准技术,以及JakartaCommons的一些类库。Struts由一组相互协作的类(组件)、Servlet以及jsptaglib组成。基于struts构架的web应用程序基本上符合JSPModel2的设计标准,可以说是一个传统MVC设计模式的一种变化类型。
3、基础流程
服务器启动后,根据web.xml加载ActionServlet读取struts-config.xml文件内容到内存。
以登录为例:第一次进login.jsp会先实例化Form、把默认值(String默认为空字符串,整型默认为0)赋给表单元素。
输入用户名密码提交表单、提交到action属性的login.action,通过ActionServlet读struts-config.xml文件找到action下的path属性找到.action,通过name属性找form-beans中的form-bean的name属性得到ActionForm的包名类名,先实例化form,把表单的值填充给form,调用form的validate方法验证、ActionErrors返回null表示验证通过,否则失败返回input指定的页面.验证通过会实例化Action,执行Action的execute方法。
4、主要优点
Struts跟Tomcat、Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点,使开发者能更深入的了解其内部实现机制。
除此之外,Struts的优点主要集中体现在两个方面:Taglib和页面导航。Taglib是Struts的标记库,灵活运用,能大大提高开发效率。另外,就目前国内的JSP开发者而言,除了使用JSP自带的常用标记外,很少开发自己的标记,或许Struts是一个很好的起点。
关于页面导航,我认为那将是今后的一个发展方向,事实上,这样做,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤其是当另一批开发者接手这个项目时,这种优势体现得更加明显。
MVC即Model-View-Controller的缩写,是一种常用的设计模式。MVC减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化。Struts是MVC的一种实现,它将Servlet和JSP标记(属于J2EE规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。
5、框架内容
struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。
struts可以清晰地区分控制,事务逻辑和外观,从而简化了开发应用程序的过程。struts提供的类使得开发工作更加简单,这些类包括:
控制程序流程的类
实现和执行程序事务逻辑的类
自定义的标记库使得创建和验证HTML表单更加容易
6、OGNL
Struts2ognl中的#、%和$符号用法说明
#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分。在这里笔者简单介绍它们的相应用途。
1.#符号的用途一般有三种。
1)访问非根对象属性,例如示例中的#session.msg表达式,由于Struts2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext.getContext();#session.msg表达式相当于ActionContext.getContext().getSession().getAttribute(”msg”)。
2)用于过滤和投影(projecting)集合,如示例中的persons.{?#this.age>20}。
3)用来构造Map,例如示例中的#{'foo1':'bar1','foo2':'bar2'}。
2.%符号%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。如下面的代码所示:构造Map
;不使用%:
;使用%:
3.$符号$符号主要有两个方面的用途。
在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。
在Struts2框架的配置文件中引用OGNL表达式,例如下面的代码片断所示:
7、Struts2
Struts2是Struts的下一代产品。是在struts和WebWork的技术基础上进行了合并,全新的Struts2框架。其全新的Struts2的体系结构与Struts1的体系结构的差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。因为Struts2和Struts1有着太大的变化,但是相对于WebWork,Struts2只有很小的变化。具体请参考百度百科Struts2。
2013年7月17日ApacheStruts2高危漏洞,影响到Struts2.0.0-Struts2.3.15的所有版本。包括国内很多知名网站在内的大量网站受到此漏洞不同程度的影响。攻击者可以利用该漏洞执行恶意java代码,最终导致网站数据被窃取、网页被篡改等严重后果,使网站及网民安全受到了极大的威胁。使用WEB服务器其中的kangle,apache表示没任何问题,Nginx受影响,用Nginx的用户注意及时修复此问题,否则可能导致服务器被入侵。
推荐阅读