strust2比起struts1,有哪些好处?

作者&投稿:闳满 (若有异议请与网页底部的电邮联系)
struts2比Strust1有什么优势~

struts1
2001年6月发布struts1
struts1的核心是控制器,由两部分组成:核心控制器和业务逻辑控制器,核心控制器是ActionServlet,由struts1提供;业务逻辑控制是用户自定义的action,由应用开发者提供。
整个应用由客户端请求驱动,客户端向web发送的请求被struts1的核心控制器ActionServlet拦截,ActionServlet根据请求决定是否调用业务逻辑控制器处理用户请求(事实上,业务逻辑控制器还是控制器,它只是负责调用模型来处理用户请求),当用户请求处理完后,其处理结果通过jsp呈现给用户。
如果用户只是希望得到某个url资源,得有ActionServlet将被请求的资源转发给用户。

struts1中的mvc:
1)struts1的model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库访问、业务逻辑方法实现。对于一个成熟的企业应用而言,model部分不是一个简单的javabean所能完成的。总之,model部分封装了整个应用的所有业务逻辑,但整个部分并不是struts1提供的,struts1也没有为实现model组件提供任何支持。
2)struts1的view部分采用jsp实现。提供了标签库,能减少脚本的使用。标签库可以输出控制器的处理结果。
但struts1锁支持的表现层技术非常单一:既不支持FreeMarker、Velocity等模版技术,也不支持JasperReports等报表技术
3)struts1的核心控制器ActionServlet继承HttpServlet类,因此可配置为标准的servlet,负责拦截所有的http请求
业务逻辑控制器负责处理用户请求,但其自身并不具有处理能力,而是调用model来处理请求
不得不佩服struts1设计者高度解耦的设计:控制器并没有直接转发请求,而仅仅返回一个ActionForward对象(可理解为逻辑视图名)--实际的转发放在配置文件struts-config.xml中进行管理,配置文件中定义了逻辑视图名与视图资源之间的对应关系。当ActionServlet得到处理器返回的ActionForward对象后,根据对应关系,将视图资源呈现给用户。

struts1的种种缺陷:
1)支持的表现层技术单一
struts1只支持jsp作为表现层技术,不提供表现层技术的整合。出现年代太早,当时还没有出现FreeMarker、Velocity等技术
2)与servlet API严重耦合,难于测试
因为struts1是在model2的基础上发展起来的,因此它完全是基于Servlet API的,所以在struts1的业务逻辑控制器内,充满了大量的servlet API
action中的参数,通常web容器负责初始化,HttpServletRequest和HttpServletResponse都是servlet API,严重依赖web服务器,因此,一旦脱离web容器,测试action非常困难。
Action代码片段:
Java代码
//业务逻辑控制器必须继承struts1的Action类
public class LoginAction extends Action
{
//处理用户请求的execute方法
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws
AuctionException
{
//获取封装用户请求参数的ActionForm对象
//将其强制转换为登陆用的ActionForm
LoginForm loginForm = (LoginForm)form;
//当用户名为scott,密码为tiger时,返回成功
if ("scott".equals(loginForm.getUsername()
&& "tiger".equals(loginForm.getPassword())
{
//处理成功,返回一个ActionForward对象
return mapping.findForward("success");
}
else
{
//处理失败,返回一个ActionForward对象
return mapping.findForward("false");
}
}
}


3)代码严重依赖struts1 API,属于侵入式设计
struts1的action类必须继承struts1的action基类,实现处理方法时,又包含了大量的struts1 API:ActionMapping、ActionForm、ActionForward。
这种侵入式设计的最大弱点在于,一旦系统需要重构,这些action类将完全没有利用价值,成为废品。
可见,struts1的action类的这种侵入式设计 导致了较低的代码复用。

struts2
2006年

struts2的大致处理流程如下:
1)浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf
2)核心控制器FilterDispatcher根据请求决定调用合适的Action
3)webwork的拦截器链自动对请求应用通用功能,例如:workfolw、validation或文件上传等功能
4)回调Action的execute方法,该execute方法先获取用户请求参数。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求
5)Action的execute方法处理结果信息将被输出到浏览器中,此时支持的视图技术非常多。


