随笔-8  评论-19  文章-2  trackbacks-0
  2006年6月30日

在WebWork 2.2.1中,在配置文件xwork.xml中新增加了了一个元素: default-action-ref,其实这个配置非常简单,但是很多人不知道,所以简单介绍一下.

如果你在xwork.xml里面配置了default-action-ref,那么当xwork中没有找到对应的action时,默认就会调用default-action-ref指定的action.

官方的wiki文档参考这里: http://wiki.opensymphony.com/display/WW/Action+configuration

配置代码如下:

 

												<package name="myPackage" ....>
            ...
            <default-action-ref name="simpleViewResultAction">
            <!--
            An example of a default action that is just a simple class
            that has 3 fields: successUrl, errorUrl, and inputUrl.  This action
            parses the request url to set the result values.  In the normal case
            it just renders velocity results of the same name as the requested url.
            -->
            <action name="simpleViewResultAction" class="SimpleViewResultAction">
            <result type="velocity">${successUrl}</result>
            
<result name="error" type="velocity">${errorUrl}</result>
            <result name="input" type="velocity">${inputUrl}</result>
            
</action>
... </package>

但是要注意,一般一个package内配置一个,如果配置多个,就无法预测结果了.

注意上面的配置,第一个result的name属性被省略了,webwork会认为它是"SUCCESS".

WebWork带的例子里面就有default-action-ref的配置,可以参考.

posted @ 2007-06-21 14:39 jie_java 阅读(1217) | 评论 (0)编辑 收藏

基本知识

1.1 性能是什么

在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过 Java 的人都能列出几点,甚至可以夸夸其谈。在《 Java TM Platform Performance 》一书中,定义了如下五个方面来作为评判性能的标准:

1)       运算的性能——哪一个算法的执行性能最好?

2)       内存的分配——程序运行时需要耗费多少内存?

3)       启动的时间——程序启动需要多长时间?这在 Web 项目中的影响不大,但要注意部分程序需要部署或运行在客户端时的情形(比如 applet 程序)。

4)       程序的可伸缩性——在压力负载的情况下,程序的性能如何?

5)       性能的感知——用户在什么情况下会觉得程序的性能不好?

以上五个方面,在具体的使用场景可以有选择的去评判。至于这五方面的性能调优,在后续的章节中将会陆续的给以相应的性能调优策略。

1.2 调优的规则

我们只需要关心对我们程序有影响,可以察觉到的性能问题,而不是每一个类中的每一个方法我们都需要想方设法的提高性能。如果程序的性能没有达到我们所期望的要求,我们才需要考虑如何优化性能。同样的,晦涩的代码虽然提高了程序的性能,但同时可能带给我们的是维护的噩梦。我们需要折中的考虑以上两种情况,使得程序的代码是优美的,并且运行的足够快,达到客户所期望的性能要求。

优化代码甚至会导致不良的结果, Donald Knuth (一位比较牛比较有影响的人物,具体是谁,我也忘了,谁知道,可以告诉我一下,谢谢!)曾说过,“ Premature optimization is the root of all evil” 。在开始性能调优前,需要先指出不优化代码的一些理由。

1)       如果优化的代码已经正常工作,优化后可能会引入新的 bug

2)       优化代码趋向于使代码更难理解和维护;

3)       在一个平台上优化的代码,在另一个平台上可能更糟;

4)       花费很多时间在代码的优化上,提高了很少的性能,却导致了晦涩的代码。

确实,在优化前,我们必须认真的考虑是否值得去优化。

1.3 调优的步骤

一般我们提高应用程序的性能划分为以下几个步骤:

1)       明确应用程序的性能指标,怎样才符合期望的性能需求;

2)       在目标平台进行测试;

3)       如果性能已经达到性能指标, Stop

4)       查找性能瓶颈;

5)       修改性能瓶颈;

6)       返回到第 2 步。

JDK 调优

2.1 选择合适的 JDK 版本

不同版本的 JDK ,甚至不同厂家的 JDK 可能都存在着很大的差异,对于性能优化的程度不同。一般来说,尽可能选择最新发布的稳定的 JDK 版本。最新的稳定的 JDK 版本相对以前的 JDK 版本都会做一些 bug 的修改和性能的优化工作。

2.2 垃圾收集 Java 堆的优化

