2012-01-18 126 views
2

我正在使用我的java web應用程序使用web服務。這將返回一些數據,其中有一個名爲Consumer的屬性。當WSDL轉換爲Java代碼時,這被表示爲一個對象。此類中只有一個字符串變量id。還有另一類Person,其延伸Consumer。這有一個數字字段,如firstName,lastName等。在JSF代碼中,有一個對consumer.firstName的引用,並且在將person對象作爲響應xml的一部分返回時,正在正確打印與firstName有關的值。這讓我感到困惑,因爲消費者對象不包含firstName,並且在使用consumer.firstName時仍然可以正確打印該值。請你幫助我理解這一點。Java接口和實現

JSF代碼

<h:outputText value="#{myBean.consumer.firstName}" /> 

輔助Bean

public Consumer getConsumer() { 
    return consumer; 
} 

消費類

public class Consumer implements java.io.Serializable { 

    private java.lang.String id; 

    public java.lang.String getId() { 
    return this.id; 
    } 

    public void setId(java.lang.String id) { 
    this.id = id; 
    } 

} 

Person類

public class Person extends Consumer { 
    private String firstName; 
    private String lastName; 
    private String dateOfBirth; 

    // Getters and Setters 
} 
+4

一小段代碼勝過千言萬語...... – 2012-01-18 12:09:08

+0

感謝Crowder - 添加了一些代碼。 – 2012-01-18 12:17:01

+1

與JSF本身相比,這更像EL的工作。把你的鼠標放在你的問題下面的'[el]'標籤上,直到黑色信息框出現,然後在其中單擊* info *鏈接。 – BalusC 2012-01-18 15:04:09

回答

4

JSF使用反射來調用對象上的方法。它不知道myBean.consumer的類型是什麼。它只知道你問了這個對象的firstName。所以,它的作用是

  1. 查找屬性,在​​任何範圍內,命名爲myBean
  2. 如果不爲null,尋找是否存在類名爲「getConsumer」一個公有的無參數方法(或任何超或接口)
  3. 調用此方法,並得到結果:另一個對象
  4. 如果此其他對象不爲空,請在類中找到名爲「getFirstName」的公共無參數方法(或任何超類或接口)的其他對象
  5. 調用此方法

所以,即使getConsumer()宣佈,它返回一個Consumer,如果在運行時,由getConsumer()返回的實際對象是Person,JSF將在PersongetFirstName()方法搜索方法,它會找到它,會高興地稱它並超越其結果。

+0

謝謝 - 幫助我的理解。因此,即使返回了與消費者無關的其他對象 - 如果它在此對象上找到方法,它也會很高興地執行。 – 2012-01-18 13:53:23

+0

是的,除非返回消費者返回「與消費者無關」的方法是不可能的。它返回null或Consumer的一個實例。 Person是Consumer的子類,Person實例**是** Consumer。 – 2012-01-18 13:55:53

+0

很酷 - 謝謝。所以如果方法返回Object,JSF可以接受並執行該方法:) – 2012-01-18 14:01:42

2

當您在JSF處參考consumer.firstName時,您所訪問的不是類型Consumer,而是您的頁面/請求/會話的屬性。 該屬性可以設置爲延伸Consumer的具體類型(Person),因此它表示firstName值。

+0

謝謝 - 我正在返回不包含firstName或lastName的Consumer對象。我認爲當Person返回時,java將以多態方式調用Person對象的重載方法。但消費者參考不包含獲取firstName的方法 - 因此仍有點困惑。 – 2012-01-18 12:23:29

2

在您的JSF頁面中,在打印您認爲是Consumer實例的firstName之前,還要打印「consumer.class.simpleName」的值。很可能這將打印「Person」,因爲您的對象是「Person」的一個實例(並且它被多態處理爲Consumer類型,因爲在這種情況下Person實例也是Consumer類型)。

+0

嗨,在支持bean中,我需要使用Person對象來獲得相同的信息。那麼,JSF是否會自動添加演員? – 2012-01-18 12:34:16

+1

其實我非常確定JSF不會做演員(如果沒有你特別告訴他,它不知道該怎麼演)。我認爲它只是對你的實例進行一些自省,在那裏它會查找與你給出的屬性名相對應的getter方法,並返回調用該方法的返回值(通過反射)。例如:對於person.firstName,它會查找名爲getFirstName()的方法,如果它在它調用它的對象上找到它,然後它會顯示返回對象的值。 – 2012-01-18 12:43:54