??xml version="1.0" encoding="utf-8" standalone="yes"?>
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
以上一D很单的代码Q很Ҏ(gu)看懂。它的运行结果如下:
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()的结果格式ؓcd@对象?6q制Hash表示。这里我们可以如此理解,是一个指向DataItemcd例化Ӟ在内存中开辟的一块空间的地址标识?br />
在调用函?span style="color: #000000;">tr.newItem1()Q?4行)之前Q?/span>item1和item2所指向的内存空间是相同的。所以在改变item1的同时item2的值势必更q一h变,同理改变item2的内容,item1的内容也会做出相同的改变?span style="color: #000000;">item1.toString()?/span>item2.toString()的结果正可以说明q一炏V这也说明了Qitem1和item2存储的都是一个内存地址?br />
当调?/span>tr.newItem1()Q重新实例化item1Q之后item1指向的另一块内存空_而item2保持不变Q指向最初那块内存空间。此Ӟitem1和和item2的内容将是毫不相关的?/span>
]]>
最l实现的效果代码Q如下所C:
<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标签Q?/span>
<h:selectOneMenu value="#{voutputType.DEVICETYPE}" converter="voutputDeviceTypeConverter">
<f:selectItems value="#{voutput.deviceTypeList}"/>
</h:selectOneMenu>
主要有三个部分组?/span>
(a) value="#{voutputType.DEVICETYPE}"
?/span>javabean ,voutputType中的DEVICETYPE属性,定html代码?/span><option selected="selected" value="Monitor">的?/span>?/span>
voutputType配置信息?/span>"WebRoot"WEB-INF"faces-config.xmlQ?/span>
<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属性对应的变量是枚?/span>DeviceType的一个实例?/span>
(b) converter="voutputDeviceTypeConverter"
cd转换器,在在"WebRoot"WEB-INF"faces-config.xml配置如下Q?/span>
<converter>
<converter-id>voutputDeviceTypeConverter</converter-id>
<converter-class>
cn.com.gentek.imatrix.ui.VoutDeviceTypeConverter
</converter-class>
</converter>
cn.com.gentek.imatrix.ui.VoutDeviceTypeConverter代码如下Q?/span>
Q实?/span>< select>?/span><option>?/span>Stringcd|?/span>DeviceTypecd之间的{换)
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}"/>Q重点)
׃deviceTypeList对应变量必须?/span>SelectItemQ?/span>javax.faces.model.SelectItemQ列表,所以有必要?/span>DeviceTypecd实例的值和对应Stringcd|装在一?/span>SelectItem实例中。实C码如下:
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()));
}
下面通过实例来说明?/span>
首先是介l?/span>webE序目录的大致结构:
D:"......"Tomcat 6.0"webapps"imatrixb ------> E序的更目录
--META-INF
--WEB-INF
---------------classess
---------------------------cn
----------------------------------com
--------------------------------------------…… ----------->class 文g
---------------------------XmlData
---------------------------------path-config.xml Q?/span>1Q?/span>
--------------- path-config.xml Q?/span>2Q?/span>
…….
Index.jsp
一Q?/span>FacesContext
获得Q?/span>2Q号path-config.xml文g信息,
代码如下Q?/span>
String partPath=”/ WEB-INF/ path-config.xml”;
1. getRealPath():
FacesContext
context = FacesContext.getCurrentInstance();
HttpServletRequest rst = (HttpServletRequest)context.getExternalContext().getRequest();
String fullPath=rst.getRealPath(xmlfile); // 获得xml文g的系l\径,xmlfile为相对\?/span>
采用q个Ҏ(gu)存在一些隐(zhn):比方说对一个打包的应用来说Q是没有RealPath的概늚Q调?/span>getRealPath只会单地q回null?/span>
2. getResourceAsStream():
FacesContext context = FacesContext.getCurrentInstance();
InputStream xmlStream = context.getExternalContext()
.getResourceAsStream(xmlfile);
用于只读的Ş式?/span>
二:ClassLoader
获得Q?/span>1Q号path-config.xml文g信息,
代码如下Q?/span>
String partPath =”/XmlData/path-config.xml”;
String fullPath=this.getClass().getClassLoader().getResource(partPath).getPath();
//使用的时候还是存在一些问题,无法正常使用Q暂时没有发现解决的办法
InputStream xmlStream=this.getClass().getClassLoader().getResourceAsStream(partPath);
//用于只读的Ş式下Q通过试能够正常的?/span>
1.2.1 学习W记
参考资料:Java 2 核心技?/span>?/span>IQ基知识Q第7版) 5.5 反射
(1) Classc?/span>
在程序运行期_Javaq行时系l始lؓ所有对象的l护一个被UCؓq行时的cd标识。这个信息保存着每一个对象所有属性的cqV虚拟机利用q行信息选择相应的方法执行?/span>
获取Classcd象的三种Ҏ(gu)
(a) getClass()
Employee e;
…
Class cl=e.getClass();
System.out.println(cl.getName()+“ ” +e.getName());
Result:
Employee Harry
(b) forName()
String className= “java.util.Date ”;
Class cl=Class.forName(className);
(c) .class
Class cl1=Date.class;
Class cl2=int.class;
(2) 反射的分析能?/span>
CZQ?/span>
Employee.java:
publicclass Employee {
private String name;
privateintage;
public String getName() {
returnname;
}
publicvoid setName(String name) {
this.name = name;
}
publicint getSalary() {
returnage;
}
publicvoid setSalary(int salary) {
this.age = salary;
}
public Employee(String name, int salary) {
this.name = name;
this.age = salary;
}
}
Test.java
import java.lang.reflect.Field;
publicclass test {
publicstaticvoid main(String[] args) throws SecurityException,
NoSuchFieldException, IllegalArgumentException,
IllegalAccessException {
Employee zhanjh = new Employee("zhan jh", 1000);
Class<?> cl = zhanjh.getClass();
Field f = cl.getDeclaredField("name"); // q回名称?/span>“name”的私有或公有成员Q域Q?/span>
f.setAccessible(true); // 非常重要Q否则无法调?/span>f.get(zhanjh)Ҏ(gu)
Object v = f.get(zhanjh);// q回zhanjh对象?/span> name成员Q域Q的?/span>
System.out.println(v.toString());
}
}
/*
* q行l果Q?/span> zhan jh
*/