关于作者

用户名:fantasyjava
笔名:fantasyjava
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:21
评论个数:12
留言条数:1




Powered by BlogDriver 2.1

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将所有的bagbegbigbog改为bug。 
:%s/t\([aou]\)g/h\1t/g将所有tagtogtug分别改为hathothug(注意用group的用法和使用\1引用前面被匹配的字符)。

中级的例子(神奇的咒语)

例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)

下面这条替换命令能够实现这一魔法:

    :%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g

现在让我们把它打散来加以分析。写出这个表达式的基本思路是找出foo()和它的括号中的三个参数的位置。第一个参数是用这个表达式来识别的::\([^,]\),我们可以从里向外来分析它: 

[^,] 除了逗号之外的任何字符
[^,]*0或者多个非逗号字符
\([^,]*\)将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用它
\([^,]*\),我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。

现在正是指出一个使用正则表达式常见错误的最佳时机。为什么我们要使用[^,]*这样的一个表达式,而不是更加简单直接的写法,例如:.*,来匹配第一个参数呢?设想我们使用模式.*来匹配字符串"10,7,2",它应该匹配"10,"还是"10,7,"?为了解决这个两义性(ambiguity),正则表达式规定一律按照最长的串来,在上面的例子中就是"10,7,",显然这样就找出了两个参数而不是我们期望的一个。所以,我们要使用[^,]*来强制取出第一个逗号之前的部分。

