【zk开发】注解强化Composer

Java代码 复制代码  收藏代码
  1. import java.text.DecimalFormat;   
  2. import java.text.ParseException;   
  3. import java.util.List;   
  4.   
  5. import org.zkoss.zk.ui.Component;   
  6. import org.zkoss.zk.ui.util.GenericAutowireComposer;   
  7. import org.zkoss.zkplus.databind.AnnotateDataBinder;   
  8. import org.zkoss.zkplus.databind.DataBinder;   
  9.   
  10. import com.sun4love.common.web.zk.converter.SexRadiogroupConverter;   
  11.   
  12. /**  
  13.  * 注解绑定类  
  14.  * <p>  
  15.  * 在GenericAutowireComposer基础上对注解进行增强, 因此你无需再页面上显式添加注解支持指令  
  16.  *   
  17.  * <pre>  
  18.  * &lt;?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?&gt;  
  19.  * </pre>  
  20.  * <p>  
  21.  *   
  22.  * @author sun4love  
  23.  *   
  24.  */  
  25. abstract public class GenericDataBinderComposer extends GenericAutowireComposer {   
  26.     private static final long serialVersionUID = -8962566563467903754L;   
  27.     protected DataBinder binder;   
  28.   
  29.     @Override  
  30.     public void doAfterCompose(Component comp) throws Exception {   
  31.         super.doAfterCompose(comp);   
  32.         binder = new AnnotateDataBinder(comp);   
  33.         comp.setAttribute("binder", binder);   
  34.     }   
  35.   
  36.     protected void loadAll() {   
  37.         binder.loadAll();   
  38.     }   
  39.   
  40.     protected void loadAttribute(Component comp, String attr) {   
  41.         binder.loadAttribute(comp, attr);   
  42.     }   
  43.   
  44.     protected void loadComponent(Component comp) {   
  45.         binder.loadComponent(comp);   
  46.     }   
  47.   
  48.     /**  
  49.      * 绑定bean到ui组件上  
  50.      * <p>  
  51.      * 范例  
  52.      * <hr />  
  53.      *   
  54.      * <pre>  
  55.      * <code>  
  56.      * &lt;window id=&quot;userWin&quot; apply=&quot;GenericDataBinderComposerChild&quot;&gt;  
  57.      *    &lt;textbox id=&quot;txtFirstName&quot; /&gt;  
  58.      *    &lt;textbox id=&quot;txtlastName&quot; /&gt;  
  59.      *    &lt;label id=&quot;lblFullName&quot; /&gt;  
  60.      * &lt;/window&gt;  
  61.      * GenericDataBinderComposerChild类  
  62.      *   
  63.      * public GenericDataBinderComposerChild extends GenericDataBinderComposer{  
  64.      *      private Textbox txtFirstName;  
  65.      *      private Textbox txtLastName;  
  66.      *      private Label lblFullName;  
  67.      *   
  68.      *      public void doAfterCompose(Component comp) throws Exception {  
  69.      *          super.doAfterCompose(comp);  
  70.      *          binder.addBinding(txtFirstName, "value", "userWin$composer.user.firstName");  
  71.      *          binder.addBinding(txtLastName, "value", "userWin$composer.user.lastName");  
  72.      *   
  73.      *          //"txtLastName.onBlur"中的txtLastName是页面上&lt;textbox id=&quot;txtlastName&quot; /&gt;  
  74.      *          //userWin$composer中的userWin是页面上window的id,$.composer是固定格式  
  75.      *          addBinding(lblFullName, "value", "userWin$composer.user.fullName","txtLastName.onBlur" , null,null,null);  
  76.      *      }  
  77.      * }  
  78.      * </pre>  
  79.      *   
  80.      * @param comp  
  81.      *            ui组件  
  82.      * @param attr  
  83.      *            ui组件的属性,例如&lt;textbox value="@{user.name}"/&gt;中的value  
  84.      * @param expr  
  85.      *            表达式,例如,例如&lt;textbox value="@{user.name}"/&gt;中的user.name  
  86.      * @param loadWhenEvents  
  87.      *            加载bean到ui的时机,例如comp1.onClck、comp2、onBlur、comp3.onSelect,  
  88.      *            等同于&lt;textbox id=&quot;txtFullName&quot;  
  89.      *            value=&quot;@{user.fullName, load-when=   
  90.      *            'txtLastName.onBlur'}&quot;/&gt;中的txtLastName.onBlur  
  91.      * @param saveWhenEvent  
  92.      *            保存ui value到bean的时机,例如comp3.onBlur, 等同于&lt;textbox  
  93.      *            id=&quot;txtFullName&quot; value=&quot;@{user.fullName,  
  94.      *            save-when=   
  95.      *            'txtFullName.onBlur',}&quot;/&gt;中的txtFullName.onBlur  
  96.      * @param access  
  97.      *            访问安全性,允许保存ui value 到bean,还是是load bean到ui,还是两者都是,或者什么都不做,  
  98.      *            可选值为none,save,load,both(save/load),  
  99.      * @param converter  
  100.      *            转换器,ui到bean之间的互相转换,类似hibernate jdbc type到db type或者struts中的转换器  
  101.      *            ,样例见{@link SexRadiogroupConverter}  
  102.      */  
  103.     protected void addBinding(Component comp, String attr, String expr,   
  104.             String loadWhenEvent, String saveWhenEvent, String access,   
  105.             String converter) {   
  106.         if (loadWhenEvent != null && "".equals(loadWhenEvent.trim())) {   
  107.             binder.addBinding(comp, attr, expr, (List) null, saveWhenEvent,   
  108.                     access, converter);   
  109.         } else {   
  110.             binder.addBinding(comp, attr, expr, new String[] { loadWhenEvent },   
  111.                     saveWhenEvent, access, converter);   
  112.         }   
  113.        
  114.     }   
  115.   
  116.     /**  
  117.      * 绑定bean到ui组件上  
  118.      * <p>  
  119.      * 范例  
  120.      * <hr />  
  121.      *   
  122.      * <pre>  
  123.      * 页面  
  124.      * &lt;window id=&quot;userWin&quot; apply=&quot;GenericDataBinderComposerChild&quot;&gt;  
  125.      *    &lt;textbox id=&quot;txtFirstName&quot; /&gt;  
  126.      *    &lt;textbox id=&quot;txtlastName&quot; /&gt;  
  127.      *    &lt;label id=&quot;lblFullName&quot; /&gt;  
  128.      * &lt;/window&gt;  
  129.      * GenericDataBinderComposerChild类  
  130.      *   
  131.      * public GenericDataBinderComposerChild extends GenericDataBinderComposer{  
  132.      *      private Textbox txtFirstName;  
  133.      *      private Textbox txtLastName;  
  134.      *      private Label lblFullName;  
  135.      *   
  136.      *      public void doAfterCompose(Component comp) throws Exception {  
  137.      *          super.doAfterCompose(comp);  
  138.      *          binder.addBinding(txtFirstName, "value", "userWin$composer.user.firstName");  
  139.      *          binder.addBinding(txtLastName, "value", "userWin$composer.user.lastName");  
  140.      *   
  141.      *          //"txtLastName.onBlur"中的txtLastName是页面上&lt;textbox id=&quot;txtlastName&quot; /&gt;  
  142.      *          //userWin$composer中的userWin是页面上window的id,$.composer是固定格式  
  143.      *          addBinding(lblFullName, "value", "userWin$composer.user.fullName","txtLastName.onBlur" , null,null,null);  
  144.      *      }  
  145.      * }  
  146.      * </pre>  
  147.      *   
  148.      * @param comp  
  149.      *            ui组件  
  150.      * @param attr  
  151.      *            ui组件的属性,例如&lt;textbox value="@{user.name}"/&gt;中的value  
  152.      * @param expr  
  153.      *            表达式,例如,例如&lt;textbox value="@{user.name}"/&gt;中的user.name  
  154.      * @param access  
  155.      *            访问安全性,允许保存ui value 到bean,还是是load bean到ui,还是两者都是,或者什么都不做,  
  156.      *            可选值为none,save,load,both(save/load),  
  157.      */  
  158.     protected void addBinding(Component comp, String attr, String expr,   
  159.             String access) {   
  160.         binder.addBinding(comp, attr, expr, (List) null, (List) null, access,   
  161.                 null);   
  162.     }   
  163.   
  164.     /**  
  165.      * 绑定bean到ui组件上  
  166.      * <p>  
  167.      * 范例  
  168.      * <hr />  
  169.      *   
  170.      * <pre>  
  171.      * &lt;window id=&quot;userWin&quot; apply=&quot;GenericDataBinderComposerChild&quot;&gt;  
  172.      *    &lt;textbox id=&quot;txtFirstName&quot; /&gt;  
  173.      *    &lt;textbox id=&quot;txtlastName&quot; /&gt;  
  174.      *    &lt;label id=&quot;lblFullName&quot; /&gt;  
  175.      * &lt;/window&gt;  
  176.      * GenericDataBinderComposerChild类  
  177.      *   
  178.      * public GenericDataBinderComposerChild extends GenericDataBinderComposer{  
  179.      *      private Textbox txtFirstName;  
  180.      *      private Textbox txtLastName;  
  181.      *      private Label lblFullName;  
  182.      *   
  183.      *      public void doAfterCompose(Component comp) throws Exception {  
  184.      *          super.doAfterCompose(comp);  
  185.      *          binder.addBinding(txtFirstName, "value", "userWin$composer.user.firstName");  
  186.      *          binder.addBinding(txtLastName, "value", "userWin$composer.user.lastName");  
  187.      *   
  188.      *          //"txtLastName.onBlur"中的txtLastName是页面上&lt;textbox id=&quot;txtlastName&quot; /&gt;  
  189.      *          //userWin$composer中的userWin是页面上window的id,$.composer是固定格式  
  190.      *          addBinding(lblFullName, "value", "userWin$composer.user.fullName","txtLastName.onBlur" , null,null,null);  
  191.      *      }  
  192.      * }  
  193.      *   
  194.      * </pre>  
  195.      *   
  196.      * @param comp  
  197.      *            ui组件  
  198.      * @param attr  
  199.      *            ui组件的属性,例如&lt;textbox value="@{user.name}"/&gt;中的value  
  200.      * @param expr  
  201.      *            表达式,例如,例如&lt;textbox value="@{user.name}"/&gt;中的user.name  
  202.      * @param loadWhenEvents  
  203.      *            加载bean到ui的时机,例如comp1.onClck、comp2、onBlur、comp3.onSelect,  
  204.      *            等同于&lt;textbox id=&quot;txtFullName&quot;  
  205.      *            value=&quot;@{user.fullName, load-when=   
  206.      *            'txtLastName.onBlur'}&quot;/&gt;中的txtLastName.onBlur  
  207.      * @param access  
  208.      *            访问安全性,允许保存ui value 到bean,还是是load bean到ui,还是两者都是,或者什么都不做,  
  209.      *            可选值为none,save,load,both(save/load),  
  210.      * @param converter  
  211.      *            转换器,ui到bean之间的互相转换,类似hibernate jdbc type到db type或者struts中的转换器  
  212.      *            ,样例见{@link SexRadiogroupConverter}  
  213.      */  
  214.     protected void addBinding(Component comp, String attr, String expr,   
  215.             String access, String converter) {   
  216.         binder.addBinding(comp, attr, expr, (List) null, (List) null, access,   
  217.                 converter);   
  218.     }   
  219.   
  220. }  
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.List;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericAutowireComposer;
import org.zkoss.zkplus.databind.AnnotateDataBinder;
import org.zkoss.zkplus.databind.DataBinder;

