Webwork Vs Struts杂谈

Webwork2的每个Action都是线程安全的。因为每过来一个request,它就创建一个Action对象。由于现代JDK垃圾收集功能的效率已经不成问题,所以这种创建完一个对象就扔掉的模式也得到了好多人的认可。Rod Johnson甚至以此为例证明J2EE提供的object pool功能是没多大价值的。
Struts 创建的是 Action 的单一实例,并允许多个线程调用它的 execute()。这使请求处理变得更快,因为框架处理每个请求时不用频繁地创建新的 Action 实例。但是因为可以在多个线程之间共享单一对象,所以必须遵守适当的线程注意事项,因为其他线程可能会破坏在这个动作中保持状态的实例变量。
Struts的设计者Craig R. McClanahan曾经说当时他设计struts时有两个条件不成熟:当时没有测试驱动开发的概念;当时JVM的垃圾收集性能太次。假如现在重新设计的话,他也会采用每个request生成一个新对象的设计方法,这样可以解决掉线程安全的问题了。
然而仔细跟Spring比较一下,我们就会发现这两点功能所带来的好处其实并不象我们想象的那么显著。Spring的Controller类也可以非常轻松被测试,看一下spring-mock下面的包吧,它提供的MockHttpServletRequest, MockHttpServletResponse还有其它一些类让测试Controller变得异常轻松。再看一下Action里的业务逻辑吧,Jason Carreira曾经说我们可以尽情地在Webwork2的Action里加业务逻辑,因为Action是不依赖于Web的。但是有多少人真正往Action里加业务逻辑的?大多数人都会业务逻辑delegate给另一个Service类或Manager类。因为我们很清楚,往Action里加业务逻辑会使整个体系的分层架构变得不清晰,不管怎样,Web层就是Web层,业务层就是业务层,两者的逻辑混在一起总会带来问题的。而且往Action里加业务逻辑会使用这个Action类变得庞大,Webwork2的Action是每个request都创建实例的,尽管带来的性能影响不太大,但并不表示每次都要把业务逻辑再new出来,业务逻辑在大多数的情况下应该是单例的。
回头看一下struts,它在架构里甚至没有给我们提供hook point的机会,我们没有任何机会加入自己的interceptor.我们只能通过重载struts的RequestProcessor类来进行一点有限的扩展。

到了Webwork2,似乎interceptor一下子成了整个Framework的核心,除了Action的核心部件,其它所有的东西都是interceptor.它的超强的interceptor功能使们扩展整个架构变得非常方便。有人称这种interceptor为AOP,Jason Carreira则自豪地宣称这个叫做pragamtic AOP.我不认同这是AOP,它只是简单的interceptor机制。但不管如何,它的interceptor确实有强大的功能。

Spring也提供了它的interceptor机制,它的HandlerInterceptor三个interceptor方法:peHandle, postHandle, afterCompletion.分别对应Controller执行前,Controller执行后和page render之后。虽然大多数情况下已经够用,但是从功能上来说显然它没有Webwork2强大。从AOP的角度来看,它没有提供around interceptor,而只有before与after interceptor.这意味着我们无法在interceptor前后保持状态.

这篇非原创,但也不某个具体作者写的,是我收集的多篇资料整理而成的,版权都属于原作者
Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException Error: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 176 actions: event_logs: 500 times, at org.apache.hadoop.hbase.client.AsyncProcessBatchErrors.makeException(AsyncProcess.java:192)atorg.apache.hadoop.hbase.client.AsyncProce 阅读详情

相关推荐

好聪明的小狗啊!都快会编程了!

我朋友养着一条小狗,非常聪明,每天,我的朋友会按时给它几块奶油饼干;可是有一天,恰好没饼干了,而我朋友又懒的去买,小狗就抗议了 一直冲我朋友叫,小狗叫了一会,发现主人真的没吃的了,就去它的窝了,一会叼着2块饼干回来了,放到我朋友面前,那意思是说 :幸亏我还有剩余的,分你2快吧,怎么样,小狗聪明吧...

爱我中华之笔耕不缀! 362

大数据HBase分布式部署之【二】:zookeeper-3.4.9安装配置!