struts2的配置文件有两份:
1)配置Action的struts.xml文件
2)配置struts2全局属性的struts.properties
定义action的处理结果时,可以指定多个result,result元素指定execute方法返回值和试图资源之间的映射关系。
Welcome
定义result元素时,可以指定两个属性:type和name,其中name指定execute方法返回的字符串,type指定转向的资源类型,可以是jsp,也可以是freemarker等,甚至是另一个action,这也是struts2可以支持多种视图技术的原因。

struts2的控制器组件:
所有的MVC框架都是以控制器组件为核心,struts2的控制器有两部分组成:FilterDispatcher和业务控制器Action。
实际上,struts2中起作用的业务控制器不是用户定义的Action,而是系统生成的Action代理,但该Action代理以用户定义的Action为目标。
通过查看action代码发现,struts2的action比webwork的action更彻底,该action无需实现任何父接口,无需实现任何struts2基类,该action完全是一个POJO(普通、传统的java对象),具有很好的复用性。
归纳起来,struts2的action具有如下优势:
1)action类完全是一个pojo,因此具有很好的代码复用性;
2)action类无需与servlet API耦合,因此进行单元测试非常简单
3)action类的execute方法就仅返回一个字符串作为处理结果,该处理结果可映射到任何的结果,甚至是另一个action

-------------------------
struts1和struts2的简要对比:
1)action实现类方面的对比:struts1要求action类继承一个抽象基类,是使用抽象类编程而不是接口;struts2 action类可以实现一个action接口,也可以实现其他接口,使可选和定制的服务成为可能。struts2提供一个ActionSupport基类去实现常用的接口。但即使是这个action接口也不是必须实现的,只要是一个包含execute方法的pojo类,都可以用作struts2的action。
2)线程模版方面的对比:struts1 action是单例模式并且必须是线程安全的,因为仅有action的一个实例来处理所有请求。单例策略限制了struts1 action能做的事,并且要在开发式特别小心。action资源必须是线程安全的;struts2 action为每一个请求产生一个实例,因此没有线程安全问题。
3)servlet依赖方面的对比:struts1 action依赖servlet API;struts2 action不在依赖于servlet api,从而允许action脱离web容器运行,降低测试难度。
4)可测性方面的对比:struts1 action的容器,脱离web容器测试struts1 action需要借助于第三方扩展 struts testcase;struts2 action可通过初始化,设置属性,调用方法来测试。
5)封装请求参数的对比
6)表达式语言方面的对比:struts1 整合了JSTL ,struts2也可以使用JSTL,而且整合了一种更强大和灵活的表达式语言:OGNL
7)绑定值到视图的对比:struts1使用标准JSP机制把对象绑定到视图页面;struts2使用“ValueStack”技术,使标签库能访问值,而不需要把对象和视图页面绑定到一起。
8)类型转换的对比:Stuts1的actionForm的属性通常都是String类型,struts1使用comments-beanutils进行类型转换,每个类一个转换器,转换器是不可配置的;struts2使用OGNL进行类型转换,支持基本数据类型和常用对象之间的转换。
9)数据校验对比:struts1支持在actionFrom重写validate方法中手动校验,或者通过整合Commons alidator框架来完成数据校验。struts2支持重写validate方法进行校验,也支持整合xwork校验框架进行校验。
10)action执行控制的对比:struts1支持为每个模块对应一个请求(即生命周期的概念),但模块中的所有action必须共享相同的生命周期。struts2支持通过连接器堆栈(Interceptor Stacks)为每个action创建不同的生命周期。

1.没有了form Bean,视图层通过OGNL语法直接获取Bean值,这个不是一般的方便啊2.官方有支持Spring IOC的默认配置3.自带的拦截器(Interceptor)把一些通用的业务逻辑比如输入校验、类型转换和参数获取等独立出来,Action中更专注具体业务。也可以自己扩展和配置使用拦截器,比如我就通过拦截器实现了登录信息获取、IP限制、权限验证等功能。4.标签库很强大,但不知道和struts1相比如何。struts2有点不爽的是去掉了webwork2里面的日期控件(jscalendar),改用了一个datetimepicker的标签,那个控件不是一般的烂。5.和webwork2相比,struts2里面action的配置文件结构更合理一些。