垃圾收集就是自动释放不再被程序所使用的对象的过程。当一个对象不再被程序所引用时,它所引用的堆空间可以被回收,以便被后续的新对象所使用。垃圾收集器必须能够断定哪些对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。如果对象不再被使用,但还有被程序所引用,这时是不能被垃圾收集器所回收的,此时就是所谓的“内存泄漏”。监控应用程序是否发生了内存泄漏,有一个非常优秀的监控工具推荐给大家—— Quest 公司的 JProbe 工具,使用它来观察程序运行期的内存变化,并可产生内存快照,从而分析并定位内存泄漏的确切位置,可以精确定位到源码内。这个工具的使用我在后续的章节中还会做具体介绍。

Java 堆是指在程序运行时分配给对象生存的空间。通过 -mx/-Xmx -ms/-Xms 来设置起始堆的大小和最大堆的大小。根据自己 JDK 的版本和厂家决定使用 -mx -ms -Xmx -Xms Java 堆大小决定了垃圾回收的频度和速度, Java 堆越大,垃圾回收的频度越低,速度越慢。同理, Java 堆越小,垃圾回收的频度越高,速度越快。要想设置比较理想的参数,还是需要了解一些基础知识的。

Java 堆的最大值不能太大,这样会造成系统内存被频繁的交换和分页。所以最大内存必须低于物理内存减去其他应用程序和进程需要的内存。而且堆设置的太大,造成垃圾回收的时间过长,这样将得不偿失,极大的影响程序的性能。以下是一些经常使用的参数设置:

1)       设置 -Xms 等于 -XmX 的值;

2)       估计内存中存活对象所占的空间的大小,设置 -Xms 等于此值, -Xmx 四倍于此值;

3)       设置 -Xms 等于 -Xmx 1/2 大小;

4)       设置 -Xms 介于 -Xmx 1/10 1/4 之间;

5)       使用默认的设置。

大家需要根据自己的运行程序的具体使用场景,来确定最适合自己的参数设置。

