13 December 2005

在 Wicket 裡面寫 javascript 最簡單的方法,就是直接在 html template 裡寫:
// SimplePage.html:
<head>
   <script >
      function myJS() {
         //...
      }
   </script>
</head>
<body></body>
如果不是 WebPage,而是像 Panel、或是繼承的 WebPage (wicket 的網頁可以繼承的),那麼可以加個簡單的 tag:
// MyPanel.html:
<head>
   <wicket:head>
   <script >
      function myJS() {
         //...
      }
   </script>
   </wicket:head>
</head>
<body>
<wicket:panel></wicket:panel>
</body>
</html>
這個 <wicket:head> 裡面的 script 片斷便會自動加入到 render 完成網頁上,而且一併都放在<head>裡。不論你用了多少個 panel,繼承了幾層的 WebPage 都一樣。 上面都屬於靜態的 javascript,如果需要由程式動態產生,那麼可以覆寫 renderHead() 這個 method。Wicket 所有 WebComponent 和 WebMarkupContainer 都支援這個 method (就是幾乎都支援啦)。如下:
    @Override
    public void renderHead(HtmlHeaderContainer container) {
        super.renderHead(container);
        StringBuilder s = new StringBuilder();
        s.append("<script language='JavaScript' type='text/javascript'>\n");
        s.append("   function pressPlus(textField, event) {\n");
        s.append("     //...blahblahblah \n");
        s.append("   }\n");
        s.append("</script>\n");
        container.getResponse().write(s.toString());
    }

只要注意第一行要呼叫 super.renderHead(container); 最後一行要呼叫 container.getResponse().write(myJavaScriptString); 即可,中間的 javascript 就可以自行發揮囉!

用 Wicket 已經二、三個月了。感想是這個 community 真的很不錯,mailing list 有問必答,幾乎半天內就有回應了,而且討論的量也夠多。現在 commiter 都在衝 wicket 1.2,做大量的 refactoring。整體來看是蠻健康的團隊,唯一的缺點是文件少,用的人還是不多...

就技術面來看,Wicket 的 html template "完全" 沒有任何的邏輯,連個 if 都沒有,所有的邏輯只能寫在 java code 裡。所以 html template 裡非常的乾淨,看起來爽多啦!不像 jsp,雖然有 JSTL,可是還是會有人動不動就加一些有的沒有。不含邏輯的html 是 Wicket 的重要理念之一,往後也會繼續的貫徹。再來是背後的 java code,因為用了很多 inner class,所以看起來蠻雜亂的。不過個人覺得這是習慣問題,看習慣就很快了,而且一個網頁的東西全部可以集中在一個 class 裡,不會到處散亂。而不像是 struts action 東一個西一個,而且還要去查 struct-config.xml 才知道發生了什麼事。至於之前提過 "從 Wicket 的 class 裡,很難查看 page 的 flow 流程" 這個問題。後來才發現 Wicket 的方式才簡單咧。因為每個 wicket page 相連都是用 java class,所以要知道連到哪裡去,在 IDE (eclipse) 裡按個 F3 就跳過去了,完全不用特殊的工具!

至於學習上... Wicket 不大好學啦,最大原因是文件少,第二個原因是 component-based 的開發真的要一段時間才能適應,尤其是已經開發 request-based 一兩年以上的人。不過一進入狀況後,呵,我再也不想寫其他 web framework 啦!

繼 Hibernate, Spring 之後,我再次大聲說:Wicket Rocks !


回響

可以用 Tag <I>、<B>,程式碼請用 <PRE>