上有所好,下必甚之。君不見屠宰場的牆頭“以三個代表指導我們的屠宰工作 !” 發揮到極致;近來更是“和諧”泛濫,褒貶難分,諸如“創建人水和諧” 等 比比皆是。程序開發更需要務實,任憑天花亂墜都糊弄不了梗直的機器。
1. 初見 Struts2 的表單標簽有 tooltip 以及 tooltipConfig 下的 tooltipBgColor 等屬性,有一種砰然心動的感,本能的以為例如一個輸入框,鼠 標懸停其中便出現一個 JS Tip 層,還可控制這個層的樣式。用了才知道頭腦其 實有點過熱,不過是在輸入框前加下圖標,鼠標要放在那個圖標上才顯示 tooltip 指定的內容,而且如果不給 form 加上 tooltipConfig="# {'jsTooltipEnabled':'true'}",也就用 alt/title 來實現,沒什麼新意。加了 tooltipConfig="#{'jsTooltipEnabled':'true'}" 的話還要人命的是 JS 提示層 會出來,alt/title 也會迸出來,產生重疊。同時還必須加上 <s:head/> 否則出現 dojo 的錯誤,即使 jsTooltipEnabled 為 false 亦如此,沒來由。
2. 前面講過表單域標簽的 tooltipConfig 有許多子屬性控制 JS Tip 層的樣 格,如 tootipBgColor、toolFontSize,具體屬性可見 http://wiki.opensymphony.com/display/WW/Form+Tags(中文 http://wiki.javascud.org/display/ww2cndoc/Form+Tags)。可是我試過幾個屬 性,那 JS Tip 層總老樣土黃底黑字,煞費苦心,也頗受打擊,尚不明就理,待 明人釋點。
雖如此,還是說一下 tooltipConfig 的子屬性的配置方式,有三:
1) OGNL 方式
<s:textfield label="Address" tooltip="Enter your address"
tooltipConfig="#{'tooltipBgColor':'#FF0000','tooltipFontSize':'20px'}" />
</s:form>
2) <s:param> 子標簽
<s:textfield label="Customer Name" tooltip="One of our customer Details'">
<s:param name="tooltipConfig">
tooltipWidth = 150 | tooltipAboveMousePointer = false | tooltipLeftOfMousePointer = false
</s:param>
</s:textfield>
3)<s:param> 子標簽加 OGNL
<s:textfield label="Customer Address" tooltip="Enter The Customer Address">
<s:param name="tooltipConfig" value="#{'tooltipStatic':'true','tooltipSticky':'true','tooltipTitle':'false','tooltipShadowColor':'false'}" />
</s:textfield>
關於 ToolTip 的使用前面還單獨寫了 為何我的 Struts2 標簽 tooltip 和 tooltipConfig 是這種效果呢?
3. JSP 中 <s:head them="ajax"/> <s:textfield tooltip="Input your name" label="Name"/> ..., 訪問時頁面出現錯誤:Could not load 'dojo.widget.html.Tooltip'; last tried '__package__.js',原因是 Struts 2.0.6 的 Bug。修改 struts2-core-2.0.6.jar 中的 template/simple/form- close.ftl 和 template/ajax/form-close.ftl,把其中的 dojo.widget.html.Tooltip 替換為 dojo.widget.Tooltip 即可。其實原來只是 提示出錯,倒不影響什麼,說是這個 Bug 在 2.1.0 中已消除 (https://issues.apache.org/struts/browse/WW-1895)。
4. 前面講的都是表單標簽的通用屬性,其中還有一個值得提的屬性是 required 屬性,設置為 true 則會在表單域前面加上紅色的星號(*) 表示必填項 ,用 requiredposition 指定星號出現於相對 Label 的位置,left 或 right。
5. <s:checkboxlist> 會根據 list 所定的集合(含數組)來顯示一組 checkbox。listKey 指定集合對象的某個屬性作為 value,listValue 指定集合 對象的某個屬性作為 Lable,和想當然的理解可能又會出現偏差。若集合是 Map ,則listKey/listValue 分別用 key 和 value來對應。例子:
1) <s:checkboxlist name="a" list="{'a','b','c'}"/>
2) <s:checkboxlist name="b" list="#{'a':'1','b':'2'}" listKey="key" listValue="value"/>
3) <s:checkboxlist name="c" list="#books" listKey="name" listValue="author"/>
<s:checkboxlist.../> 顯示的 checkbox 可點擊標簽文字來勾選或不 選。其實就是這種label for的寫法(鼠標點 I am OK 就能選上框)
<input type="checkbox" name="a" value="Yes" id="a-1"/>
<label for="a-1" class="checkboxLabel">I am OK</label>
6. <s:combobox.../> 說它是個 combobox 有點言過其實,說白就一個 輸入框對應一個下拉框,下拉框變化時當前值填到輸入框裡。下拉框沒有 name 屬性,所以不產生請求。<s:combobox> 也用 list/listKey/listValue 屬 性。
7. <s:datetimepicker.../> 倒是個前所未有的標簽,用 type="date|time" 指定是日期還是時間選擇,可惜不能同時具有日期和時間。 toggleType="plain|wipe|explode|fade" 設置選擇框的出現、隱藏動態效果。 displayFormat 指定顯示格式,如yyyy-MM-dd。這個標簽解決的一個問題是不被 下拉框遮擋,但問題很多,如選擇時間時文本框裡顯示不是 11:30 而是 上午:30 ,不可捉摸。日期選擇框月份兩邊的上下三角與中國人的操作習慣不相符,單擊 下三角是跳到後一個月去。和 tooltip 一樣,不太成熟,還比不上業界的 JS 日 歷控件。
8. <s:head.../> 用於對某些 CSS 和 JavaScript 的引用,如要使用 ajax 就寫成 <s:head theme="ajax"/>,debug 屬性打開調試功能。
9. <s:doubleselect.../> 產生一個能聯動的兩個下拉框, name/list/listKey/listValue 用於第一個下拉框,意義同 checkboxlist 的類 似屬性。相應的有第二個下拉框的用燿 oubleName/doubleList/doubleListKey/doubleListValue。其他的帶燿ouble 前 綴的都是指定第二個下拉框的屬性。注意 doubleList 中表達式的寫法。例如:
<s:doubleselect name="group" list="{'one','two'}" doubleName="detail"
doubleList="top=='one'?{'apple','pear'}:{'blue','red'}"/>
doubleList 中的 top暗指第一個下拉框的所選值,這裡用的是一個三元操作 符,根據第一個下拉框選項來決定第二個下拉框要顯示的列表。如果第一個下拉 框中有三個及以上的項數,對應的 doubleList 就要麻煩一些,要用嵌套的三元 操作符了,如:
<s:doubleselect name="group" list="{'one','two','three'}" doubleName="detail"
doubleList="top=='one'?{'apple','pear'}:(top=='two'?{'blue','red'}: {'pine','willow'})"/>
如果用一個 Map來預先定義一個 Key-List 集合,則用起來要簡單多了。
<s:set name="bs" value="#{'one':{'apple','pear'},'two': {'blue','red'},'three':{'pine','willow'}}"/>
<s:doubleselect ........ list="#bs.keySet()" doubleList="#bs [top]"/>
其他屬性未寫出,同樣,top 是第一個下拉框所選值。
用 <s:doubleselect.../> 標簽時,Struts2 會把所有的選項值都放到 頁面的 JS 變量中,所以如果列表項太多的話就不適合於用這個標簽了,那就要 用 Ajax 的相應標簽了。
當第一個下拉只有兩項時,剛進到頁面時,那兩個下拉框是緊緊挨在一起來, 改變過第一個下拉框後,中間才會有空一行,也是 Struts2 的一個 Bug,第一個 下拉框是三項及以上時倒沒問題。
10. 明白了 doubleselect 的話,那麼 <s:select.../> 用起來就簡單 了,也是有 listKey/listValue。還就也是對前面的補充,下拉框都有 size 屬 性(顯示的行數),和 multiple 屬性(是否允許多選)。對應到標簽的屬性就會是 ,size/multiple,doubleselect 的第二個框相應的 doubleSize/doubleMultiple。