莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          學習了一下wicket

          Posted on 2007-05-22 16:16 dennis 閱讀(2526) 評論(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
          主站蜘蛛池模板: 江油市| 白水县| 大化| 象州县| 巴塘县| 麻城市| 介休市| 庆城县| 西乌珠穆沁旗| 清水河县| 光山县| 瑞丽市| 武威市| 中宁县| 保德县| 繁峙县| 漳平市| 桦甸市| 科技| 涪陵区| 新竹县| 泸水县| 鄢陵县| 芜湖县| 综艺| 泾阳县| 云南省| 建宁县| 凤山市| 潮州市| 沛县| 柳州市| 屯留县| 遵义县| 焉耆| 怀集县| 肥乡县| 光泽县| 南漳县| 万源市| 阿克陶县|