浏览 9253 次
锁定老帖子 主题:webwork JSP标签支持嵌套语法。
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2005-12-17
<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字节流的长度,如果是中文,就会导致末尾的一些内容丢失。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2005-12-17
TextParseUtil和WebWorkTagSupport都有一个差不多的方法.
假如property的值为<ww:set name="entity" value="%{entity}" /> 代码会引起死循环. http://jira.opensymphony.com/browse/XW-311 |
|
返回顶楼 | |
发表时间:2005-12-17
去jira提起一个问题吧 应该会很快解决的
sitemesh的那个问题应该已经改了(CVS上),我在sitemesh论坛上说的,然后改过一次了,不知道改对了没有? (嘿嘿,似乎是这样) http://forums.opensymphony.com/thread.jspa?messageID=14349㠍 http://jira.opensymphony.com/browse/SIM-157 |
|
返回顶楼 | |
发表时间: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}" /> |
|
返回顶楼 | |
发表时间:2005-12-19
lllyq 写道 照你这样修改性能有损失,但是只是为了满足很少的需求,不划算。 <ww:property value="%{#stack.findValue(#entity+'.' + #fieldName}" /> 哦,我没看出来性能怎么损失? 可以具体说明一下吗? |
|
返回顶楼 | |
发表时间:2005-12-19
sorry,刚才没看源码,你这样说我就去看看了,确实没有效率问题。不过想到另一个问题,%{,}看起来只能出现在首尾才是正确的,开启altSyntax后,ww不处理%{}之外的信息。
|
|
返回顶楼 | |
发表时间: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> |
|
返回顶楼 | |