这个表达式我们已经分析到了:foo(\([^,]*\),这一段可以简单的翻译为“当你找到foo(就把其后直到第一个逗号之前的部分标记为\1”。然后我们使用同样的办法标记第二个参数为\2。对第三个参数的标记方法也是一样,只是我们要搜索所有的字符直到右括号。我们并没有必要去搜索第三个参数,因为我们不需要调整它的位置,但是这样的模式能够保证我们只去替换那些有三个参数的foo()方法调用,在foo()是一个重载(overoading)方法时这种明确的模式往往是比较保险的。然后,在替换部分,我们找到foo()的对应实例,然后利用标记好的部分进行替换,是的第一和第二个参数交换位置。

例2

假设有一个CSV(comma separated value)文件,里面有一些我们需要的信息,但是格式却有问题,目前数据的列顺序是:姓名,公司名,州名缩写,邮政编码,现在我们希望讲这些数据重新组织,以便在我们的某个软件中使用,需要的格式为:姓名,州名缩写-邮政编码,公司名。也就是说,我们要调整列顺序,还要合并两个列来构成一个新列。另外,我们的软件不能接受逗号前后面有任何空格(包括空格和制表符)所以我们还必须要去掉逗号前后的所有空格。

这里有几行我们现在的数据:

    Bill Jones,     HI-TEK Corporation ,  CA, 95011
    Sharon Lee Smith,  Design Works Incorporated,  CA, 95012
    B. Amos   ,  Hill Street Cafe,  CA, 95013
    Alexander Weatherworth,  The Crafts Store,  CA, 95014
    ...
我们希望把它变成这个样子:
    Bill Jones,CA 95011,HI-TEK Corporation
    Sharon Lee Smith,CA 95012,Design Works Incorporated
    B. Amos,CA 95013,Hill Street Cafe
    Alexander Weatherworth,CA 95014,The Crafts Store
    ...
我们将用两个正则表达式来解决这个问题。第一个移动列和合并列,第二个用来去掉空格。

下面就是第一个替换命令:

    :%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/
这里的方法跟例1基本一样,第一个列(姓名)用这个表达式来匹配:\([^,]*\),即第一个逗号之前的所有字符,而姓名内容被用\1标记下来。公司名和州名缩写字段用同样的方法标记为\2\3,而最后一个字段用\(.*\)来匹配("匹配所有字符直到行末")。替换部分则引用上面标记的那些内容来进行构造。

下面这个替换命令则用来去除空格:

    :%s/[ \t]*,[ \t]*/,/g
我们还是分解来看:[ \t]匹配空格/制表符,[ \t]* 匹配0或多个空格/制表符,[ \t]*,匹配0或多个空格/制表符后面再加一个逗号,最后,[ \t]*,[ \t]*匹配0或多个空格/制表符接着一个逗号再接着0或多个空格/制表符。在替换部分,我们简单的我们找到的所有东西替换成一个逗号。这里我们使用了结尾的可选的g参数,这表示在每行中对所有匹配的串执行替换(而不是缺省的只替换第一个匹配串)。

例3

假设有一个多字符的片断重复出现,例如:
Billy tried really hard
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard
而你想把"really"、"really really",以及任意数量连续出现的"really"字符串换成一个简单的"very"(simple is good!),那么以下命令:
:%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匹配这些字符串:ratrutr 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匹配ratrotrut,但是不匹配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\}
\{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工作原理不错的解释
抓紧你的帽子!
既然我们已经讲了一些基本知识,我们现在可以进行一个Struts的飞速之旅了。在我们
打开框架吃到一些果子之前,我们先了解一个大概模样。
Struts 使用 Model 2 架构。Struts 的ActionServlet 控制导航流。其他Struts 类,比如
Action, 用来访问业务逻辑类。当 ActionServlet 从容器接收到一个请求,它使用URI (或者
路径“path”) 来决定那个Action 将用来处理请求。一个 Action可以校验输入,并且访问业务
层以从数据库或其他数据服务中检索信息。
为校验输入或者使用输入来更新数据库, Action 需要知道什么指被提交上来。并不是
强制每个Action 从请求中抓取这些值,而是由 ActionServlet 将输入绑定到JavaBean中。
输入 bean是Struts ActionForm c类的子类。ActionServlet 通过查找请求的路径可以决定使用
哪个ActionForm,Action 也是通过同样的方法选取的。ActionForm 扩展
org.apache.struts.action.ActionForm类。每个都必须以HTTP 响应进行应答。 通
常, Struts
Action 并不自行加工响应信息,而是将请求转发到其他资源,比如JSP 页面。Struts 提
供一个ActionForward 类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后,
Action 选择并向Servlet返回一个ActionForward。Servlet 然后使用存储在ActionForward 对
象中的路径来调用页面完成响应。
Struts 将这些细节都绑定在一个ActionMapping 对象中。每个ActionMapping 相对于一
个特定的路径。当某个路径被请求时,Servlet 就查询ActionMapping 对象。ActionMapping
对象告诉servlet,哪个Actions, ActionForms, 和 ActionForwards 将被使用。
所有这些细节,关于Action, ActionForm, ActionForward, ActionMapping,以及其
他一些东西,都在struts-config.xml 文件中定义。 ActionServlet 在启动时读取这个配置文件,
并创建一个配置对象数据库。在运行时,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

<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
    name="orderBean" scope="session"
    validate="false">
    <forward name="success" path="/order/ViewOrder.jsp"/>
  </action>



此种方式表示,控制将被转发到"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

<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
    name="orderBean" parameter="viewOrder" scope="session"
    validate="false">
    <forward name="success" path="/order/ViewOrder.jsp"/>
  </action>



此种方式表示,控制将被转发到"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

<action path="/shop/viewOrder" type="com.ibatis.struts.BeanAction"
    name="orderBean" parameter="*" scope="session"
    validate="false">
    <forward name="success" path="/order/ViewOrder.jsp"/>
  </action>



此种方式表示,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运行机制
在此举一个用户注册说明struts中的几个类的用法
1,建立一个javabean(User.java)来封装用户的一些具体信息(id,name,等)
User:
private id,name......
getter
setter
相信这个javabean谁都能完成,代码就不写了
2,就是struts中的ActionForm了(UserForm.java),它封装的也是用户的信息,但是抽象的信息,把1中的整个User封装起来,当然可能还有一些其他的功能方法
UserForm
private User
getUser
setUser
this.user=new User()//重直user
看了这个功能之后,也许会问为什么要这个ActionForm呢,他和前一个都是同样的功能,封装用户信息,但这是抽象化的,不管用户的具体信息怎么变,他都能封装,这就达到了可重用性
3,也许要到处理逻辑业务的时候了,但还未时过早,现在是struts中Action上场了(UserAction.java),处理抽象的业务逻辑,它通过ActionForward来映射到具体的页面(结合struts-config.xml来实现)
UserForm f=(UserForm)form
UserBean bean=new UserBean() //创建后面要处理具体的业务逻辑的javabean(UserBean.java)
return(mapping.findForward(“show”)//通过次来映射到值为show的具体页面,请注意此中的show,在后面还将有关联
4,最后才达到了执行具体的业务逻辑的javabean(UserBean)(连接数据库,把用户信息加到数据库)
UserBean:
Connection conn
insertUser()//把用户信息加入到数据库中的方法
以上这些java代码的功能都很明确了,至于具体的代码我们完全可自己实现
5,接下来做的就是简单的jsp页面处理了
提交表单的jsp页面,主要是表单(user.jsp)(该表单用到struts的html标签,和struts一起工作实现到struts的ActionForm)
form action=”addUser.do“//请记住这个action的值,后面配置中还会用到
6,显示用户信息的页面(showuser.jsp),这页面没什么难处,刚学jsp就能搞定

7,怎样让struts中的这些类来完美的结合在一起工作呢,这就要来配置struts-config.xml文件了
<form-beans>
<form-bean name="userForm" type="package.UserForm"/>//记住name的值,后面会用到
</form-beans>
/*这就是我们上面所设计的struts中actionForm(UserForm)可重用组件*/
<global-forwards>
<forward name="show" path="/showuser.jsp"/>
</global-forwards>
/*其中的name值就是我们在struts类Aaction(UserAction)中的findForward中的值,来映射path中的URI为showuser.jsp页面
这个功能是全局性页面,URI映射*/
<action-mappings>
<action path="/addUser" //path为 5 表单中action值
type="package.UserAction"
name="userForm" //form-bean中的name的值
scope=”request“
validate=”/user.jsp“//指定表单的输入的页面,也就是 5中的
</action>
<action-mappings>


好了,struts中的几个类就工作了

- 作者: 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)

  • 技术特性

    • 界面接口组件和事件模型的第一个类

    • POJO依赖注入(又称控制反转)

    • 客户端独立性

    • 使用或者不使用工具

    • 可扩展的导航(类似于Struts导航,注:Page导航)

    • 强大的扩展能力 (如Shale

    • 完全的集成(如JSP集成Spring

    • 本地化和易理解性

  • 市场和商业特性

    • 广泛的采用,包括SUNOracleIBM,BEA,Apache,EDS

    • 作为J2EE 5.0的部分

    • 大型第三方组件市场(iLog, Business Objects, Oracle, Sun, IBM)

    • 业内领先的工具支持(Sun Java Studio, Oracle JDeveloper, IBM WSAD, NitroX plugin for Eclipse, Exadel Studio)

    • 已经有关于JSF的许多的书上架了

    • Monster上三页长的关于JSF的工作需求

Webwork

  • 核心价值

    • 简单

    • 可测试

    • 可维护

    • 可扩展

  • 对于未知展示层技术的支持,这次JSPVelocity,和其他的展示层技术

  • 对于Http请求映射未逻辑(交互性)活动

  • 通过分层的MVC和模板机制简化组件

Shale

  • 集成JSPJakarta的框架

  • 成为Struts 2.0的提议

  • 作为Struts的子项目

  • Struts类之间没有直接的联系

  • 作为JSF技术的扩展:“JSF 1.0 并没有保护所有的我们需要的东西,所以我们加入目前需求的。所以Shale增加了比如说客户端校验,Ajax,等作为JSF 2.0的铺路石。期间,Shale 作为证明的基础。”

  • Shale的特性

    • Web

    • Ajax

    • SpringTiles的集成

    • 客户端和服务端的校验

    • 类似于Tapestry的展示层的参数化的子树

    • 工具:Back-Button的滥用,文件上载,JNDI API

  • Shale的扩展点

    • ShalePropertyResolver

    • ShaleVariableResolver

    • DialogNavigationHandler

    • ShaleViewHandler

    • TilesViewHandler

  • “如果不知道JSF本身,JSF是非常非常易扩展的”

Tapestry

  • 核心价值:

    • 简化-Web应用不能像火箭科技!

    • 一致性-为页面工作就是为组件工作,为小应用工作就是为大应用工作,不同的开发人员对于相似的问题应该有相似的解决方法

    • 高效性-应用软件应该是高性能和易扩展

    • 反馈-如果有什么地方出现问题了,本框架不会中断,事实上,它会提供一些有用的诊断

  • 工具:

    • 不需要使用工具

    • 可以使用你已经使用的工具.

  • Tapestry 4.0中的新特性(子集):

    • 支持注解

    • 真正优秀的集成能力

    • 管理服务端状态具有更大的弹性,非常高效的获取什么在事务的明细.

    • 支持门户

  • Extensibility可扩展性:

    • Over 180 extension points 超过180个扩展点

    • Built around Component Object Model with many layers 在需要层上集成了组件对象模型

    • Terrific ability to override, change, and customize过载,更改和客户化的强大能力

    • Great support for component libraries which are open source and available.支持开源和可用组件库

  • “对于其他的框架来说,Tapestry是被追赶者!

Wicket

  • 还是一个新生家伙.

  • Wicket是容易的,优雅的,并且是强有力的”

  • 易用:

    • 简化,一致,明显

    • 重用组件

    • 非插入的

    • 安全

    • 效率/可扩展

值得注意的引用:

  •  谁都知道JSF优于Struts,当然,JSFTapestry不相上下

  •  Struts是一所老学校,所以恢复它”

  •  “如果你需要一个像这样的工具,那么你的扩家可能太复杂了”

  •  “你可以说,但是不能让人们去用它”

  •  “如果你要节省你的Struts代码,JSF可以做到”

  • “在事实你可以采用标准的方法去扩展框架,从而达到在某个功能点构建你的扩展,但是事实你不会真在StrutsWebwork上真的这样去做”。有的人说你不需要使用一种想象的事件模型去获得Web应用的重用。

我们的积分卡

TSS尽量用分数来记录决斗,我们对每个框架在两个领域以5分总分作为记录:

  • 技术特性

  • 商业使用

技术特性

框架

分数

原因

JavaServer Faces (JSF)

4.8

JSF赢得大部分分是因为它是第一个真正支持Web组件的。我们的分析师感觉JSF在简单和优雅方面缺乏指控是不当的。JSF是易用的,强大的,并且是革命的。已经存在的ShaleSpring表明JSF的确是可扩展的。

Webwork

4.2

Webwork的多层MVC作为先驱是革命性的,然而我们感觉WebworkHMVC和模板机制于JSF比已经黯然失色,其思想已经融入了JSF中。

Shale

4.95

如果说Shale站的比其他框架高,那是因为它站在巨人的肩膀上。通过扩展JSF,包含了Web流,支持Ajax,集成tiles,客户端检验,我们的感觉是Shale展示了Web框架的需求和机会的未来。

Tapestry

4.75

TapestryWeb组件的先锋,在讨论中谈到的“JSFTapestry不相上下”本非遥远。然而,JSF的标准扩展点,和第一个支持门户的开发对于Tapestry来说是强有力的竞争优势。我们看比赛已经结束,当然我们乐意看到Tapestry支持JSF的标准接口和支持交互性。明确的说,我们喜欢能够用TapesryJSF组件,用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会是合适的选择。我们的挑战是使TapestryJSF表现的更加好只有标准的兼容才能够让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系统
首先我们需要知道Java和J2EE是两个不同概念,Java不只是指一种语言,已经代表与微软不同的另外一个巨大阵营,所以Java有时是指一种软件系统的流派,当然目前主要是.NET和Java两大主流体系。

  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) 加入博采