import com.sun4love.common.web.zk.converter.SexRadiogroupConverter;

/**
 * 注解绑定类
 * <p>
 * 在GenericAutowireComposer基础上对注解进行增强, 因此你无需再页面上显式添加注解支持指令
 * 
 * <pre>
 * &lt;?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?&gt;
 * </pre>
 * <p>
 * 
 * @author sun4love
 * 
 */
abstract public class GenericDataBinderComposer extends GenericAutowireComposer {
	private static final long serialVersionUID = -8962566563467903754L;
	protected DataBinder binder;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		binder = new AnnotateDataBinder(comp);
		comp.setAttribute("binder", binder);
	}

	protected void loadAll() {
		binder.loadAll();
	}

	protected void loadAttribute(Component comp, String attr) {
		binder.loadAttribute(comp, attr);
	}

	protected void loadComponent(Component comp) {
		binder.loadComponent(comp);
	}

	/**
	 * 绑定bean到ui组件上
	 * <p>
	 * 范例
	 * <hr />
	 * 
	 * <pre>
	 * <code>
	 * &lt;window id=&quot;userWin&quot; apply=&quot;GenericDataBinderComposerChild&quot;&gt;
	 *    &lt;textbox id=&quot;txtFirstName&quot; /&gt;
	 *    &lt;textbox id=&quot;txtlastName&quot; /&gt;
	 *    &lt;label id=&quot;lblFullName&quot; /&gt;
	 * &lt;/window&gt;
	 * GenericDataBinderComposerChild类
	 * 
	 * public GenericDataBinderComposerChild extends GenericDataBinderComposer{
	 * 		private Textbox txtFirstName;
	 * 		private Textbox txtLastName;
	 * 		private Label lblFullName;
	 * 
	 * 		public void doAfterCompose(Component comp) throws Exception {
	 * 			super.doAfterCompose(comp);
	 * 			binder.addBinding(txtFirstName, "value", "userWin$composer.user.firstName");
	 * 			binder.addBinding(txtLastName, "value", "userWin$composer.user.lastName");
	 * 
	 * 			//"txtLastName.onBlur"中的txtLastName是页面上&lt;textbox id=&quot;txtlastName&quot; /&gt;
	 * 			//userWin$composer中的userWin是页面上window的id,$.composer是固定格式
	 * 			addBinding(lblFullName, "value", "userWin$composer.user.fullName","txtLastName.onBlur" , null,null,null);
	 * 		}
	 * }
	 * </pre>
	 * 
	 * @param comp
	 *            ui组件
	 * @param attr
	 *            ui组件的属性,例如&lt;textbox value="@{user.name}"/&gt;中的value
	 * @param expr
	 *            表达式,例如,例如&lt;textbox value="@{user.name}"/&gt;中的user.name
	 * @param loadWhenEvents
	 *            加载bean到ui的时机,例如comp1.onClck、comp2、onBlur、comp3.onSelect,
	 *            等同于&lt;textbox id=&quot;txtFullName&quot;
	 *            value=&quot;@{user.fullName, load-when= 
	 *            'txtLastName.onBlur'}&quot;/&gt;中的txtLastName.onBlur
	 * @param saveWhenEvent
	 *            保存ui value到bean的时机,例如comp3.onBlur, 等同于&lt;textbox
	 *            id=&quot;txtFullName&quot; value=&quot;@{user.fullName,
	 *            save-when= 
	 *            'txtFullName.onBlur',}&quot;/&gt;中的txtFullName.onBlur
	 * @param access
	 *            访问安全性,允许保存ui value 到bean,还是是load bean到ui,还是两者都是,或者什么都不做,
	 *            可选值为none,save,load,both(save/load),
	 * @param converter
	 *            转换器,ui到bean之间的互相转换,类似hibernate jdbc type到db type或者struts中的转换器
	 *            ,样例见{@link SexRadiogroupConverter}
	 */
	protected void addBinding(Component comp, String attr, String expr,
			String loadWhenEvent, String saveWhenEvent, String access,
			String converter) {
		if (loadWhenEvent != null && "".equals(loadWhenEvent.trim())) {
			binder.addBinding(comp, attr, expr, (List) null, saveWhenEvent,
					access, converter);
		} else {
			binder.addBinding(comp, attr, expr, new String[] { loadWhenEvent },
					saveWhenEvent, access, converter);
		}
	
	}

	/**
	 * 绑定bean到ui组件上
	 * <p>
	 * 范例
	 * <hr />
	 * 
	 * <pre>
	 * 页面
	 * &lt;window id=&quot;userWin&quot; apply=&quot;GenericDataBinderComposerChild&quot;&gt;
	 *    &lt;textbox id=&quot;txtFirstName&quot; /&gt;
	 *    &lt;textbox id=&quot;txtlastName&quot; /&gt;
	 *    &lt;label id=&quot;lblFullName&quot; /&gt;
	 * &lt;/window&gt;
	 * GenericDataBinderComposerChild类
	 * 
	 * public GenericDataBinderComposerChild extends GenericDataBinderComposer{
	 * 		private Textbox txtFirstName;
	 * 		private Textbox txtLastName;
	 * 		private Label lblFullName;
	 * 
	 * 		public void doAfterCompose(Component comp) throws Exception {
	 * 			super.doAfterCompose(comp);
	 * 			binder.addBinding(txtFirstName, "value", "userWin$composer.user.firstName");
	 * 			binder.addBinding(txtLastName, "value", "userWin$composer.user.lastName");
	 * 
	 * 			//"txtLastName.onBlur"中的txtLastName是页面上&lt;textbox id=&quot;txtlastName&quot; /&gt;
	 * 			//userWin$composer中的userWin是页面上window的id,$.composer是固定格式
	 * 			addBinding(lblFullName, "value", "userWin$composer.user.fullName","txtLastName.onBlur" , null,null,null);
	 * 		}
	 * }
	 * </pre>
	 * 
	 * @param comp
	 *            ui组件
	 * @param attr
	 *            ui组件的属性,例如&lt;textbox value="@{user.name}"/&gt;中的value
	 * @param expr
	 *            表达式,例如,例如&lt;textbox value="@{user.name}"/&gt;中的user.name
	 * @param access
	 *            访问安全性,允许保存ui value 到bean,还是是load bean到ui,还是两者都是,或者什么都不做,
	 *            可选值为none,save,load,both(save/load),
	 */
	protected void addBinding(Component comp, String attr, String expr,
			String access) {
		binder.addBinding(comp, attr, expr, (List) null, (List) null, access,
				null);
	}

	/**
	 * 绑定bean到ui组件上
	 * <p>
	 * 范例
	 * <hr />
	 * 
	 * <pre>
	 * &lt;window id=&quot;userWin&quot; apply=&quot;GenericDataBinderComposerChild&quot;&gt;
	 *    &lt;textbox id=&quot;txtFirstName&quot; /&gt;
	 *    &lt;textbox id=&quot;txtlastName&quot; /&gt;
	 *    &lt;label id=&quot;lblFullName&quot; /&gt;
	 * &lt;/window&gt;
	 * GenericDataBinderComposerChild类
	 * 
	 * public GenericDataBinderComposerChild extends GenericDataBinderComposer{
	 * 		private Textbox txtFirstName;
	 * 		private Textbox txtLastName;
	 * 		private Label lblFullName;
	 * 
	 * 		public void doAfterCompose(Component comp) throws Exception {
	 * 			super.doAfterCompose(comp);
	 * 			binder.addBinding(txtFirstName, "value", "userWin$composer.user.firstName");
	 * 			binder.addBinding(txtLastName, "value", "userWin$composer.user.lastName");
	 * 
	 * 			//"txtLastName.onBlur"中的txtLastName是页面上&lt;textbox id=&quot;txtlastName&quot; /&gt;
	 * 			//userWin$composer中的userWin是页面上window的id,$.composer是固定格式
	 * 			addBinding(lblFullName, "value", "userWin$composer.user.fullName","txtLastName.onBlur" , null,null,null);
	 * 		}
	 * }
	 * 
	 * </pre>
	 * 
	 * @param comp
	 *            ui组件
	 * @param attr
	 *            ui组件的属性,例如&lt;textbox value="@{user.name}"/&gt;中的value
	 * @param expr
	 *            表达式,例如,例如&lt;textbox value="@{user.name}"/&gt;中的user.name
	 * @param loadWhenEvents
	 *            加载bean到ui的时机,例如comp1.onClck、comp2、onBlur、comp3.onSelect,
	 *            等同于&lt;textbox id=&quot;txtFullName&quot;
	 *            value=&quot;@{user.fullName, load-when= 
	 *            'txtLastName.onBlur'}&quot;/&gt;中的txtLastName.onBlur
	 * @param access
	 *            访问安全性,允许保存ui value 到bean,还是是load bean到ui,还是两者都是,或者什么都不做,
	 *            可选值为none,save,load,both(save/load),
	 * @param converter
	 *            转换器,ui到bean之间的互相转换,类似hibernate jdbc type到db type或者struts中的转换器
	 *            ,样例见{@link SexRadiogroupConverter}
	 */
	protected void addBinding(Component comp, String attr, String expr,
			String access, String converter) {
		binder.addBinding(comp, attr, expr, (List) null, (List) null, access,
				converter);
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值