|
用户名:fantasyjava 笔名:fantasyjava 地区: 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
欢迎访问fantasyjava的博客
正则表达式语法支持情况
| 命令或环境 | . | [ ] | ^ | $ | \( \) | \{ \} | ? | + | | | ( ) |
| vi | X | X | X | X | X | |||||
| Visual C++ | X | X | X | X | X | |||||
| awk | X | X | X | X | X | X | X | X | ||
| sed | X | X | X | X | X | X | ||||
| Tcl | X | X | X | X | X | X | X | X | X | |
| ex | X | X | X | X | X | X | ||||
| grep | X | X | X | X | X | X | ||||
| egrep | X | X | X | X | X | X | X | X | X | |
| fgrep | X | X | X | X | X | |||||
| perl | X | X | X | X | X | X | X | X | X |
- 作者: fantasyjava 2005年08月1日, 星期一 14:30 回复(0) | 引用(0) 加入博采
正则表达式学习的好例子
这里有一些有代表性的、比较简单的例子。
| vi 命令 | 作用 |
| :%s/ */ /g | 把一个或者多个空格替换为一个空格。 |
| :%s/ *$// | 去掉行尾的所有空格。 |
| :%s/^/ / | 在每一行头上加入一个空格。 |
| :%s/^[0-9][0-9]* // | 去掉行首的所有数字字符。 |
| :%s/b[aeio]g/bug/g | 将所有的bag、beg、big和bog改为bug。 |
| :%s/t\([aou]\)g/h\1t/g | 将所有tag、tog和tug分别改为hat、hot和hug(注意用group的用法和使用\1引用前面被匹配的字符)。 |
将所有方法foo(a,b,c)的实例改为foo(b,a,c)。这里a、b和c可以是任何提供给方法foo()的参数。也就是说我们要实现这样的转换:
| 之前 | 之后 | |
| foo(10,7,2) | foo(7,10,2) | |
| foo(x+13,y-2,10) | foo(y-2,x+13,10) | |
| foo( bar(8), x+y+z, 5) | foo( x+y+z, bar(8), 5) |
下面这条替换命令能够实现这一魔法:
现在让我们把它打散来加以分析。写出这个表达式的基本思路是找出foo()和它的括号中的三个参数的位置。第一个参数是用这个表达式来识别的::\([^,]\),我们可以从里向外来分析它:
| [^,] | 除了逗号之外的任何字符 | |
| [^,]* | 0或者多个非逗号字符 | |
| \([^,]*\) | 将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用它 | |
| \([^,]*\), | 我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。 |
现在正是指出一个使用正则表达式常见错误的最佳时机。为什么我们要使用[^,]*这样的一个表达式,而不是更加简单直接的写法,例如:.*,来匹配第一个参数呢?设想我们使用模式.*来匹配字符串"10,7,2",它应该匹配"10,"还是"10,7,"?为了解决这个两义性(ambiguity),正则表达式规定一律按照最长的串来,在上面的例子中就是"10,7,",显然这样就找出了两个参数而不是我们期望的一个。所以,我们要使用[^,]*来强制取出第一个逗号之前的部分。
这个表达式我们已经分析到了:foo(\([^,]*\),这一段可以简单的翻译为“当你找到foo(就把其后直到第一个逗号之前的部分标记为\1”。然后我们使用同样的办法标记第二个参数为\2。对第三个参数的标记方法也是一样,只是我们要搜索所有的字符直到右括号。我们并没有必要去搜索第三个参数,因为我们不需要调整它的位置,但是这样的模式能够保证我们只去替换那些有三个参数的foo()方法调用,在foo()是一个重载(overoading)方法时这种明确的模式往往是比较保险的。然后,在替换部分,我们找到foo()的对应实例,然后利用标记好的部分进行替换,是的第一和第二个参数交换位置。
这里有几行我们现在的数据:
下面就是第一个替换命令:
下面这个替换命令则用来去除空格:
Billy tried really hard而你想把"really"、"really really",以及任意数量连续出现的"really"字符串换成一个简单的"very"(simple is good!),那么以下命令:
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard
:%s/\(really \)\(really \)*/very /就会把上述的文本变成:
Billy tried very hard
Sally tried very hard
Timmy tried very hard
Johnny tried very hard
表达式\(really \)*匹配0或多个连续的"really "(注意结尾有个空格),而\(really \)\(really \)* 匹配1个或多个连续的"really "实例。
- 作者: fantasyjava 2005年08月1日, 星期一 14:29 回复(0) | 引用(0) 加入博采
正则表达式学习
匹配任何单个字符。例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root。 | ||
| 匹配行结束符。例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。 | ||
| 匹配一行的开始。例如正则表达式^When in能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"。 | ||
| 匹配0或多个正好在它之前的那个字符。例如正则表达式.*意味着能够匹配任意数量的任何字符。 | ||
| 这是引用府,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。 | ||
[c1-c2] [^c1-c2] | 匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。 | |
| 匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。 | ||
| 将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。 | ||
| 将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。 | ||
| 匹配1或多个正好在它之前的那个字符。例如正则表达式9+匹配9、99、999等。注意:这个元字符不是所有的软件都支持的。 | ||
| 匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。 | ||
\{i,j\} | 匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式A[0-9]\{3\} 能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]\{4,6\} 匹配连续的任意4个、5个或者6个数字字符。注意:这个元字符不是所有的软件都支持的。 |
- 作者: fantasyjava 2005年08月1日, 星期一 13:58 回复(0) | 引用(0) 加入博采
struts工作原理不错的解释
- 作者: fantasyjava 2005年08月1日, 星期一 13:46 回复(9) | 引用(0) 加入博采
jpetstore4.0学习笔记(三)
感觉对ActionContext和httpmap下的那些map类的作用不太明了,看了很就感觉好象就是为简化jsp网页设计,用来代替原本jsp中的那些request,session等内置变量的,好确定在网页之间跳转是变量的生存周期,感觉应该是这样,这些map类的继承关系如下:
Map(java.util.*)(interface)-->BaseHttpMap(抽象类)-->ApplicationMap,SessionMap等等
看来对ActionContext还要加深认识才行.
不管怎么样,对jpetstore的学习总算也有个小的完成吧.
对它的MVC设计模式感觉很好,总体的结构让人感觉很清晰.值得应用,不知道spring有什么新的方式呵呵
如果对它的总体设计记不清楚了,记的看那个jpetstore的逻辑图,很不错,
yeah,暂时到这吧
- 作者: fantasyjava 2005年07月22日, 星期五 11:47 回复(0) | 引用(0) 加入博采
jpetstore4.0学习笔记(二)
今天研究了一下jpetstore中的数据层(即持久化层)的实现,感觉它的设计结构的确很好,ibatis对DAO的使用让编写显的很清晰和简约.
对持久化层的定义主要在persistence文件夹里.首先如果业务层(定义在service文件嘉下)调用persistence下iface下的DAO接口,接口再根据dao.xml定义的映射关系调用sqlmapdao中的具体实现,但其实具体实现只是定义了对需要修改的数据库中表的操作.其实真正的sql语句都是定义在了\persistence\sqlmapdao\sql 下定义的具体的xml文件中,这样使的层次感很清晰,设计起来也很容易,各个操作可以分开编写,只要定义好调用关系就ok了.
没有研究过hibernate,不过感觉应该用的理念是差不多的,这些ORM框架的确很不错.
- 作者: fantasyjava 2005年07月22日, 星期五 10:59 回复(0) | 引用(0) 加入博采
jpetstore4.0学习笔记(一)
看了这个struts+ibatis的例子,感觉它的设计思想很不错.和以前的jpetstore的模式有很大变化.
变化最明显的就是他只定义了一个BeanAction, (也只有一个BaseBean,其他的form bean都继承自BaseBean),它将以前的action都定义到了form bean中,这样form bean就不在只是处理数据这么简单.BeanAction中采用反射机制,来对应调用form bean中的action.这样就简化了BeanAction的处理.在配置文件中主要有三种调用action的方式:
1.URL Pattern
|
此种方式表示,控制将被转发到"orderBean"这个form bean对象 的"viewOrder"方法(行为)来处理。方法名取"path"参数的以"/"分隔的最后一部分。
它对应于BeanAction中的这部分代码:
if (method == null && !"*".equals(methodName)) {
methodName = mapping.getPath();
if (methodName.length() > 1) {
int slash = methodName.lastIndexOf("/") + 1;
methodName = methodName.substring(slash);
if (methodName.length() > 0) {
try {
method = form.getClass().getMethod(methodName, null);
forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionExcepion("Error dispatching bean action via URL pattern ('" + methodName + "'). Cause: " + e, e);
}
}
}
}
是通过path来取得要调用的action函数.
2.Method Parameter
|
此种方式表示,控制将被转发到"orderBean"这个form bean对象的"viewOrder"方法(行为)来处理。配置中的"parameter"参数表示form bean类上的方法。"parameter"参数优先于"path"参数。
它对应与BeanAction中的:
Method method = null;
String methodName = mapping.getParameter();
if (methodName != null && !"*".equals(methodName)) {
try {
method = form.getClass().getMethod(methodName, null);
forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionException("Error dispatching bean action via method parameter ('" + methodName + "'). Cause: " + e, e);
}
}
通过paramater来调用对应的action函数
3.No Method call
|
此种方式表示,form bean上没有任何方法被调用。如果存在"name"属性,则struts把表单参数等数据填充到form bean对象后,把控制转发到"success"。否则,如果name为空,则直接转发控制到"success"。
这种parameter值为*的不调用任何action函数,有name属性则填充数据然后success.没有则直接success.
当然若name,parameter都没有则直接success.
- 作者: fantasyjava 2005年07月21日, 星期四 17:10 回复(0) | 引用(0) 加入博采
struts中ActionForm.javabean.Action运行机制
- 作者: fantasyjava 2005年07月14日, 星期四 11:22 回复(1) | 引用(0) 加入博采
Web Framework的决斗
Web Framworks 的决斗
译者:John Zhu
在本次JavaOne的周三的对话中,关于Web 框架的对决是非常有趣的对话之一。我们从这次对决的拥护者和格式开始报道,我们提供每个框架的概要描述和不同点,最后,我们发布TSS的自己的积分卡,那个框架在本次决斗中倒下,以及"Best Business Case" 和 "Best Technical Case"的胜利者。
决斗的拥护者:
参与的框架:
JavaServer Faces, championed by Ed Burns
Webwork, championed by Jason Carreira
Shale, championed by David Geary
Tapestry, championed by Howard Lewis Ship
Wicket, championed by Eelco Hillenius
缺席但是非常优秀的其他框架:
Struts 1.x
SpringMVC
Ruby on Rails
决斗的方式:
第一回合: 每个拥护者用三分钟介绍他们的框架.
第二回合: 主持人提问.
第三回合: 观众提问.
战斗的钟: 主持人是Kevin Osborn控制着战斗的钟声.控制现场秩序,以利于决斗不会使用非正当手段或者拥护者是否超过时间时.
我们的评论:
我们注意到在本次决斗中一个主要的趋势是针对组件。每个框架介绍自己的Web组件如何工作的优势。传递给观众的信息是web组件是如此的流行和时兴…拥护者介绍他们的组件的核心在于看上去像什么?我们还注意到,Struts已经明显落后,而所有其他的框架都努力在从Struts的阴影中突破,强调自己如何之不同和如何之更好。尽管Web框架已经前进并将Struts丢在后面,但是Struts仍然是经过实践检验并在成千的成功项目中实施。我禁不住认为Structs没有包含Web组件的思路,所以开发者需要考虑其他的框架,web组件是一个好的开始。:)
框架概述 (第一回合)
JavaServer Faces (JSF)
Webwork
Shale
Tapestry
Wicket
值得注意的引用:
我们的积分卡
TSS尽量用分数来记录决斗,我们对每个框架在两个领域以5分总分作为记录:
技术特性 | ||
框架 | 分数 | 原因 |
JavaServer Faces (JSF) | 4.8 | JSF赢得大部分分是因为它是第一个真正支持Web组件的。我们的分析师感觉JSF在简单和优雅方面缺乏指控是不当的。JSF是易用的,强大的,并且是革命的。已经存在的Shale和Spring表明JSF的确是可扩展的。 |
Webwork | 4.2 | Webwork的多层MVC作为先驱是革命性的,然而我们感觉Webwork的HMVC和模板机制于JSF比已经黯然失色,其思想已经融入了JSF中。 |
Shale | 4.95 | 如果说Shale站的比其他框架高,那是因为它站在巨人的肩膀上。通过扩展JSF,包含了Web流,支持Ajax,集成tiles,客户端检验,我们的感觉是Shale展示了Web框架的需求和机会的未来。 |
Tapestry | 4.75 | Tapestry是Web组件的先锋,在讨论中谈到的“JSF和Tapestry不相上下”本非遥远。然而,JSF的标准扩展点,和第一个支持门户的开发对于Tapestry来说是强有力的竞争优势。我们看比赛已经结束,当然我们乐意看到Tapestry支持JSF的标准接口和支持交互性。…明确的说,我们喜欢能够用Tapesry写JSF组件,用JSF组件的方法去用Tapestry组件。我们热切的期待下一次比赛 |
Wicket | 没打分 | Wicket是新兵,在JavaOne的几周前才发布了1.0版本,我们感觉对它了解得还是太少所以不能给之打分,然而,如果Wicket像它声明的那样的简单的化,我们确认是要对之加以关注,我们同样喜欢扩展Wicket相同的交互性于tapestry. |
Struts | 4.2 | Struts并不是正式在本次决斗中,但是Struts负有作为其他框架对比的职责。当Struts发布它的对于Web世界革命性的版本,它包含了数据绑定控制,行为事件的控制(action event handlers),和用包含Tiles来进行可扩展导航,Struts的校验功能,和通过Dynabeans的扩展性。然而,Struts同样是它的成功的牺牲品,缺乏正式的组件模型,尤其是它向后兼容的能力,妨碍了它继续成为新一轮回合的先锋。这也是为什么它的建立者Craig McClanahan开始成立Shale项目,希望Shale能够有一天成为事实上的标准。
|
商业使用 | ||
框架 | 打分 | 原因 |
JavaServer Faces (JSF) | 3.9 | JSF现在作为Java标准,已经包含在J2EE 5.0中,得到Sun, IBM, BEA, Oracle和成打的其他公司的认可,JSF展示了太多的承诺。 然而,我们不能忽视现在仅有的几个有限的JSF的应用。如果JSF要赢得IT经理离开Struts的心,JSF需要更多的成功案例。 简单的提一个打名字,比如FedEx,已经使用JSF在它的一些挑选的项目中,如果JSF如此强大,我们可以等待一个成功案例来传播我们是不是在拿商业做赌博。 然而,对比其他在本次决斗中的框架(Struts除外)JSF仍然是赢得3.9分的首选。 |
Webwork | 3.1 | 当我们在观众提问回合站起来问每个框架巨大的并发性估计和当前使用该框架发布项目的个数的时候,所有的框架,包括JSF都在估左右而言它的逃避这个问题。但是我们喜欢Webwork的回答:“我可以将Google的每台作为我们框架部署者的服务器统计在内吗?”……如果google使用Webwork作为它的商业赌博,它已经赢得了观众的巨大的信任。s |
Shale | 1.3 | 虽然Shale具有JSF的顶级技术专家,但仍然未证明的。从商业风险的角度,它太新,未来具有不确定性。 当然,对于Shale声明自己作为Struts 2.0的期望,听上去很打动人,但是仍然只是一个期望,离开正式给庞大的Struts社区接纳还很远,还需要克服很多的困难,应对很对的挑战。 |
Tapestry | 2.8 | 像Webwork一样,Tapestry已经多次被证明是一个健壮的框架(TheServerside.com 使用Tapestry.) Tapestry 4.0 发布了全新的令人兴奋的特性.然而我们感觉 Tapestry 的建立者 Howard Lewis Ship描述Tapestry 作为其他Web框架“研究项目”是最好的. 并且适用于小组精英开发人员小组使用最新的创新的技术,Tapestry是最好的。 庞大的IT市场接受的是工业界已经广泛采用的东西,有经验的开发人员庞大社区影响最终的选择,基于成百的成功已经的提交项目,我们不认为Tapestry会是合适的选择。我们的挑战是使Tapestry同JSF表现的更加好…只有标准的兼容才能够让Tapestry不不需要考虑IT经理们因为风险而反对。 |
Wicket | 0.7 | 可能Wicket简单如同它的强大一样,他们只有不超过五个项目使用Wicket,并且所有的项目都属于Wicket的作者。作为一个新兵,Wicket的创新使相当受欢迎的,仍然Wicket仍然有很长的路去证明它自己. |
Struts | 4.6 | 伴随着成千的使用Struts的已经部署的项目 ,Strut作为框架已经被或大或小的IT组织所接受。 Struts本身不提出官方的标准,但是它已经使事实上的标准。IT经理不会因为风险而担心接受Struts。 |
- 作者: fantasyjava 2005年07月12日, 星期二 09:40 回复(0) | 引用(0) 加入博采
初学者如何开发一个高质量的J2EE系统
J2EE可以说指Java在数据库信息系统上实现,数据库信息系统从早期的dBase、到Delphi/VB等C/S结构,发展到B/S(Browser浏览器/Server服务器)结构,而J2EE主要是指B/S结构的实现。
J2EE又是一种框架和标准,框架类似API、库的概念,但是要超出它们。如果需要详细了解框架,可先从设计模式开始学习。
J2EE是一个虚的大的概念,J2EE标准主要有三种子技术标准:WEB技术、EJB技术和JMS,谈到J2EE应该说最终要落实到这三个子概念上。
这三种技术的每个技术在应用时都涉及两个部分:容器部分和应用部分,Web容器也是指Jsp/Servlet容器,你如果要开发一个Web应用,无论是编译或运行,都必须要有Jsp/Servlet库或API支持(除了JDK/J2SE以外)。
Web技术中除了Jsp/Servlet技术外,还需要JavaBeans或Java Class实现一些功能或者包装携带数据,所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。
谈到JavaBeans技术,就涉及到组件构件技术(component),这是Java的核心基础部分,很多软件设计概念(设计模式)都是通过JavaBeans实现的。
JavaBeans不属于J2EE概念范畴中,如果一个JavaBeans对象被Web技术(也就是Jsp/Servlet)调用,那么JavaBeans就运行在J2EE的Web容器中;如果它被EJB调用,它就运行在EJB容器中。
EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范,因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。
至此,JavaBeans组件发展到EJB后,并不是说以前的那种JavaBeans形式就消失了,这就自然形成了两种JavaBeans技术:EJB和POJO,POJO完全不同于EJB概念,指的是普通JavaBeans,而且这个JavaBeans不依附某种框架,或者干脆可以说:这个JavaBeans是你为这个应用程序单独开发创建的。
J2EE应用系统开发工具有很多:如JBuilder、Eclipse等,这些IDE首先是Java开发工具,也就是说,它们首要基本功能是可以开发出JavaBeans或Java class,但是如果要开发出J2EE系统,就要落实到要么是Web技术或EJB技术,那么就有可能要一些专门模块功能(如eclipse需要lomboz插件),最重要的是,因为J2EE系统区分为容器和应用两个部分,所以,在任何开发工具中开发J2EE都需要指定J2EE容器。
J2EE容器分为WEB容器和EJB容器,Tomcat/Resin是Web容器;JBoss是EJB容器+Web容器等,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行,而你开发的Web+EJB应用则只可以在JBoss服务器上运行,商业产品Websphere/Weblogic等和JBoss属于同一种性质。
J2EE容器也称为J2EE服务器,大部分时它们概念是一致的。
如果你的J2EE应用系统的数据库连接是通过JNDI获得,也就是说是从容器中获得,那么你的J2EE应用系统基本与数据库无关,如果你在你的J2EE应用系统耦合了数据库JDBC驱动的配置,那么你的J2EE应用系统就有数据库概念色彩,作为一个成熟需要推广的J2EE应用系统,不推荐和具体数据库耦合,当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。
衡量J2EE应用系统设计开发水平高低的标准就是:解耦性;你的应用系统各个功能是否能够彻底脱离?是否不相互依赖,也只有这样,才能体现可维护性、可拓展性的软件设计目标。
为了达到这个目的,诞生各种框架概念,J2EE框架标准将一个系统划分为WEB和EJB主要部分,当然我们有时不是以这个具体技术区分,而是从设计上抽象为表现层、服务层和持久层,这三个层次从一个高度将J2EE分离开来,实现解耦目的。
因此,我们实际编程中,也要将自己的功能向这三个层次上靠,做到大方向清楚,泾渭分明,但是没有技术上约束限制要做到这点是很不容易的,因此我们还是必须借助J2EE具体技术来实现,这时,你可以使用EJB规范实现服务层和持久层,Web技术实现表现层;
EJB为什么能将服务层从Jsp/Servlet手中分离出来,因为它对JavaBeans编码有强制的约束,现在有一种对JavaBeans弱约束,使用Ioc模式实现的(当然EJB 3.0也采取这种方式),在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeans约束,形成一个服务层,这也是是Jive这样开源论坛设计原理之一。
由此,将服务层从表现层中分离出来目前有两种可选架构选择:管理普通JavaBeans(POJO)框架(如Spring、JdonFramework)以及管理EJB的EJB框架,因为EJB不只是框架,还是标准,而标准可以扩展发展,所以,这两种区别将来是可能模糊,被纳入同一个标准了。 但是,个人认为:标准制定是为某个目的服务的,总要牺牲一些换取另外一些,所以,这两种架构会长时间并存。
这两种架构分歧也曾经诞生一个新名词:完全POJO的系统也称为轻量级系统(lightweight),其实这个名词本身就没有一个严格定义,更多是一个吸引人的招牌,轻量是指容易学习容易使用吗?按照这个定义,其实轻量Spring等系统并不容易学习;而且EJB 3.0(依然叫EJB)以后的系统是否可称为轻量级了呢?
前面谈了服务层框架,使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来,而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离,这部分JavaBeans主要负责显示相关,一般是通过标签库(taglib)实现,不同框架有不同自己的标签库,Struts是应用比较广泛的一种表现层框架。
这样,表现层和服务层的分离是通过两种框架达到目的,剩余的就是持久层框架了,通过持久层的框架将数据库存储从服务层中分离出来是其目的,持久层框架有两种方向:直接自己编写JDBC等SQL语句(如iBatis);使用O/R Mapping技术实现的Hibernate和JDO技术;当然还有EJB中的实体Bean技术。
持久层框架目前呈现百花齐放,各有优缺点的现状,所以正如表现层框架一样,目前没有一个框架被指定为标准框架,当然,表现层框架现在又出来了一个JSF,它代表的页面组件概念是一个新的发展方向,但是复杂的实现让人有些忘而却步。
在所有这些J2EE技术中,虽然SUN公司发挥了很大的作用,不过总体来说:网络上有这样一个评价:SUN的理论天下无敌;SUN的产品用起来撞墙;对于初学者,特别是那些试图通过或已经通过SUN认证的初学者,赶快摆脱SUN的阴影,立即开溜,使用开源领域的产品来实现自己的应用系统。
最后,你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现,基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。
还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解,那么域建提供了一种比较切实可行的正确理解业务需求的方法,相关详细知识可从UML角度结合理解。
当然,如果你想设计自己的行业框架,那么第一步从设计模式开始吧,因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法,当你学会了系统基本单元JavaBean或类之间解耦时,那么系统模块之间的解耦你就可能掌握,进而你就可以实现行业框架的提炼了,这又是另外一个发展方向了。
以上理念可以总结为一句话:
J2EE开发三件宝: Domain Model(域建模)、patterns(模式)和framework(框架)。
- 作者: fantasyjava 2005年07月12日, 星期二 09:24 回复(0) | 引用(0) 加入博采