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的內容將是毫不相關的。
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()));
}
使用JSF編寫web程序的時候,JavaBean無法直接通過相對路徑來訪問文件。經過一天的研究主要發現兩類解決方案,一是,通過FacesContext,二是,通過ClassLoader。
下面通過實例來說明。
首先是介紹web程序目錄的大致結構:
D:"......"Tomcat 6.0"webapps"imatrixb ------> 程序的更目錄
--META-INF
--WEB-INF
---------------classess
---------------------------cn
----------------------------------com
--------------------------------------------…… ----------->class 文件
---------------------------XmlData
---------------------------------path-config.xml (1)
--------------- path-config.xml (2)
…….
Index.jsp
一:FacesContext
獲得(2)號path-config.xml文件信息,
代碼如下:
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文件的系統路徑,xmlfile為相對路徑
采用這個方法存在一些隱患:比方說對一個打包的應用來說,是沒有RealPath的概念的,調用getRealPath只會簡單地返回null。
2. getResourceAsStream():
FacesContext context = FacesContext.getCurrentInstance();
InputStream xmlStream = context.getExternalContext()
.getResourceAsStream(xmlfile);
用于只讀的形式。
二:ClassLoader
獲得(1)號path-config.xml文件信息,
代碼如下:
String partPath =”/XmlData/path-config.xml”;
String fullPath=this.getClass().getClassLoader().getResource(partPath).getPath();
//使用的時候還是存在一些問題,無法正常使用,暫時沒有發現解決的辦法
InputStream xmlStream=this.getClass().getClassLoader().getResourceAsStream(partPath);
//用于只讀的形式下,通過測試能夠正常的使用
1.2 反射
1.2.1 學習筆記
參考資料:Java 2 核心技術卷I:基礎知識(第7版) 5.5 反射
(1) Class類
在程序運行期間,Java運行時系統始終為所有對象的維護一個被稱為運行時的類型標識。這個信息保存著每一個對象所有屬性的類足跡。虛擬機利用運行信息選擇相應的方法執行。
獲取Class類對象的三種方法
(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) 反射的分析能力
示例:
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"); // 返回名稱為“name”的私有或公有成員(域)
f.setAccessible(true); // 非常重要,否則無法調用f.get(zhanjh)方法
Object v = f.get(zhanjh);// 返回zhanjh對象中 name成員(域)的值
System.out.println(v.toString());
}
}
/*
* 運行結果: zhan jh
*/
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 1 | |||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
常用鏈接
留言簿(1)
隨筆檔案
搜索
最新評論

- 1.?re: JSF web編程中的JavaBean路徑訪問問題
- 贊一個
- --人口水壽
- 2.?re: 關于java變量的引用(reference)
- 一直把引用當內存地址理解....
- --久城
- 3.?re: 關于java變量的引用(reference)
-
機制上是這樣實現的.
但是@后面的并不是內在地址
- --DoubleJ
- 4.?re: JSF web編程:通過enum數組生成 下拉選擇列表
- 評論內容較長,點擊標題查看
- --zhan
- 5.?re: JSF web編程:通過enum數組生成 下拉選擇列表
- 通過enum生成下拉列表 比其他從backbean數組中獲取有什么好處嗎?
- --Jerome