除了 -Xms -Xmx 两个最重要的参数外,还有很多可能会用到的参数,这些参数通常强烈的依赖于垃圾收集的算法,所以可能因为 JDK 的版本和厂家而有所不同。但这些参数一般在 Web 开发中用的比较少,我就不做详细介绍了。在实际的应用中注意设置 -Xms -Xmx 使其尽可能的优化应用程序就行了。对于性能要求很高的程序,就需要自己再多研究研究 Java 虚拟机和垃圾收集算法的机制了。可以看看曹晓钢翻译的《深入 Java 虚拟机》一书。 


 
posted @ 2007-03-19 10:12 jie_java 阅读(344) | 评论 (0)编辑 收藏
1、放弃
  有舍才有得!
  把握的反面就是放弃,选择了一个机会,就等于放弃了其它所有的可能。当新的机会摆在面前的时候,敢于放弃已经获得的一切,这不是功亏一篑,这不是半途而废,这是为了谋求更大的发展空间;或者什么都不为,只因为喜欢这样做,因为,年轻就是最大的机会。不断尝试新的挑战,会让人生更丰富!
  人,只有在三十岁之前才会有这个胆量,有这雄厚的资本,才能具备这个资格。
  2、失恋
  不是不在乎,是在乎不起。如果沉迷其中的悲伤,将错失所有更美好的一切!
  三十岁前最怕失去的,不是已经拥有的东西,而是失去梦想。爱情如果只是一个过程,那么正是这个年龄应当经历的,如果要承担结果,三十岁以后,可能会更有能力,更有资格。
  其实,三十岁之前,我们要做的事情很多,稍纵即逝,过久地沉溺在已经干涸的爱河的河床中,与这个年龄应拥有的热情活力的生命节奏不合。
  3、离婚
  不是不在乎,是重新找到真正的幸福一切还来得及。
  一位三十八岁的女友与老公结婚十五年,冷战十三年,终于分手了。她说:"如果说后来不愿意离婚是为了孩子,那他第一次提出离婚我没有同意,现在想来真不知道为什么。如果那个时候早分手,我的生活绝不会是今天这个样子。现在再重新开始,总觉得一切都晚了。
  4、漂泊
  漂泊不是一种不幸,而是一种资格。趁着没有家室拖累,趁着身体健康,此时不飘何时飘?相信已婚的人一定很认同这句话。也只有漂泊过的人,才懂得珍惜日后安定的幸福。
  当然,漂泊的不一定是身体,也许只是幻想和梦境。新世纪的时尚领袖是飘浮的一代,渴望漂泊的人唯一不飘的是那颗心。
  5、失业
  三十岁以前,就尝到失业的滋味当然是一件不幸的事,但不一定是坏事,它同时可以让你更懂人情事故,体会人情冷暖。
  三十岁之前,就过早地固定在一个职业上,终此一生也许才是最大的不幸。失业也许让你想起埋藏很久而尘封的梦想,也许会唤醒连你自己都从未知道的潜能。也许你本来就没什么梦想,这时候也会逼着你去做梦。
  6、时尚
  不要追赶时尚,因为过多花费与奢侈可能导致生活拮据或是信用破产。
  按说青年人应该是最时尚的,但是独立思考和个性生活更重要。在这个物质社会,其实对时尚的追求早已经成为对金钱的追求。今天,时尚是物欲和世俗的同义语。
  7、格调
  这是属于雅痞的东西,追求格调就是他们的专利。
  他们说,有格调要满足四大要件:智能、素养、自信和金钱。格调就是把〝高尚〞理解成穿著、气质、爱好的品位和室内装潢。
  也就是大老粗只会表现谈吐的庸俗,〝雅痞〞们已经有能力庸俗他们的心灵了。主流观念倒不是非要另类,另类已经成为年轻人观念的主流了,在今天,老土倒显得另类。关键是当今社会是一个创造观念的时代,而不是一个固守陈旧观念的时代。
  8、评价
  我们最不应该做出的牺牲,就是因为别人的评价而改变自我!因为那些对你指手画脚的人,其实四根手指头正指着自己,惶惑的不知道他们遵从的规则是什么。
  千万不要只遵从规矩做事,规矩还在创造之中,要根据自己的判断做每一件事,虽然这样会麻烦一点。
  9、幼稚
  不要怕人说我们幼稚,这正说明你还年轻,还充满活力,正享受幸福的人生。〝成熟〞是个吓人的词儿,也是个害人的词儿。成熟和幼稚是对一个人最大而无当、最不负责任、最没用的概括。
  那些庸人,绝不会有人说他们幼稚。不信,到哪天你被生活压得老气横秋,暮气沉沉的时候,人们一定会说你成熟了,你就会知道〝成熟〞是个什么东西。
  10、不适应
  在一首摇滚?有这么一句:这个城市改变了我,这个城市不需要我。不要盲目地适应你生存的环境,因为很可能这环境自身已经不适应这个社会的发展了。
  11、失败
  我的老师曾经跟我说,一个人起码要在感情上失恋一次,在事业上失败一次,在选择上失误一次,才能长大。不要说失败是成功之母那样的老话,失败来得越早越好,要是三十岁,四十岁之后再经历失败,有些事,很可能就来不及了。
  12、错误
  不要怕跌倒!犯错,是没有经验的年轻人的专利。
  13、浅薄
  如果每看一次《铁达尼号》就流一次眼泪,每看一次豆豆先生就笑得直不起腰,就会有人笑你浅薄。其实那只能说明你的神经依旧非常敏锐,对哪怕非常微弱的刺激都会迅速做出适应的反应;等你的感觉迟钝了,人们就会说你深沉了。
  14、明星
  不是不必在乎,是不能在乎。
  明星在商品社会是一种消费品,花了钱,听了歌,看了电影,明星们的表现再好,不过是物超所值而己,也不值得崇拜呀?
  就像你在地摊上花五十块钱买的仿冒皮包,别人都猜是正牌货,物超所值了吧?你就崇拜上这个包包了吗?
  15、代价
  不是不计代价,而是要明白做任何事都要付出代价。对我们这个年龄的人来说,这绝不是一句废话。否则,要到三十岁的时候才会明白自己曾经付出了多少代价,却不明白为什么付出,更不明白自己得到了多少,得到什么。
  16、孤独
  不要怕一个人,这是为自由付出的代价。
  17、失意
  包括感情上的,事业上的,也许仅仅是今天花了冤枉钱没买到喜欢的东西,朋友家高朋满座自己却插不上一句话。过分在乎失意的感受,不是拿命运的捉弄来捉弄自己,就是拿别人的错误来惩罚自己。
  18、缺陷
  也许你个子矮,也许你长得不好看,也许你的嗓音像唐老鸭……那么你的优势就是:你不会被自己表面的浅薄的亮点所耽搁,少花一些时间,少走一些弯,直接发现你内在的优势,直接挖掘自己深层的潜能。
  19、误会
  如果出于恶意,那么解释也没有用;如果出于善意,就不需要解释。专门说到〝误会〞倒不是因为一个人在三十岁之前被人误会的时候更多,而是这个年龄的人想不开的时候更多。
  20、谣言
  这是一种传染病,沉默是最好的疫苗。除非你能找出传染源,否则解释恰恰会成为病毒传播最理想的条件。
  21、疯狂
  这是年轻人最好的心理调适,只能说明你精力旺盛,身心健康。说你〝疯狂〞是某些生活压抑、心力交瘁的中老年人恶意的评价,他们就像一部年久失修的机器,最需要调试,但只能微调,一次大修就会让他们完全报废。
  稳定三十岁之前就在乎稳定的生活,那只有两种可能,要么就是中了彩票,要么就是未老先衰。
  22、压力
  中年人能够承受多大压力检验的是他的韧性;年轻人能承受多大压力,焕发的是他的潜能。
  23、出国
  对待出国的态度应该像对待爱情一样,努力争取成败随缘。
  24、薪水
  给有远见的你,如果只是给人打工,薪水再高也高不到哪儿去。所以不要太计较你从工作中得到多少钱,而是在三十岁之前,机会远比金钱重要,事业远比金钱重要,将来远比金钱重要。
  对大多数人来说,三十岁之前工作的首要目标绝不是挣钱,而是挣未来。
  25、存款
  不要在意有没有存款,倒不一定是因为我们钱少,年轻人现在谁都知道钱是有生命的。
  到处都是信用贷,机会这么多,条件有都很好,可以拿钱去投资,拿钱去“充电”。钱只有在它流通的过程中才是钱,否则只是一叠世界上质量最好的废纸。
  26、房子
  除非买房子是为了升值,或是你结婚,不然大可不必为了房子挤破头的伤脑筋。
  有个男子,家在外地,大学毕业之后,家人就替他买了一间房子。他曾经有个去美国工作的机会,但是他觉得刚买了房子就离开上海说不过去,就放弃了。
  现在他工作稳定,但总觉得自己好象一事无成。唯一的成就就是结婚了,并且有了孩子,因为他觉得不该让这房子永远空着,所以房子变成了家。房子是都市生活的寓言,这个寓言不应该过早的和我们相关。
  27、年龄
  接近三十岁女孩子就开始隐瞒自己的年龄,其实大可不必。现在青年期都延迟到四十五岁了,快三十又算得了什么呢?
  28、在乎
  这是一种拿不起、放不下的心态,它的反面不是放弃,而是天马行空,自由自在,永远保持革命乐观主义的精神