近期逐渐接触大数据,开始分布式部署HBase,本文描述zookeeper3.4.9 stable 版集群部署过程,重点描述遇到的问题。     在下安装过程中借鉴了此两篇文章,奉上链接:     1.Hadoop2.7.1+Hbase1.2.1集群环境搭建(4)hbase安装准备         http://aperise.iteye.com/blog/2254451     2. 

爱我中华之笔耕不缀! 556

从Hive导入数据到HBase时错误:RetriesExhaustedWithDetailsException

第一个错误: Error during job, obtaining debugging information... 原因是Javaf堆内存不足,可以修改为本地模式: set hive.exec.mode.local.auto=true; 第二个错误: org.apache.hadoop.hive.ql.metadata.HiveException: org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException Failed

qq_43012693的博客 2084

JavaAPI访问HBase出现org.apache.hadoop.hbase.client.RetriesExhaustedException

在win7环境中测试JavaApi访问HBASE1.2.6,依赖如下:<!-- hhbase-client --> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <versio...

chy2z的专栏 3279

发烧了,头晕,竟然往数值列里插Null值!

发烧好几天了,头晕的厉害,操作数据库时竟然把产品表里的价格列(double)全部替换成了null值,555555555,惨啊,这样将必然导致cglib发生错误啊,因为我的pojo里用的是private double price,然后用hibernate影射到数据库里的!唉,看看能找到数据库的备份么。 强烈劝告大家:不到万不得已,别直接操作数据库啊!要非要操作就提前备份,数据永远是最重要的,...

爱我中华之笔耕不缀! 182

JAVA api 远程hbase出错 org.apache.hadoop.hbase.client.RetriesExhaustedException

JAVA api 远程hbase出错 org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions: Tue Jul 19 16:36:05 CST 2016, null, java.net.SocketTimeoutException: callTimeout=60000, callDuration=79721: row 'testtable,,' on table 'h

chen798213337的博客 6万+

发点牢骚---对待问题我们要有自己的观点,切莫人云亦云

本着家事国事天下事事事关心的原则,今天看了条新闻,标题为“人民币兵临“7”下 未来几年会升值几倍(图)”,地址为:http://finance.qq.com/a/20080408/000604.htm,心中实在有气,简直愚昧百姓啊!实在忍不住了,发点牢骚! 说一个最简单的道理,美国和咱们是什么关系?好朋友,过命的交情? 人民币升值你说美国高兴什么?他们为什么要高兴?你...

爱我中华之笔耕不缀! 334

【HBase】关于包org.apache.hadoop.hbase.client

Packageorg.apache.hadoop.hbase.client 提供HBase客户端接口 参考:Description Interface概要 Interface Description Attributes HConnection 创建于集群间的连接. H...

836811384 2415

某财经大学java老师布置的作业,你会吗?

