JSP2.1 Deferred Expression的一点笔记

Deferred Expression是JSP2.1中的新特性, 说白了就是因为原来JSF中有了这个,然后想把JSP和JSF的EL都给统一起来, 就弄了Unified Expression Language, Sun的文档也讲了一些. 规范也讲了一些.
 
看看Sun的关于这个的一些code:
 
在JEETCK CTS5中,这是一个最简单的用法, 其实没有体现Deferred Value这个Deferred的作用, 只是说了如何用.
JSP: 是这样在JSP页面调用的.
xml 代码
 
  1. <test:ELDeferredValueValueTag litExpr="foo" poundExpr="#{foo}"/>  
这里这个poundExpr是Deferred Expression.
<test:eldeferredvaluevaluetag litexpr="foo" poundexpr="&amp;lt;b&gt;#{foo}&lt;/b&gt;"></test:eldeferredvaluevaluetag>
 
TLD: 这里面决定是否用Deferred, 其实配置起来还有许多变化.
    <attribute></attribute>
xml 代码
 
  1. <attribute>  
  2.   <name>poundExprname>  
  3.   <required>truerequired>  
  4.   <deferred-value>    //here define to be deferred expression value   
  5.     <type>java.lang.Stringtype>  
  6.   deferred-value>  
  7. attribute>  

   
 
ELDeferredValueValueTag:具体用还是要在Tag Handler中体现, 这里是个simple tag. 
这里用的是ValueExpression, 也是JSP2.1中新引入的. 
java 代码
 
  1. public void setPoundExpr(ValueExpression poundExpr) {//here must use ValueExpression   
  2.     this.poundExpr = poundExpr;   
  3. }   
  4. public void doTag() {   
  5.     ...   
  6.     String poundVal = (String) poundExpr.getValue(elContext);   
  7.     ...   
  8. }  

But not show how deferred expression works
因为TCK中没有讲到如何个deferred法, 然后去看看JSF的实现.
In JSF RI:
JSP:
<h:inputtext value="#{color}}"></h:inputtext>
 
  1. <h:inputText value="#{color}}" />  
html_basic.tld:
 
  1. <tag-class>  
  2.     com.sun.faces.taglib.html_basic.InputTextTag   
  3. tag-class>  
  4. <tei-class>  
  5.     com.sun.faces.taglib.FacesTagExtraInfo   
  6. tei-class>  
  7. <attribute>  
  8.     <description>  
  9.           
  10.     description>  
  11.     <name>  
  12.         value   
  13.     name>  
  14.     <required>  
  15.         false   
  16.     required>  
  17.     <deferred-value>  
  18.         <type>  
  19.             java.lang.Object   
  20.         type>  
  21.     deferred-value>  
  22. attribute>  
  23. <attribute>  

<tag-class></tag-class>
  Tag handler file:
InputTextTag.setProperties() //set the value to UIComponent
    UIComponentELTag.createComponent
 
javax.faces.component.UIInput
在JSF中还没有发现更多的, 主要是对JSF还不是很熟悉, 看来得先看看JSF.
之前一直想看看单纯用JSP如何使用deferred expresstion的, 但现在一想, jsp只有request/response这一个阶段, 因此不好用. 但JSF也是用jsp实现的, 它是如何实现多个phase的呢?
http://angraze.wordpress.com/2006/10/03/the-jsfjsp-el-mess/ 这篇文章似乎抨击sun的策略, 认为sun这样搞得很混乱.
猜测一下JSF是这样处理deferred expression的:
1. 用javascript把页面某个field跟某个ValueExpression对象关联起来
2. 在不同的lifecycle phase, 把页面某个field跟ValueExpression对象进行同步.
3. 一开始,evaluate expression的值, 然后javascript把值传给后台, 通过UIInput set property到封装的ValueExpression上.
4.在后面的phase, 需要重新evaluate这个expression的值, 则又先get property,通过javascript修改页面的element
 
得再看JSF.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值