一、struts1要求Action类继承一个抽象基类,而不是接口。

struts2的action类可以实现一个action接口,也可以实现其他接口。

二、sturts1 action是单例模式,线程是不安全的。

struts2 action线程是安全的,action为每一个请求都生成了一个实例。

三、sturts1过去依赖serlet API,不容易测试。

struts2不依赖于容器,允许Action脱离容器单独被测试。

四、Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。

Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。

五、Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。

Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--"Object Graph Notation
Language" (OGNL).

六、Struts 1使用标准JSP机制把对象绑定到页面中来访问。

Struts 2 使用 "ValueStack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。

七、Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。

Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。

八、Struts 1支持在ActionForm的validate方法中手动校验,或者通过Commons Validator的扩展来校验。

Struts2支持通过validate方法和XWork校验框架来进行校验。

九、Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。

Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

strust2直接调用action,还可以添加拦截器。


strust2中,结果类型为json ,那对应Action中的方法的return 值是什么...
这是jar包版本问题了 .JSONResult想要使用一个方法, 但是对方的Class没有提供这个方法 首先你找找有没有jar包冲突, 就是引入了两个一样的jar, 但是版本不同, 先把低版本的jar删除.

关于easyui的..就是map在strust2转json之后怎么把数据加载的下拉框中...
从哪里抄的?param里的root下的menu是个啥玩意。你要是想用result来返回数据,用json-lib的插件,struts2的jar包里有。最简单的方法其实使用response.write(),直接把json返回给前台,不用插件,还容易理解。combobox的valueField和textField的值是根据你的json来写的,不是瞎写的。返回的json截个图 ...

strust2的控制跳转核心部件是什么
1、Struts 2的基本流程 Struts 2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。

strust2中配置了自定义的拦截器后,出现一下错误
interceptor少写了一行,不管你自己写了多少个拦截器,首先必须应用他默认的拦截器。default

