
		 
		2008年3月3日		  
	
 
	
			
			 1 package cn.com.gentek.imatrix.test;
 2 
 3 public class tesRef {
 4     private DataItem item1;
 5     private DataItem item2;
 6 
 7     public tesRef() {
 8         item1 = new DataItem();
 9         item2 = item1;
10     }
11 
12     public void newItem1() {
13         item1 = new DataItem();
14     }
15 
16     public void print() {
17         System.out.println("item1: " + item1.toString());
18         System.out.println("item2: " + item2.toString());
19     }
20 
21     public static void main(String[] args) {
22         tesRef tr = new tesRef();
23         tr.print();
24         tr.newItem1();
25         tr.print();
26     }
27 }
28 
    以上一段很简单的代码,很容易看懂。它的运行结果如下:
item1: cn.com.gentek.imatrix.test.DataItem@c17164
item2: cn.com.gentek.imatrix.test.DataItem@c17164
item1: cn.com.gentek.imatrix.test.DataItem@1fb8ee3
item2: cn.com.gentek.imatrix.test.DataItem@c17164
    toString()的结果格式为类名@对象的16进制Hash表示。这里我们可以如此理解,是一个指向DataItem类实例化时,在内存中开辟的一块空间的地址标识。
    在调用函数
tr.newItem1()(24行)之前,item1和item2所指向的内存空间是相同的。所以在改变item1的同时item2的值势必更这一起改变,同理改变item2的内容,item1的内容也会做出相同的改变。
item1.toString()和item2.toString()的结果正可以说明这一点。这也说明了,item1和item2存储的都是一个内存地址。
    当调用tr.newItem1(),重新实例化item1,之后item1指向的另一块内存空间,而item2保持不变,指向最初那块内存空间。此时,item1和和item2的内容将是毫不相关的。
			posted @ 
2008-03-04 17:33 zhan 阅读(1618) | 
评论 (2) | 
编辑 收藏1.      
HTML代码
最终实现的效果代码,如下所示:
<select>
<option
selected="selected"
value="Monitor">Monitor</option>
<option
value="VCR">VCR</option>
<option value="Standard
Device">Standard Device</option>
<option value="Smart
Device">Smart Device</option>
<option
value="Trunk">Trunk</option>
<option value="Standby
VCR">Standby VCR</option>
</select>
2.      
enum代码
publicenum DeviceType {
    @XmlEnumValue("Monitor")
    MONITOR("Monitor"),
    VCR("VCR"),
    @XmlEnumValue("Standard Device")
    STANDARD_DEVICE("Standard Device"),
    @XmlEnumValue("Smart Device")
    SMART_DEVICE("Smart Device"),
    @XmlEnumValue("Trunk")
    TRUNK("Trunk"),
    @XmlEnumValue("Standby VCR")
    STANDBY_VCR("Standby VCR");
    privatefinal String value;
    DeviceType(String v) {
        value = v;
    }
    public String value() {
        returnvalue;
    }
    publicstatic DeviceType fromValue(String v)
{
        for (DeviceType c: DeviceType.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        thrownew IllegalArgumentException(v);
    }
}
3.      
JSF标签:
<h:selectOneMenu
value="#{voutputType.DEVICETYPE}"
converter="voutputDeviceTypeConverter">
<f:selectItems value="#{voutput.deviceTypeList}"/>
</h:selectOneMenu>
主要有三个部分组成
(a)    
value="#{voutputType.DEVICETYPE}"
由javabean ,voutputType中的DEVICETYPE属性,确定html代码中<option selected="selected"
value="Monitor">项的值。
voutputType配置信息在"WebRoot"WEB-INF"faces-config.xml:
<managed-bean>
       <managed-bean-name>voutputType</managed-bean-name>
       <managed-bean-class>
           cn.com.gentek.imatrix.xml.jaxb.voutput.ObjVOutputType
       </managed-bean-class>
       <managed-bean-scope>session</managed-bean-scope>
</managed-bean>
    其中DEVICETYPE属性对应的变量是枚举DeviceType的一个实例。
(b)   
converter="voutputDeviceTypeConverter"
类型转换器,在在"WebRoot"WEB-INF"faces-config.xml配置如下:
<converter>
    <converter-id>voutputDeviceTypeConverter</converter-id>
    <converter-class>
       cn.com.gentek.imatrix.ui.VoutDeviceTypeConverter
    </converter-class>
</converter>
cn.com.gentek.imatrix.ui.VoutDeviceTypeConverter代码如下:
(实现< select>中<option>的String类型值,与DeviceType类型之间的转换)
publicclass VoutDeviceTypeConverter implements Converter {
    public Object
getAsObject(FacesContext context, UIComponent component, String value) {
       DeviceType result = null;
       if (value == null || value.length() < 1) {
           result = null;
       } else
           result = DeviceType.fromValue(value);
       returnresult;
    }
    public String
getAsString(FacesContext context, UIComponent component, Object value) {
       String result = null;
       if (value != null) {
           if (value instanceof DeviceType)
{
              DeviceType temp =
(DeviceType) value;
              result = temp.value();
           }
       }
       return result;
    }
}
(c)    
 <f:selectItems value="#{voutput.deviceTypeList}"/>(重点)
由于deviceTypeList对应变量必须是SelectItem(javax.faces.model.SelectItem)列表,所以有必要将DeviceType类型实例的值和对应String类型值,封装在一个SelectItem实例中。实现代码如下:
ArrayList<SelectItem> deviceTypeList = new ArrayList<SelectItem>();
for (int i = 0; i < DeviceType.values().length; i++) {
    deviceTypeList.add(new
SelectItem(DeviceType.values()[i],
           DeviceType.values()[i].value()));
}
			posted @ 
2008-03-03 16:15 zhan 阅读(2140) | 
评论 (3) | 
编辑 收藏