这是某财经大学java老师布置的作业,你会吗? Java 程序设计—Assignment 1 Dead line : (06/05/2008) 上课之前 分数将在考试前公布 提交方式:光盘或者软盘,所有的代码要打印出来(A4)一起交上来,第一页写清楚班级、姓名、学号。 相关规定: 1迟于规定时间交作业0分。(如果你按时交上来哪怕没有任何东西,会按照相关规定打分,至少应强于0分。...

爱我中华之笔耕不缀! 272

Hbase Import导入数据异常处理-RetriesExhaustedWithDetailsException

CDH显示 问题导致原因: hbase org.apache.hadoop.hbase.mapreduce.Import -Dmapred.job.queue.name=etl crawl:wechat_biz /hbase/test4 执行import时,短时间内写入数据量过大导致写入异常。 18/09/11 09:44:27 INFO mapreduce.Job: Task ...

jast 8496

org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 6 actions: DoNotRetryIOE

今天做了两件事:其一,编译打包hadoop-eclipse-plugin-1.0.2.jar;其二,使用mapreduce操控hbase(上面两个操作都在eclipse完成)。 先说下版本吧:hadoop:1.0.2; hbase:0.94.0,系统是Ubuntu11.10. 打包编译感觉还好,hadoop1.0.2没有现成的eclipse插件,所以要自己编译打包才行,我参考了下面的文章进行了...

云计算? 758

Impala与Hbase整合用于ETL过程尝试(3)

一、      性能验证 如果真要在生产环境中用,需要验证如下场景: l  正向操作:在impala中通过sql insert大规模的加载或更新hbase的记录 l  反向操作:将hbase中的表导出到impala中形成可分析统计的表 上述场景如果不满足性能要求,就很难在生产中用于ETL了,而只能是做局部的小批量更新。   1.      样本数据准备 为了模拟大数据量,将字段扩展至

fishhunter的博客 3686

设计模式精讲】30.总结 23 种设计模式(Summary of 23 Design Patterns)

先盘点 C++ 标准库与语言机制里已经落地的 12 种——迭代器是 STL 的地基、策略长在尖括号里、访问者化名 std::visit、智能指针正是 GoF 预言的智能引用代理——逐一给出 API、原理映射与用法要点;再看标准库没有的 11 种,到 Boost、POCO、AOSP 等知名开源项目里看真身:Binder 工厂、Iostreams 过滤流、NotificationCenter 中介者。最后用三张速查表收口:高频榜(哪些天天在用)、关联搭档表(哪些天然合作)、易混辨析表(哪些最常认错)。

码工许师傅 386

【AI编程系列】MCP 常用设计模式解读

Registry、Compose、BAM/Adapter、OpenAPI 和数据库是内部实现细节。它解决的是“工具契约、Agent 引导、路由和策略是否可审计、可发布、可回滚”。工具描述、资源内容、RAG 文档、Issue、README 和上游 API 返回的文本,都可能包含恶意指令。直接让 LLM 生成 SQL 的风险包括:字段口径错误、跨租户、任意 Join、资源失控、分页后误判 TopN。将“用户真正想完成的事”封装为一个业务工具,由服务端完成跨 API、数据投影、权限收敛和流程控制。

Yangy的博客 143

设计模式精讲】28.访问者模式(Visitor)

本文给出访问者的 GoF 意图:在不改元素类的前提下为结构加新操作,核心机关是双重分派——accept 调 visit,visit 重载选具体行为;C++98 版用 const 重载族贯穿只读访问,现代版给出 variant + std::visit 的无类形态与 overloaded 惯用法。文末对照 std::visit、Boost.Variant 的 static_visitor 与 POCO 的 SAX 处理器。这是 23 种模式的最后一难。

码工许师傅 161

设计模式精讲】24.观察者模式(Observer)

传感器每来一个新样本,当前值面板、统计面板、告警模块都该刷新——直觉的写法是在 onSample 里逐个调用三个面板,订阅者从此焊死在发布者体内,加一块面板改一次传感器。本文从 RG 的经典气象站讲起,给出观察者的 GoF 意图:一对多依赖、状态一变、全体自动通知——发布者对订阅者的认知降到「一个接口」为止;C++98 版覆盖 notify 的重入副本、推与拉两种模型,现代版给出 std::function 槽位、RAII 订阅令牌与 weak_ptr 三件套,把「观察者悬垂」这个 C++ 最著名的坑逐一封

码工许师傅 340

设计模式精讲】26.策略模式(Strategy)

第一篇埋的伏笔到此兑现——反面教材一号 calcPrice 的 switch 又长回来了,二十七个分支,每加一种定价全函数回归。本文从「算法平行可换」与「状态依次迁移」的分野讲起,给出策略模式的 GoF 意图:定义算法族、各自封装、彼此可互换,让算法独立于使用它的客户变化;C++98 版把定价规则做成可注入的策略对象(自带费率与门槛数据),现代版给出 std::function 策略、模板策略(STL 比较器的形态)、以及把两个策略组合成链的高阶函数。C++ 的特殊地位值得一提:迭代器之后,策略是 STL

码工许师傅 420

第四十二天学习心得

每次`DriverManager.getConnection()`都会创建新的物理连接,而**创建连接是非常耗时的操作**(TCP握手、身份验证等)。3. 连接池是性能优化的重要一环:从自己手写连接池到理解原理,再到后续学习Druid、HikariCP等成熟框架,这条学习路径让我明白——**框架不是凭空产生的,而是把简单原理做到极致**。**这两步必须同时成功或同时失败**——这就是事务的意义。核心思路:重写`Connection.close()`方法,让它不是真正关闭连接,而是**归还到连接池**。

z23456d的博客 175
上一篇: 实现页面跳转到前一页!
下一篇: Action的困惑与消息传递
金钱大法师
博客等级 码龄22年 8粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值