学习了一下wicket

    读的是 wl95421的《wicket开发指南-简体中文版》,我之前没有接触过Tapestry,据说wicket借鉴了很多Tapestry的特性并做了相当的简化。上手几个demo后,感觉跟C/S的开发有点像,特别是类似delphi的组件型开发方式。一个页面有一个Page和markup组成,Page继承WebPage负责页面的输出,而markup文件描述界面,真正做到了html页面与java代码的分离,对网页编辑工具友好。wicket是通过在html中添加id来实现分离,比如:
<!----> < label  wicket:id ="name" > 这里输出名字 </ label >

在Page中添加要输出的文字:
<!----> this .add( new  Label( " name " , " dennis zane " ));

    wicket与swing的设计理念一致,遵循MVC模式,Model用于提供数据,View是普通的html文件(markup文件),Controller是一个一个Page类。wicket同样提供了很多的控件,这样的开发方式非常类似ASP.net或者JSF,特别是一些高级控件的功能很强悍,比如Tree、TreeTable、GridView等等。感觉这个框架适合做快速开发,适用于中小型项目,因为此类项目的UI改动频率比较大,同时代码的侵入性太大。其他没什么好谈的,关于具体的开发请参考文档了,比较少见的是与spring的集成,有一个wicket-spring的扩展包可以实现将spring容器管理的bean注入wicket的Page中,比如UserPage调用UserService:
<!---->          @SpringBean
        
private  UserService service;
采用annotation标注。最后给个例子吧,整数的四则运算,首先看markup:
<!----> < html >
< title > 加法计算 </ title >
< body >
< center >
< span  wicket:id  ="feedback" > 这里用来输出信息 </ span >
< form  wicket:id ="form" >
  
< input  type ="text"  size ='10'  wicket:id ="a" /> &nbsp; < select  wicket:id ="oper" ></ select > &nbsp;   < input  type ="text"  size ='10'  wicket:id ="b" /> &nbsp; = &nbsp; < label  wicket:id ="result" ></ label >
  
< br >< wicket:id  ="sumit" > add </ a >
</ form >
</ center >
</ body >
</ html >

一个feedback控件用于返回提示消息,两个text控件用于输入,一个下拉框用于选择运算符,另外一个标签显示结果了,普通的html代码,没有什么好解释的。再看TestPage.java:
<!----> import  java.io.Serializable;
import  java.util.ArrayList;
import  java.util.List;

import  wicket.Component;
import  wicket.markup.html.WebPage;
import  wicket.markup.html.basic.Label;
import  wicket.markup.html.form.DropDownChoice;
import  wicket.markup.html.form.Form;
import  wicket.markup.html.form.SubmitLink;
import  wicket.markup.html.form.TextField;
import  wicket.markup.html.panel.FeedbackPanel;
import  wicket.model.Model;

public   class  TestPage  extends  WebPage {

    
private   static  List opers  =   new  ArrayList();
    
static  {
        opers.add(
" + " );
        opers.add(
" * " );
        opers.add(
" - " );
        opers.add(
" / " );
    }

    
private  String oper  =   " + " ;

    
private   double  result  =   0 ;

    
private   double  a  =   0 , b  =   0 ;

    
public  TestPage () {
        
super ();
        add(
new  FeedbackPanel( " feedback " ));
        TextField ta 
=   new  TextField( " a " new  Model() {
            
public   void  setObject(Serializable obj) {
                a 
=  ((Double) obj).doubleValue();
            }
        }, Double.
class );
        TextField tb 
=   new  TextField( " b " new  Model() {
            
public   void  setObject(Serializable obj) {
                b 
=  ((Double) obj).doubleValue();
            }
        }, Double.
class );
        Form form 
=   new  Form( " form " ) {
            
protected   void  onSubmit() {
                
switch  (oper.toCharArray()[ 0 ]) {
                
case   ' + ' :
                    result 
=  a  +  b;
                    
break ;
                
case   ' - ' :
                    result 
=  a  -  b;
                    
break ;
                
case   ' * ' :
                    result 
=  a  *  b;
                    
break ;
                
case   ' / ' :
                    result 
=  a  /  b;
                    
break ;
                
default :
                    result 
=  a  +  b;
                }
            }
        };
        add(form);

        form.add(ta);
        form.add(tb);
        Label label 
=   new  Label( " result " new  Model() {
            
public  Object getObject(Component component) {
                
return  String.valueOf(result);
            }
        });
        form.add(label);
        form.add(
new  SubmitLink( " sumit " ));
        DropDownChoice dropDownChoice 
=   new  DropDownChoice( " oper " new  Model() {
            
public   void  setObject(Serializable obj) {
                oper 
=  (String) obj;
            }
        }, opers);
        dropDownChoice.setRequired(
true );
        dropDownChoice.setNullValid(
true );
        form.add(dropDownChoice);
    }
}

通过add方法添加控件,值的注意的就是怎么把控件跟Model联系起来,这只是个小例子,直接重写Model的setObject方法即可,将控件的值设置到变量以便计算。另外wicket的Page是线程安全的。


dennis 2007-05-22 16:16 发表评论

你可能感兴趣的:(spring,html,asp.net,tapestry,wicket)