庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

学习了一下wicket

Posted on 2007-05-22 16:16 dennis 阅读(2469) 评论(1)  编辑  收藏 所属分类: java
    读的是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是线程安全的。

评论

# re: 学习了一下wicket  回复  更多评论   

2007-07-12 08:25 by jet lee
good

只有注册用户登录后才能发表评论。


网站导航: