论坛首页 Java企业应用论坛

webwork JSP标签支持嵌套语法。

浏览 9253 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-12-17  
原来ww:property标签做的稍微有点不好,不支持嵌套语法,比如这样:
<ww:set name="entity" value="student" />
<ww:set name="fieldName" value="id" />
<ww:property value="#entity.%{#fieldName}" />

我 希望ww能够parse那段ognl为getStudent().getId() .
很不幸,ww死活不工作,看了PropertyTag的源代码,不知道Patrick Lightbody老大为什么没有先translateVariables(ognlExpression..),而是直接调用getStack().findValue(...) ,那一个可爱的可以对%{ ..}进行预编译的方法:translateVariables(String expression, OgnlValueStack stack)  ,写得这么漂亮,居然没用。
我一看,觉得太可惜了,在原来PropertyTag.java里Only加多一行代码就可以让property tag具备语法嵌套功能,不用简直太可惜了,修改如下:
原来代码:

            
            actualValue = this.getStack();.findValue(value, String.class);;

            if (actualValue != null); {
                pageContext.getOut();.print(prepare(actualValue););;
            } else if (defaultValue != null); {
                pageContext.getOut();.print(prepare(defaultValue););;
            }


改为:
    String actualExpression = translateVariables(value, getStack(););;
            actualValue = this.getStack();.findValue(actualExpression, String.class);;

            if (actualValue != null); {
                pageContext.getOut();.print(prepare(actualValue););;
            } else if (defaultValue != null); {
                pageContext.getOut();.print(prepare(defaultValue););;
            }


这个增强的标签估计大家伙也不大会用得上,在一些需要比较动态的,复杂一些的jsp中可能会用到,比如动态显示对象列表的某些属性列表。

大家觉得自己可以用的话,就使用吧。 改天再到ww wiki上说一下。

另外还有sitemesh那个PageFilter的问题,这里顺带跟大家伙提一个醒,
原来的PageFilter有一行代码是有bug的,
response.setContentLength(page.getLength() );
这一句好像是出现在PageFilter.java的writeOriginalContent方法里,因为中文是两个字节的,page.getLength()是按照UNICODE的CHAR来算长度的,而Response.setContentLength 时表示要发送的ISO-8859-1字节的长度,这样用Unicode的length来设置ISO-8859-1字节流的长度,如果是中文,就会导致末尾的一些内容丢失。
   发表时间:2005-12-17  
TextParseUtil和WebWorkTagSupport都有一个差不多的方法.

假如property的值为&lt;ww:set name="entity" value="%{entity}" /&gt;
代码会引起死循环.
http://jira.opensymphony.com/browse/XW-311
0 请登录后投票
   发表时间:2005-12-17  
去jira提起一个问题吧 应该会很快解决的

sitemesh的那个问题应该已经改了(CVS上),我在sitemesh论坛上说的,然后改过一次了,不知道改对了没有?  (嘿嘿,似乎是这样)

http://forums.opensymphony.com/thread.jspa?messageID=14349&#14349

http://jira.opensymphony.com/browse/SIM-157
0 请登录后投票
   发表时间:2005-12-19  
firebody 写道
原来ww:property标签做的稍微有点不好,不支持嵌套语法,比如这样:
<ww:set name="entity" value="student" />
<ww:set name="fieldName" value="id" />
<ww:property value="#entity.%{#fieldName}" />

我 希望ww能够parse那段ognl为getStudent().getId() .
很不幸,ww死活不工作,看了PropertyTag的源代码,不知道Patrick Lightbody老大为什么没有先translateVariables(ognlExpression..),而是直接调用getStack().findValue(...) ,那一个可爱的可以对%{ ..}进行预编译的方法:translateVariables(String expression, OgnlValueStack stack)  ,写得这么漂亮,居然没用。
我一看,觉得太可惜了,在原来PropertyTag.java里Only加多一行代码就可以让property tag具备语法嵌套功能,不用简直太可惜了,修改如下:
原来代码:

            
            actualValue = this.getStack();.findValue(value, String.class);;

            if (actualValue != null); {
                pageContext.getOut();.print(prepare(actualValue););;
            } else if (defaultValue != null); {
                pageContext.getOut();.print(prepare(defaultValue););;
            }


改为:
    String actualExpression = translateVariables(value, getStack(););;
            actualValue = this.getStack();.findValue(actualExpression, String.class);;

            if (actualValue != null); {
                pageContext.getOut();.print(prepare(actualValue););;
            } else if (defaultValue != null); {
                pageContext.getOut();.print(prepare(defaultValue););;
            }


这个增强的标签估计大家伙也不大会用得上,在一些需要比较动态的,复杂一些的jsp中可能会用到,比如动态显示对象列表的某些属性列表。

大家觉得自己可以用的话,就使用吧。 改天再到ww wiki上说一下。

另外还有sitemesh那个PageFilter的问题,这里顺带跟大家伙提一个醒,
原来的PageFilter有一行代码是有bug的,
response.setContentLength(page.getLength() );
这一句好像是出现在PageFilter.java的writeOriginalContent方法里,因为中文是两个字节的,page.getLength()是按照UNICODE的CHAR来算长度的,而Response.setContentLength 时表示要发送的ISO-8859-1字节的长度,这样用Unicode的length来设置ISO-8859-1字节流的长度,如果是中文,就会导致末尾的一些内容丢失。


照你这样修改性能有损失,但是只是为了满足很少的需求,不划算。
<ww:property value="%{#stack.findValue(#entity+'.' + #fieldName}" />
0 请登录后投票
   发表时间:2005-12-19  
lllyq 写道

照你这样修改性能有损失,但是只是为了满足很少的需求,不划算。
<ww:property value="%{#stack.findValue(#entity+'.' + #fieldName}" />

哦,我没看出来性能怎么损失? 可以具体说明一下吗?
0 请登录后投票
   发表时间:2005-12-19  
sorry,刚才没看源码,你这样说我就去看看了,确实没有效率问题。不过想到另一个问题,%{,}看起来只能出现在首尾才是正确的,开启altSyntax后,ww不处理%{}之外的信息。
0 请登录后投票
   发表时间:2005-12-21  
用jsp2。0的特性写taglb(分开写tag的属性和body),应该可以解决这个问题把(不用改tag源码的情况下),我的一个代码片断:
        <wall:a> 
                <jsp:attribute name=”href”> 
                        <c:out value="${link.href}"/> 
                </jsp:attribute> 
                <jsp:body> 
                        <c:out value="${link.description}"/> 
                </jsp:body> 
        </wall:a> 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics