上有所好,下必甚之。君不见屠宰场的墙头“以三个代表指导我们的屠宰工作!” 发挥到极致;近来更是“和谐”泛滥,褒贬难分,诸如“创建人水和谐” 等比比皆是。程序开发更需要务实,任凭天花乱坠都糊弄不了梗直的机器。
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 的类似属性。相应的有第二个下拉框的用doubleName/doubleList/doubleListKey/doubleListValue。其他的带double 前缀的都是指定第二个下拉框的属性。注意 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。
本文链接 https://yanbin.blog/unmi-study-struts2-12/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。