代码改变世界

关注WebWork(三)

2005-11-11 12:20  FantasySoft  阅读(2850)  评论(6编辑  收藏  举报

        在昨天所写的关注WebWork系列的第二篇中,留下了一个问题:在使用WebWork自定义UI标签的时候,为标签的属性赋值是否要加上单引号。现在这个问题有了答案。在讲述这个问题之前,我不得不再次为自己不严谨、不细心做一个自我检讨,但愿下次不要在犯这样的错误了。
        其实,这个问题的解决方法很简单,书中的代码也没有问题,而且我使用的单引号方式也没有错。让我迷惑的根本原因是我漏掉了webwork.properties这个配置文件,而且在这个配置文件有一个非常重要的属性:webwork.tag.altSyntax。书中代码没有包含单引号是因为这个属性值设为了true,而我没有设置这个属性值,所以在自己的代码中不加单引号便会出现错误,加上单引号才能得到正确的结果。说到这里,我还得再次鄙视一下自己的粗心,书中的[ 2.2.3 Creating the webwork.
properties configuration file ]一节中就把这个配置要求讲得很清楚了,但是我却把这个遗忘了,真的该挨板砖了。现在问题解决了,但是这个属性值代表了什么意思呢?
        从webwork.tag.altSyntax的字面上看,这个属性与tag相关,而且altSyntax中的alt就是alternative的意思,那么与Syntax合在一起,就应该表示另外一种可供选择的语法了。在查阅了相关文档,包括《WebWork In Action》的第三章之后,对这个属性有了比较全面的认识。在WebWork2.1.7中,altSyntax的default值为false,在这种情况下并不支持新的语法。那么在旧的语法中,如果要为标签的某一属性设置String类型的值,就必须给这个值加上单引号了,这是由WebWork所支持的OGNL语法决定的。如果你不使用单引号将用以赋值的value括起来的话,那么这个value将会被认为是存在于Value Stack的Object所对应的key,在标签被parse的过程中,就会以这个value为key到Value Stack中找对应的内容,结果是可想而知的了——找不到,因为你根本就没有往Value Stack中增加这样的键值对。以昨天的Post中的代码为例:
         <ww:textfield label="Please enter your name:" name="name" />
在旧的语法体系里,textfield标签被parse的过程中,label的值"Please enter your name:"会被当作是一个Key,从Value Stack中找相应的内容,并返回找到的内容作为label属性的值。这很明显是拿不到具体的值的,最后将会返回一个空字符串。这正好与昨天出现的错误情况是吻合的。为了直接给label设置String值,我们就要使用单引号将具体的String值括起来了。这样的语法确实很灵活,你可以让JSP拥有更多的动态性,但是不好的地方也很明显,页面将会充斥着单引号和双引号的混合体,代码将难以维护。于是,新的语法被提了出来:使用%{...}来指明某一个部分需要到Value Stack中取值,这样就可以将多余的单引号去掉了。为了使用新的语法,我们就必须将altSyntax设为true。这一点在WebWork2.1.7的使用过程中,尤为需要注意的。
        最后再强调一点,在WebWork2.2中,将会全面启用新的语法,也就是altSyntax的默认值为true了,甚至压根就会把这个属性值给去掉。所以,大家还是应该以新的语法为准,而且新的语法会更好用,你说呢?
   
        昨天的Post中,我还提到了WebWork的UI标签无法直接应用CSS,得出这个结论也真的该被打PP了。其实,想应用CSS到UI标签中,譬如textfield,是可以的,只是属性名从style变为了cssStyle,class变为了classStyle。[1] 看来,我是错怪WebWork的UI标签了。不过,话也说回来,为什么要将这两个属性名改掉呢?
        光棍节的WebWork关注报道就到这里,我们下次再会。:) 

       [1] Textfield tag in WebWork