博文
五步轻松替代JSP Struts与Velocity集成(2009-04-07 21:30:00)
摘要:Java™ 服务器页面(JSP)技术是如此普及,以至于人们忘记了在创建 Web 页面时还有其他选择。但是最近,有些开发人员已经转向模板引擎,以获得在 JSP 中得不到的灵活性。虽然用 JSP 和模板引擎都可以把数据嵌入 HTML,但是每种技术都有自己的处理方式。Velocity 模板是一个特别流行的 JSP 替代品。Velocity 提供了平缓的学习曲线和巨大的易用性。开发人员喜欢它简洁的语法,而且性能分析也证明它的性能超出 JSP。Velocity 也非常容易集成进 Struts 应用程序。
在这篇文章中,我将介绍如何在 Struts 应用程序中集成和使用 Velocity 模板引擎。我会首先提供一个公式,然后逐步展开它。生成的应用程序组合了 Struts 和 Velocity —— 一个第一流的组合,可能会让您怀疑自己对 JSP 的忠诚!
关于模板引擎
在开始集成 Struts 和 Velocity 的简单任务之前,让我们先确保您理解模板引擎和它们在视图生成中的角色。模板引擎作为整体概念,Velocity 作为具体实现,它们的生命在 HTML 之外。Velocity 把数据合并到文本主体中不同的点上。文本可以是文字、电子邮件或 HTML。由于采用这种方式,Velocity 模板引擎有点儿像 Microsoft Word 的“邮件合并”特性。邮件合并允许您方便地把动态数据(例如姓名、地址和电话号码)合并到信件中。在早期的日子里,组织用这项特性生成大型邮件列表并把它们送到邮局,导致垃圾邮件的产生!
在 Web 应用程序中,Velocity 实现的目标与 JSP 相同:可以用它在向 HttpServletResponse 的 OutputStream 发送之前生成要发送的 HTML。在 Struts 应用程序中使用 Velocity 的一种方式是在 Struts 的 Action 内部写入响应,然后返回 null 的 ActionForward。虽然这种技术可行,但却有严重的缺陷:无法使用 ......
php不实用大系统的九大原因(2009-03-25 20:41:00)
摘要:
PHP确实十分容易编写。但是PHP也有一些十分严重的缺陷。下面我会给出我的理由,为什么PHP不适合于比小型业余网站更大的网站。 1、对递归的不良支持 递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。有一个使用递归的例子是快速排序(quicksort)。不幸的是,PHP并不擅长递归。Zeev,一个PHP开发人员,说道:“PHP 4.0(Zend)对密集数据使用了栈方式,而不是使用堆方式。也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少。”见bug 1901。这是一个很不好的借口。每一个编程语言都应该提供良好的递归支持。 2、许多PHP模块都不是线程安全的 在几年前,Apache发布了Web服务器的2.0版。这个版本支持多线程模式,在这个模式下,软件一个一部分可以同时运行多个。PHP的发明者说PHP的核心是线程安全的,但是非核心模块不一定是。但是十次有九次,你想要在PHP脚本中使用这种模块,但这又使你的脚本不能合适Apache的多线程模式。这也是为什么PHP小组不推荐在Apache 2 的多线程模式下运行PHP。不良的多线程模式支持使PHP常被认为是Apache 2依然不流行的原因之一。 3、PHP 由于商业原因而不健全 通过使用缓存,PHP的性能可以陡增500%[见基准测试]。那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者,它在销售自己的Zend Accelerator,所以当然,他们不想抛弃自己的商业产品这块肥肉。 但是有另一个可选择的: APC. (Zend后来推出Zend Optimizer,免费的加速器——译者) 4、没有命名空间 设想某个人制作了一个PHP模块用来阅读文件。模......
(转)程序员每天应做的事(2009-03-22 16:10:00)
摘要:程序员每天该做的事[转载]
2009-01-15 14:08
程序员每天该做的事 1、总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多
2、考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作
3、考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢
4、考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗? (1+0.01)^365 = 37 倍
5、看一个有用的新闻网站或读一张有用的报纸,了解业界动态 闭门造车是不行的,了解一下别人都在做什么,对自己能带来很多启示
6、记住一位同事的名字及其特点 你认识公司的所有同事吗?你了解他们吗?
7、清理自己的代码 今天完成的代码,把中间的调试信息,测试代码清理掉,按照编码风格整理好,注释都写好了吗?
8、清理自己的桌面 当日事当日毕,保持清洁干劲的桌面才能让你工作时不分心,程序员特别要把电脑的桌面清理干净
程序员每周该做的事 1、向你的老板汇报一次工作 让你的老板知道你在做什么,这很重要。可以口头、书面、邮件,看你老板的工作方式而定
2、进行一次自我总结(非正式) 这周之内自己表现得怎么样?该加分还是扣分?
3、制定下周计划 把下周要做的事情列出来,一样要分清楚优先级
4、整理自己的文件夹、书柜和电脑文件 把桌面以外的地方也要清理干净,电脑的文件夹,收到的邮件,把过时的垃圾全部清理掉
5、与一个非公司的朋友沟通 它山之石,可以攻玉
6、看一本杂志 找一本适合自己的专业杂志
7、纠正自己或同事一个细节上的不正确做法 《细节决定成败》看过了吗?没看过强烈建议先看看
程序员每月该做的事 1、至少和一个同事一起吃饭或喝茶 不光了解自己工作伙伴的工作,还要了解他们的生活
2、自我考核一次 相对正式地考核自己一下,你对得起这个月的工资吗?
3、对你的同事考核一次 你的同事表现怎么样?哪些人值得学习,哪些人需要帮助?
3、制定下月的计划,确定下月的工作重点
4、总结自己工作质量改进状况 自己的质量提高了多少?
5、有针对性地对一项工......
面象对象编程思维(2009-03-11 15:06:00)
摘要:
(转)如何培养面象oo的思维
关键词:
我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭,因为我早以习惯用C来编写程序,很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。我对Java的面向对象的特性琢磨良久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。举个例子,要发广告邮件,广告邮件列表存在数据库里面。倘若用C来写的话,一般会这样思考,先把邮件内容读入,然后连接数据库,循环取邮件地址,调用本机的qmail的sendmail命令发送。然后考虑用Java来实现,既然是OOP,就不能什么代码都塞到main过程里面,于是就设计了三个类:一个类是负责读取数据库,取邮件地址,调用qmail的sendmail命令发送;一个类是读邮件内容,MIME编码成HTML格式的,再加上邮件头;一个主类负责从命令读参数,处理命令行参数,调用发email的类。把一件工作按照功能划分为3个模块分别处理,每个类完成一件模块任务。仔细的分析一下,就会发现这样的设计完全是从程序员实现程序功能的角度来设计的,或者说,设计类的时候,是自低向上的,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。举一个非常简单的例子:假使现在需要写一个网页计数器,客户访问一次页面,网页计数器加1,计数器是这样来访问的如:http://hostname/count.cgi?id=xxx后台有一个数据库表,保存每个id(一个id对应一个被统计访......
访问树的节点(2009-03-04 19:08:00)
摘要:books.jsp
<html><head><script type="text/javascript" src="loadXML.js"></script> //在上面的一篇文章里面有</head><body><script type="text/javascript">xmlDoc=loadXMLDoc(text);// documentElement always represents the root nodex=xmlDoc.documentElement.childNodes;for (i=0;i<x.length;i++){document.write(x[i].nodeName);document.write(": ");document.write(x[i].childNodes[0].nodeValue);document.write("<br />");}</script></body></html>
xml字符串 遍历节点树
<html><head><script type="text/javascript" src="loadXML.js"></script></head><body><script type="text/javascript">text="<book>";text=text+"<title>Everyday Italian</title>";text=text+"<author>Giada De Laurentiis</author>";text=text+"<year>2005</year>";text=text+"</book>";
xmlDoc=loadXMLString(text);
// documentElement always represents the root nodex=xmlDoc.documentElement.childNodes;for (i=0......
XML基本框架(2009-03-04 18:55:00)
摘要:book.xml<?xml version="1.0" encoding="UTF-8"?><bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book><book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book><book category="WEB"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book&g......
