Posted on 2007-05-22 16:16
dennis 閱讀(2521)
評論(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"/> <select wicket:id="oper"></select> <input type="text" size='10' wicket:id="b"/> = <label wicket:id="result"></label>
<br><a 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是線程安全的。