struts2 怎么使用checkbox和checkboxlist
后台strust2的action程序:Override publicStringload()throwsException{ log.debug("startingretrieve...");try{ if(testid==null){ sex=true;interests=newString[]{"lanqiu","zuqiu"};returnINPUT;}else{ \/\/修改的时候,在程序中处理 test=testServiceDao.loadById(testid);if(true){\/\/自己来...

myeclipse控制台不显示Strust2 的错误信息,是怎么回事?
1、可能你没有配置日志操作 2、增加一个日志或者拦截器等配置试试。

strust2 通过 属性赋予值,action 想获得list 对象集合,怎么获取_百度...
感觉你没太说清楚你的意思,我的理解是你想在action里面直接获取一个list对象,这个对象可以是从调用这个action的前端,或者接口调用出传来的list对象,也可能是service处理完业务逻辑返回的结果中的list对象,其实都是一样的,最合理的方法呢就是你分装一个解析成你想要的list方法,将整个list作为一个对象...

Strut2的配置文件strust.xml报错:Package Action extends undefined p...
没有网线的情况下.才会出现这种警告.而且会不断的在你往下写的标签里出现黄线 我就在MyEclipse8.6以及9.0 M2试过了! <!DOCTYPE struts PUBLIC "-\/\/Apache Software Foundation\/\/DTD Struts Configuration 2.7\/\/EN" "http:\/\/struts.apache.org\/dtds\/struts-2.7.dtd"> 在myeclipse中->win...

strust2和struts有什么区别
来支持chain校验子属性 Action执行的控制:? Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。? Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。

在strust2 中我想单独再写个struts-a.xml,只要在struts.xml中写incl...
在web.xml文件中整合spring需要配置一个contextConfigLocation,这个指的就是spring配置文件的路径,你可以按照下面这样配置,意思就是从WEB-INF\/classes\/spring目录下加载后缀为xml的文件为spring的配置文件 <context-param> <param-name>contextConfigLocation<\/param-name> <param-value>classpath*:sp...

盐源县15028803170: struts2比Strust1有什么优势
烛转小儿: 我就简单谈谈的看法吧 1:struts1的核心是个servlet ,与servlet API严重耦合,难于测试,而且还是单例,就造成了一定的限制.资源必须为线程安全或者同步 而struts2的核心是个过滤器,为每一个请求实例化一个对象,所以没有线程安全的问题...

盐源县15028803170: struts1 和 struts2的区别 -
烛转小儿: struts1和struts2 是2个完全不同的框架,其实struts2核心就是 webwork框架 struts1以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求.Struts 1框架有3个重要组成部分:Action、ActionForm和ActionForward对象....

盐源县15028803170: Struts1和Struts2的区别和对比 -
烛转小儿: 你问的应该是struts1和struts2的区别:Struts2与Struts1的对比1,在Action实现类方面:Struts1要求Action类继承一个抽象基类;Struts1的一个具体问题是使用抽象类编程而不是接口.Struts2Action类可以实现一个Action接口,也可以实现其他接...

盐源县15028803170: struts2为什么是线程安全的?和struts1有什么区别? -
烛转小儿: struts2是在 struts 和WebWork的技术基础上进行了合并,全新的Struts 2框架.至于为什么是线程安全的,从线程不安全到线程安全有好多事情要做,一两句话说不清楚.只能说struts2把线程安全作为其实现的一个基本目标来做的.

盐源县15028803170: Struts1和Struts2哪个更好?Struts2有取代1的趋势吗? -
烛转小儿: 别听楼上的几位糊扯,struts2与struts1可以说是两种不同的框架,struts2的核心是继承与webwork这个框架,struts2解决了Action类对servlet api的依赖,Acion类只要是简单的pojo类,易于测试.struts1对servlet api依赖. 可以说struts 2与struts 1不是简单的升级,而是两种不同的框架,从理论上来说,struts2实现mvc比较干净,不依赖于容器. 按现实情况,仍是struts1用的比较多,struts2国内还是处于推广阶段.

盐源县15028803170: 说一下strut1和struts2的区别 -
烛转小儿: Struts2与Struts1相比:Struts1需要继承一个基类,而Struts2却可以实现多个接口,灵活性要大;Struts1是单线程的,因为只有一个Action实例来处理请求,而Struts2是多线程的;Struts1严重与Servlet API耦合,简单说就是execute方法...

盐源县15028803170: struts2 吸收了strut1的什么优点? -
烛转小儿: 与传统的struts1相比,struts2允许使用普通的、传统的java对象作为Action;Action的execute()方法不再与Servlet API耦合,因而更易测试;支持更多的普通视图;基于AOP思想的拦截器机制,提供了更好的可扩展性;更强大、更易用的输入校验功能.另外,struts2还整合了Ajex支持.

盐源县15028803170: hibernate和strust整合有什么区?spring、hi
烛转小儿: 区别不大,最主要的区别是,struts比struts2有名,只不过现在开发新项目大多采用struts2,而struts1主要在一些老项目上出现.三个框架的整合,其实都是由spring来管理的,hibernate的与其他框架的关联最为简单,主要是Struts与spring的关联,struts由于当年非常的风靡,所以整合的包是spring提供的,是spring这一方去关联struts的,而现在的strtus2的地位不如当年的struts,所以在与spring整合时,提供包的是struts2这一方.大致原理就这么回事,具体的包与配置我就不多讲了.

盐源县15028803170: java中Struts1和Struts2有什么区别 ?
烛转小儿: 一个是1 ,一个是2,这是最大的区别,技术方面,1有个核心控制器,但是只提供了一个接口,也就是execute,还要配置什么actionform之类的,反正很麻烦,所以依赖性比较强,2是针对拦截器开发的,也就是所谓的AOP思想,可以配置多个action,用起来比较方便,但是因为请求之前的拦截器有一些注入的操作,速度相对1来说慢一点.... 楼主采纳吧!!!!

盐源县15028803170: struts1与struts2的区别 -
烛转小儿: Struts 1是由Apache组织开发的 Struts 2是在Webwork(OpenSymphony组织开发的)的基础上开发的,但是因为Webwork的名气不如Struts,所以就命名为:Struts 2.可是Struts 2实际上用的是Webwork技术,不过也在其中溶入了Struts的部分技术

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网