Monday, February 23, 2009

在Spring Web Flow產生Excel

在此預設Spring Web Flow使用了Spring MVC為底層的MVC架構。


製作所需要產生View的類別

新增一類別繼承AbstractJExcelView,複寫掉buildExcelDocument方法。Spring已將需要在repsonse中設定的值準備好,在此只需專心使用傳入的WorkBook來產生Excel。不過Spring未提供一個方便指定檔案名稱的方式,以至於因無延伸檔名瀏覽器無法識別是何種檔案。在此方法中加上以下程式:

response.setHeader("Content-Disposition", "attachment; filename=\"report.xls\"");

其中的report.xls即為指定的檔名。傳入參數中的Model內含flow中的所有變數,可直接使用變數名稱當作Map的key取得。甚至flowScope與sessionScope等物件都可從Model中取得。


設定view resolver將view state轉給新的Excel View。


使用ResourceBundleViewResolver將設定好得view名稱交給定義的view物件處理。於Spring設定檔中針對Web Flow使用的view resolver加入ResourceBundleViewResolver。


先定義resourceBundleViewResolver。basename為定義view處理方式的properties檔案。以下定義為views,所以他會於classpath中搜尋view.properties檔案。

<bean id="resourceBundleViewResolver" class="">
<property name="basename" value="views"/>
</bean>

以下為原本Web Flow只使用tilesViewResolver,再補上resourceBundleViewResolver。注意resourceBundleViewResolver必須定義在tilesViewResolver之前,因為tilesViewResolver不會回傳找不到view而是直接發生錯誤。resourceBundleViewResolver在找不到適當的view時會回報,web flow即請下個viewResolver找出適當的view。

<bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers">
<list>
<ref bean="resourceBundleViewResolver"/>
<ref bean="tilesViewResolver"/>
</list>
</bean>

最後在定義views.properties檔案。假設剛剛新增的view類別叫做MyReportExcelView然後view state的id叫做myReport在views.properties檔設定如下。所有的myReport的view將交由MyReportExcelView產生結果。

myReport.class=com.example.MyReportExcelView

Friday, February 6, 2009

兩個人不使用伺服器情況下使用Mercurial


一個只有兩人開發的小型專案在開發人員都在不同地方的情況,架設一台24小時開啟固定IP的伺服器當作版本控管也許有點浪費。在此介紹使用NetBeans 6.5與Mercurial讓兩個開發人員在沒有伺服器的情況下互相分享專案。

與傳統版本控管不同,在使用Mercurial時,每一個人都擁有自己的檔案庫(repository),只要與對方的檔案庫作到同步即可。假設專案的開發者分別為阿蛙跟阿宅,由阿蛙起始新的NetBeans專案後將自己的檔案庫寄給阿宅。阿宅在匯入檔案庫後有了自己專屬的檔案庫就可進行開發。此後雙方互向以電子郵件寄自己的檔案庫給對方就可以了。以下為同步步驟:

  1.  阿蛙將新的NetBeans專案初始給Mercurial管理。
    操作:[Versioning] -> [Mercurial] -> [Initialize Project]
  2. 阿蛙將該專案路徑所有內容壓縮寄給阿宅。
  3. 阿宅收到壓縮的內容後解開到一個將來會固定放置阿蛙檔案庫的路徑下。
  4. 於NetBeans中,阿宅將阿蛙檔案庫複製進來。
    操作:[Versioning] -> [Mercurial] -> [Clone Other...]
    輸入阿蛙檔案庫路徑後阿宅就取得了新的由Mercurial控管的專案。
  5. 阿宅對專案做了修改後將修改內容送交(commit)到他自己的檔案庫。
    [Versioning] -> [Commit...]
    在輸入送交的註解後按送交。
  6. 等到阿宅作了足夠的更改與送交後將自己的檔案庫(及專案路徑)壓縮寄給阿蛙。
  7. 阿蛙收到阿宅的檔案庫後一樣將他壓縮到一個將來固定放置阿宅檔案庫的路徑。
  8. 阿蛙先在NetBeans中設定好專案將來都從阿宅資料庫匯入修改。
    操作:[Verisoning] -> [Mercurial] -> [Properties...]
    修改default-pull屬性,設定為解壓縮後的阿宅檔案庫路徑。
  9. 阿蛙需要在NetBeans中將阿宅作的修改抓(pull)到自己的專案。
    操作:[Versioning] -> [Share] -> [Pull from - default]

之後阿蛙也用相同方式將自己的檔案庫寄給阿宅兩人就可以互相同步了。