struts1 与 struts2的对比。
action类:
struts1要求action类继承一个抽象类。所以说struts1使用抽象类编程而不是接口。
struts2 action类可以实现一个action接口,也可以实现其他接口,struts2提供了一个actionSupport基类去实现常用的接口。action接口不是必须的,任何有execute标识的pojo对象都可以作为struts对象。
线程模式:
struts1 action是单例模式并且必须线程安全 因为仅有action的一个实例来处理所有的请求,单例策略限制了struts1 action能做的事,并且在开发时特别小心。action资源是线程安全和或同步的。
struts2 action对象为每一个请求产生一个实例,因此没有线程安全问题(servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
servlet 依赖:
struts1 action依赖于servletApi , 因为一个action被调用的时候 HttpServletRequest和HttpServletResponse被传递给execute方法
struts2 action不依赖于容器,允许action脱离容器单独被测试。如果需要 action仍然可以访问舒适的request和response。但是其他的元素减少或者消除直接这两个对象的必要性。(额。。?奇怪的说,消除了直接访问的必要性?记得每次对前台传过来的参数信息进行转码的时候就要定义HttpRequestSponse进行转码呀- -。有啥方法不需要用么。)
可测性:
测试struts1 action的一个主要问题是execute方法暴漏了servletApi 所以要依赖servletAPI
struts2 action可以通过初始化 设置属性 使用方法来测试。而且依赖注入的支持也使测试更容易方便
捕获输入:
struts1 使用actionForm对象捕获输入,所有的actionform必须继承一个基类.因为其他javaBean不能用作actionForm,貌似是说struts1也可以动态设置Bean但是这样会创建已经存在的javaBean.
struts2 直接使用Action属性作为输入属性.消除了对第二个输入对象的需求.这个灰常方便的说.struts2也支持actionform模式.rich对象类型.
表达式语言:
struts1 整合了jstl,因此使用jstl el。但是对集合跟索引属性的支持很弱。
struts2可以使用jstl,同时支持一个更强大和灵活的表达式语言。(OGNL 关于该el标签,很好的例子:http://www.iteye.com/topic/646851)
Action执行的控制:
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用
关于struts1/2的流程:
struts1本质上其实就是一个servlet+jsp+自定义tag+javaBean 核心控制器就是一个servlet
流程:
服务器启动容器将actionServlet装载进虚拟机并实例化--->调用init()方法--->初始化页面的国际化以及额外配置---->初始化ActionServlet 是通过用digester去解析web.xml并把web.xml里面的属性封装成java对象 并封装到ActionServlet.
web.xml(用流) ActionServlet
| |
| |
parse(input)<-----------digester--------->push(object)
| |
| |
xml------------------------------------>java object然后初始化链(initChain):首先检查用户有没有在web.xml配置chainConfig,如果没有就用默认的
org.apache.struts.chain.chain-config.xml文件,然后用digester去解析这个文件。并初始化struts1的处理类。
接着就是初始化moduleConfig:主要是用digester去解析struts-config.xml文件,并把这个文件里面的一些属性一Java 对象的形式封装到ModuleConfig。然后初始化 initModuleMessageResources(moduleConfig);
initModulePlugIns(moduleConfig);
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
Struts2的核心是拦截器,而且是面向切面思想实现(AOP)
struts2的核心控制器本质是个过滤器,所以要遵循servlet的规范。当web服务器加载的时候 调用web.xml配置的struts2的过滤器的init方法,在init方法中创建daspatcher对象
然后Daspatcher调用自己的init方法。然后正式开始struts真正的初始化、struts为每个配置文件都提供一个处理类。(属性文件有属性文件的处理类,xml文件有xml文件的处理类,客户配置的文件也有客户配置文件的处理类)
这也体现了struts2的多线程处理机制以及策略模式
然后把这些处理类全部封装到configurationManager中。创建一个容器,把Daspatcher注入容器中。
进入doFilter方法
首先设计编码,默认为UTF-8(因为UTF-8是国际通用的)所以在用struts2写项目的时候不需要转码。接着创建一个ActionContext(首先构造一个ValueStack其实是OgnlValueStack,然后将request、session、ServletContext等用相应的map集合封装起来,然后把这些封装的map对象用另一个map封装,这样就达到了与servlet的解耦,接着声明一个attr map集合,将request、session、servletContext所相应的map集合封装起来,这就是为什么attr的map可以实现在request、session、application中轮询值的原因。最后将attr的map集合放进那个上面另一个map中,再把这个map放到ActionContext中)。再创建一个ActionMapping,它是通过ActionMapper来指定的。(ActionMapper是用来决定是不是要调用一个Action来处理这个请求)。再接着创建ActionProxy(ActionProxy通过ConfigurationManager询问框架的配置的文件找到需要调用的Action类)接着创建AcitonInvocation实例,同时ActionInvocation通过代理模式调用Action,在调用Aciton之前根据配置加载Action相关的所以Interceptor(把这些拦截器以栈的形式,进行调用),最后返回结果result.
最后补充一个对servler的理解:
简单的说,servlet就JAVA处理WEB请求的一种机制。可以担当客户请求与服务器响应的中间层。server是位于web服务器内部的服务器端的java应用程序。
servlet工作模式:
客户发送请求到服务器-->服务器启动并调用servlet servlet根据客户端请求生成响应内容并传给服务器-->服务器响应返回客户端
action类:
struts1要求action类继承一个抽象类。所以说struts1使用抽象类编程而不是接口。
struts2 action类可以实现一个action接口,也可以实现其他接口,struts2提供了一个actionSupport基类去实现常用的接口。action接口不是必须的,任何有execute标识的pojo对象都可以作为struts对象。
线程模式:
struts1 action是单例模式并且必须线程安全 因为仅有action的一个实例来处理所有的请求,单例策略限制了struts1 action能做的事,并且在开发时特别小心。action资源是线程安全和或同步的。
struts2 action对象为每一个请求产生一个实例,因此没有线程安全问题(servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
servlet 依赖:
struts1 action依赖于servletApi , 因为一个action被调用的时候 HttpServletRequest和HttpServletResponse被传递给execute方法
struts2 action不依赖于容器,允许action脱离容器单独被测试。如果需要 action仍然可以访问舒适的request和response。但是其他的元素减少或者消除直接这两个对象的必要性。(额。。?奇怪的说,消除了直接访问的必要性?记得每次对前台传过来的参数信息进行转码的时候就要定义HttpRequestSponse进行转码呀- -。有啥方法不需要用么。)
可测性:
测试struts1 action的一个主要问题是execute方法暴漏了servletApi 所以要依赖servletAPI
struts2 action可以通过初始化 设置属性 使用方法来测试。而且依赖注入的支持也使测试更容易方便
捕获输入:
struts1 使用actionForm对象捕获输入,所有的actionform必须继承一个基类.因为其他javaBean不能用作actionForm,貌似是说struts1也可以动态设置Bean但是这样会创建已经存在的javaBean.
struts2 直接使用Action属性作为输入属性.消除了对第二个输入对象的需求.这个灰常方便的说.struts2也支持actionform模式.rich对象类型.
表达式语言:
struts1 整合了jstl,因此使用jstl el。但是对集合跟索引属性的支持很弱。
struts2可以使用jstl,同时支持一个更强大和灵活的表达式语言。(OGNL 关于该el标签,很好的例子:http://www.iteye.com/topic/646851)
Action执行的控制:
Struts1支持每一个模块有单独的Request Processors(生命周期),但是模块中的所有Action必须共享相同的生命周期。
Struts2支持通过拦截器堆栈(Interceptor Stacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用
关于struts1/2的流程:
struts1本质上其实就是一个servlet+jsp+自定义tag+javaBean 核心控制器就是一个servlet
流程:
服务器启动容器将actionServlet装载进虚拟机并实例化--->调用init()方法--->初始化页面的国际化以及额外配置---->初始化ActionServlet 是通过用digester去解析web.xml并把web.xml里面的属性封装成java对象 并封装到ActionServlet.
web.xml(用流) ActionServlet
| |
| |
parse(input)<-----------digester--------->push(object)
| |
| |
xml------------------------------------>java object然后初始化链(initChain):首先检查用户有没有在web.xml配置chainConfig,如果没有就用默认的
org.apache.struts.chain.chain-config.xml文件,然后用digester去解析这个文件。并初始化struts1的处理类。
接着就是初始化moduleConfig:主要是用digester去解析struts-config.xml文件,并把这个文件里面的一些属性一Java 对象的形式封装到ModuleConfig。然后初始化 initModuleMessageResources(moduleConfig);
initModulePlugIns(moduleConfig);
initModuleFormBeans(moduleConfig);
initModuleForwards(moduleConfig);
initModuleExceptionConfigs(moduleConfig);
initModuleActions(moduleConfig);
Struts2的核心是拦截器,而且是面向切面思想实现(AOP)
struts2的核心控制器本质是个过滤器,所以要遵循servlet的规范。当web服务器加载的时候 调用web.xml配置的struts2的过滤器的init方法,在init方法中创建daspatcher对象
然后Daspatcher调用自己的init方法。然后正式开始struts真正的初始化、struts为每个配置文件都提供一个处理类。(属性文件有属性文件的处理类,xml文件有xml文件的处理类,客户配置的文件也有客户配置文件的处理类)
这也体现了struts2的多线程处理机制以及策略模式
然后把这些处理类全部封装到configurationManager中。创建一个容器,把Daspatcher注入容器中。
进入doFilter方法
首先设计编码,默认为UTF-8(因为UTF-8是国际通用的)所以在用struts2写项目的时候不需要转码。接着创建一个ActionContext(首先构造一个ValueStack其实是OgnlValueStack,然后将request、session、ServletContext等用相应的map集合封装起来,然后把这些封装的map对象用另一个map封装,这样就达到了与servlet的解耦,接着声明一个attr map集合,将request、session、servletContext所相应的map集合封装起来,这就是为什么attr的map可以实现在request、session、application中轮询值的原因。最后将attr的map集合放进那个上面另一个map中,再把这个map放到ActionContext中)。再创建一个ActionMapping,它是通过ActionMapper来指定的。(ActionMapper是用来决定是不是要调用一个Action来处理这个请求)。再接着创建ActionProxy(ActionProxy通过ConfigurationManager询问框架的配置的文件找到需要调用的Action类)接着创建AcitonInvocation实例,同时ActionInvocation通过代理模式调用Action,在调用Aciton之前根据配置加载Action相关的所以Interceptor(把这些拦截器以栈的形式,进行调用),最后返回结果result.
最后补充一个对servler的理解:
简单的说,servlet就JAVA处理WEB请求的一种机制。可以担当客户请求与服务器响应的中间层。server是位于web服务器内部的服务器端的java应用程序。
servlet工作模式:
客户发送请求到服务器-->服务器启动并调用servlet servlet根据客户端请求生成响应内容并传给服务器-->服务器响应返回客户端
发表评论
-
manven构建spring+springmvc+mybaitis框架
2016-04-23 22:51 0最近要离职了,闲暇的时候想自己构建个项目,说干就干。 具体 ... -
有个内存溢出的问题请教啊!
2015-08-18 16:58 975public Map<String, Object ... -
六年JAVA兼职
2014-10-10 14:08 355我叫刘洋,JAVA开发做了六年多了,大大小小的项目做过很多 ... -
新手搭车maven
2014-04-29 15:50 59最近工作太繁忙,一直没有时间来充电。 偶然的一个机会 ... -
关于DB2日常使用中遇到的问题
2013-07-30 10:07 8421 经常需要用到在不drop表的前提下去修改表字段的数据 ... -
我还年轻,我渴望上路.
2012-12-02 09:19 72不知不觉快工作两年多了,最近玩的也比较多,是时候放下玩的心了, ... -
ijetty的应用开发
2012-11-30 16:29 3188最近使用ijetty开发了一 ... -
求助一个关于公式编辑器插件的问题。
2012-08-09 11:27 74附件是一个网页可用的公式编辑器插件。 总体上很符合我想找的 ... -
关于java优化的东东
2012-07-17 11:33 949最近的机器内存又爆满了,除了新增机器内存外,还应该好好revi ... -
struts2国际化文件配置
2012-07-16 14:51 12629struts2的国际化分三种情况:前台页面的国际化,Act ... -
web.xml常用标签命令详解
2012-06-13 14:14 5353web.xml文件是用来初始化配置信息:比如welcome页面 ... -
关于常用的一些linux下命令
2012-06-12 17:14 8971,linux 创建文件 mkdir XXX 创建目录 ... -
做java开发的困惑
2012-06-05 20:23 1024从事java开发也快两年了。 忽然很迷茫了。 也发现越来越 ... -
开发中用到过的UTIL类
2012-06-01 14:58 24171,加密的Util类 /* ============= ... -
build的那些东西
2012-05-30 16:01 1138<?xml version="1.0" ... -
项目数据库执行
2012-04-19 15:44 1380DBtool.java package com.zte ... -
HTTPClient发送请求的几种实现
2012-04-01 17:21 139341,可以使用最基本的流对象 URL对象直接将请求封装 然后发送 ... -
静态页面拖拽实现代码
2012-04-01 17:18 1056静态拖拽行: <html> ...
相关推荐
Struts2是一款强大的Java web开发框架,用于构建可维护、高性能的企业级应用程序。它基于Model-View-Controller(MVC)设计模式,提供了一种结构化的应用开发方式,简化了从前端到后端的交互流程。这个“Struts2详细...
1. **Struts2框架**:Struts2是基于Apache Jakarta Struts的下一代Struts,它继承了Struts1的优点,并引入了更多现代Web开发的需求。它提供了拦截器、插件、结果类型等机制,使得动作类和业务逻辑的分离更加清晰。 ...
Struts2是MVC(模型-视图-控制器)架构模式的一个强大实现,它在Struts1的基础上进行了改进,提供了更灵活的控制流程和丰富的插件生态系统。Struts2的核心特性包括拦截器、模板引擎和强大的动作调度,这些使得开发者...
此压缩包中的"Struts1.3.10.chm"文件则包含了Struts1的API文档,尽管Struts2已经较为流行,但Struts1在一些老项目中仍有应用,其API文档对于维护这些项目仍然有价值。Struts1强调MVC模式,通过ActionServlet来控制...
轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发 part3 李刚
轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发 李刚
轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发 李刚 part2
StrutsAPI 1.2
轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发 part4 李刚
轻量级Java EE企业应用实战(第3版):Struts 2+Spring 3+Hibernate整合开发 part5 李刚
虽然照片最后会存入到自己的电脑里,但是时间一长、照片一多,这些有着勾起回忆的“资料”,就会显得杂乱无章,即不方便欣赏,也不方便管理。而电子相册具有欣赏、传播方便,界面美观等特点,可以很好的管理所存入的...
个人相册,管理保存自己的珍贵照片,留下美好回忆; 账目理财,个人理财工具,包括总收支统计、各项收入统计、日常开支统计; 文档管理,保存管理一些个人文档;">Anynote是一个基于extjs、struts、spring、ibatis...
1. 技术要求:利用 Struts2、Hibernate、Spring 技术进行设计和开发,要求提供详细的设计报告和源代码。 2. 设计报告:要求提供详细的设计报告,包括设计思想、功能划分、体系结构、类等有关的包结构,设计中遇到的...
2. 技术背景:Java语言与SSH框架(Struts、Spring、Hibernate)的结合,以及MySQL数据库的应用,为构建高效、稳定的网络应用提供了可能。 三、系统技术选型 1. Java与JSP:作为后台开发语言,Java具有良好的可移植...
1. 电子相册系统的概念与需求:随着生活水平的提高,人们通过旅行和摄影来放松,照片成为记录和回忆生活的重要方式。传统的图片存储在个人电脑中,容易造成管理上的混乱,不易于欣赏和管理。电子相册系统提供了便捷...
虽然照片最后会存入到自己的电脑里,但是时间一长、照片一多,这些有着勾起回忆的“资料”,就会显得杂乱无章,即不方便欣赏,也不方便管理。而电子相册具有欣赏、传播方便,界面美观等特点,可以很好的管理所存入的...
5. 工作能力及其他专长:包括J2SE、J2EE、Web 编程、Jsp、Servlet、EL、jstl、xml、JDBC、Hibernate、spring、struts1 和 2、Lucene、Html、DIV/CSS、JavaScript、jQuery、json、ajax、DWR、MVC、DAO、IOC、AOP 等...
虽然照片最后会存入到自己的电脑里,但是时间一长、照片一多,这些有着勾起回忆的“资料”,就会显得杂乱无章,即不方便欣赏,也不方便管理。而电子相册具有欣赏、传播方便,界面美观等特点,可以很好的管理所存入的...
虽然照片最后会存入到自己的电脑里,但是时间一长、照片一多,这些有着勾起回忆的“资料”,就会显得杂乱无章,即不方便欣赏,也不方便管理。而电子相册具有欣赏、传播方便,界面美观等特点,可以很好的管理所存入的...