前面說過所謂的業(yè)務(wù)大多數(shù)是crud。那從這個入手,我發(fā)現(xiàn)要把這個配置出來,配置的結(jié)果不言而喻,能生成crud的頁面。我們其實只需要一些元數(shù)據(jù)(meta information)。元數(shù)據(jù)就相當(dāng)于我們平常用的hibernate 里面的cfg.xml之類的東西。用來描述實體/字段的一些信息。從業(yè)務(wù)的需要來講,單憑這個xml的配置還不能生成crud的頁面。還需要很多的信息。下面是這些字段信息的整理。
TABLENAME | 表名 |
TCOLUMNSNAME | 表字段名 |
TCOLUMNSTYPE | 表字段類型 |
ECOLUMNSNAME | 實體字段名 |
ECOLUMNSTYPE | 實體字段java類型 |
COLUMNSLENGTH | 字段長度 |
COLUMNSNULLABLE | 是否允許為空 |
ISPRIMARYKEY | 是否主鍵 |
STATE | 啟用狀態(tài) |
DESCRIPTION | 描述 |
COLUMNID | 字段序號 |
LABELTEXT | 字段label名稱 |
DEFAULTVALUE | 字段默認(rèn)值 |
CANSEARCH | 是否為查詢字段 |
SEARCHINPUTTYPE | 查詢呈現(xiàn)方式,文本框/下拉框/.. |
SEARCHOPERATOR | 默認(rèn)查詢運算符,等于/大于/.. |
FORMAT | 字段顯示格式,日期格式/小數(shù)格式/貨幣格式 |
CSSCLASS | 呈現(xiàn)css class |
READONLY | 編輯時是否只讀 |
EDITINPUTTYPE | 編輯呈現(xiàn)方式 文本框/下拉框/.. |
CREATESHOW | 新增時是否顯示 |
UPDATESHOW | 更新時是否顯示 |
VIEWSHOW | 查看時是否顯示 |
BLANKMSG | 值為空警告 |
VALIDATETYPE | 校驗類型,小數(shù)/整數(shù)/正整數(shù)/.. |
INVALIDMSG | 校驗不通過警告 |
MAPPING | 數(shù)據(jù)字典,其實就是配置下拉框的通用的數(shù)據(jù)源。比如通常{1:是,0:否}。 |
MAXVALUE | 最大值 |
MINVALUE | 最小值 |
VALIDATEOP | 校驗比較類型 |
VALIDATETO | 校驗比較對象表達(dá)式 |
VALIDATEREGEXP | 校驗正則表達(dá)式 |
VALIDATEIF | 校驗禁用條件 |
CTABLE | 約束表,這4個屬性生成下拉框數(shù)據(jù)源。 |
CCOEDECOLUMN | 約束值字段 |
CVALUECOLUMN | 約束文本字段 |
CCONDITION | 約束文本字段 |
我估計很多人看了這些屬性后笑了,的確,很多人這么做過。后來發(fā)現(xiàn)這樣做很不靈活,無法滿足需要,其實這個問題很簡單,為什么不應(yīng)用一種表達(dá)式,ognl,el之類的表達(dá)式放在配置項里,這些屬性就靈活很多。siebel這樣的產(chǎn)品,不也有一些地方需要些一個腳本,比如escript之類的東西么。想想我們天天琢磨的業(yè)務(wù),不就是這些東西么。把它配置到數(shù)據(jù)庫里面,接下來就是怎么生成頁面的么。我看到的目前大多數(shù)的做法是做一個代碼生成器,我認(rèn)為這種做法很不好,代碼生成器本身是解決了很多機械活,但是關(guān)鍵還是你生成的代碼本身的質(zhì)量。沒錯,你可以用代碼生成器去免去上萬行代碼要手寫的尷尬,我不僅要問,為什么會弄成上萬行的代碼?有的人還喜歡吹噓我寫過上萬行的Java代碼,我更是嗤之以鼻,這不是你的驕傲,這恰是你的悲哀。上萬行的代碼,我見過的有兩種可能性,一個是java/jsp代碼沒有重構(gòu),沒有封裝。二是數(shù)據(jù)庫的設(shè)計有問題,一個表200個字段,頁面能不復(fù)雜么。第一種是架構(gòu)師要解決的問題,第二種那據(jù)是設(shè)計時要注意的事情了。扯遠(yuǎn)了。界面是怎么出來的。至少不是用代碼生成器跑出來的。接觸過ruby on rails 或者grails的朋友肯定知道里面的activerecord/scanffold組合快速實現(xiàn)crud。不過他說白了也是在生成頁面+改代碼,我還是不喜歡。因為界面確實是太靈活。我的思路分兩個個方面入手:1.封裝字段,根據(jù)上述字段屬性封裝成jsp的tag。這個tag通過字段名讀取元數(shù)據(jù)屬性,生成瀏覽器執(zhí)行的html,javascript。2:所謂頁面不久是指定這個頁面有哪幾個字段不就得了。查詢頁面,那幾個字段是查詢條件,讀取字段的查詢屬性。編輯頁面,無非是指定編輯哪些字段就行,在這個基礎(chǔ)上做一個小工具,頁面就很容易出來。當(dāng)然,好的框架還要解決一個問題,就是變更。怎樣能以最少的代價做變更。這個我是這么想的。比如說,某個表刪除一個字段,我們可以提供一個工具查詢哪些頁面引用了這個字段,然后用程序一并刪除,其實這個實現(xiàn)也不難,因為每個字段無非就是jsp頁面的一個tag么。大不了用個全文搜索。用正則一替換就完了。
上面是我總結(jié)的快速實現(xiàn)crud的一些想法。這部分其實是很多重復(fù)性勞動的根源,把這些工夫省下來了。開發(fā)效率高很多。