posted @ 2006-12-07 16:58 jie_java 阅读(504) | 评论 (1)编辑 收藏

                                                              高手谈做程序员的基本原则
                                                                                                                  引用来源:金蝶中间件公司CTO袁红岗

      不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。

  1. 扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。

  2. 丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。

  3. 最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。

  4. 不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。

  5. 对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。

  6. 多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。

  7. 良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。

  8. 韧性和毅力。这也许是"高手"和一般程序员最大的区别。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。

  这些是我这几年程序员生涯的一点体会,希望能够给大家有所帮助。

posted @ 2006-08-13 10:16 jie_java 阅读(345) | 评论 (0)编辑 收藏
[1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!   

[2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!   

[3] 不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国*本,一律如此!   

[4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一*当老板或高层管理,那么你整*面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!

 [5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!   

[6] 抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!   

[7] 逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!   

[8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!   

[9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...   

[10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功!
posted @ 2006-07-18 15:29 jie_java 阅读(402) | 评论 (0)编辑 收藏

该例子主要实现了jstl 下拉菜单的功能,由于jstl中没有else功能,下面同时体现了如何在jstl实现if  else的功能。
<%
java.util.List list = new java.util.ArrayList();
list.add("");
list.add("限时");
list.add("特提");
list.add("平急");
request.setAttribute("list", list);

//用数组也可以实现
//String[] str = {"","限时","特提","特急"};
//request.setAttribute("list",str);
%>

<select size="1" name="jjcd" value="" style="width: 91; height: 18">
  <c:forEach var="item" items="${list}">
  <c:choose>
  <c:when test="${item eq '特提'}">
  <option selected>特提</option>
  </c:when>
  <c:otherwise>
   <option><c:out value="${item}"/></option>
  </c:otherwise>
  </c:choose>
  </c:forEach>
</select>

另一种实现下拉菜单的方法:
   <select name="jjcd">
  <c:forEach var="item" items="${list}">
   <option <c:if test="${item eq '特提'}">selected</c:if> value="<c:out value="${item}"/>">
   <c:out value="${item}"/></option>
  </c:forEach>
   </select>

posted @ 2006-06-30 13:28 jie_java 阅读(5167) | 评论 (0)编辑 收藏