2013-08-22 22 views
0

我想了解如何分配response.getWriter()發生在PrintWriter。什麼樣的論點被分配給'HTTPServletResponse響應'

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws 
ServletException, IOException { 

PrintWriter out = response.getWriter(); 
out.println(""); 
} 

我知道的HttpServletResponse的父接口(超接口)包含返回PrintWriter類的實例的方法的getWriter。但是,執行此代碼時,會在「響應」參數中傳遞哪種對象。在作爲響應傳遞的對象和PrintWriter對象之間必須存在某種連接...因爲PrintWriter類與HTTPServletResponse及其父接口控件沒有任何關係......否則我不會看到如何將PrintWriter變量分配給響應。

我試圖實現我自己的這個功能的例子,並創建了一個名爲iDriveable的接口,其中包含一個返回類Vehicle的方法。不過,我不斷收到一個NullPointerException

public interface Drivable { 

    public Vehicle accelerate(); 

} 


public class Vehicle { 

    public String VehFunction(){ 
     System.out.println("in vehFunction"); 
     return "vehicle class"; 
    } 

    public void testFunction(Driveable driveable){ 

     Vehicle veh = driveable.accelerate(); 
     veh.VehFunction(); 

    } 
    public static void main(String[] args) { 

     Driveable d = null; 
     Vehicle v = new Vehicle(); 
     v.testFunction(d); 

    } 

} 

感謝

回答

2

我不知道我理解的問題。作爲參數傳遞的對象是類的一個實例,由servlet容器,它看起來像這樣設置:

public class HttpServletResponseImpl implements HttpServletResponse { 
    private PrintWriter out = new PrintWriter(...); 

    @Override 
    public PrintWriter getWriter() { 
     return this.out; 
    } 

    // other fields and methods 
} 

它是含有另一種對象的對象的一個​​簡單的例子。

編輯:

解釋爲什麼你的例子不工作:你傳遞d,這是爲null v.testFunction()。此方法在此空引用上調用accelerate()。很明顯,你會得到一個NullPointerException。您無法撥打null上的任何方法。

讓我們重寫一下你的例子,這個例子太複雜,難以理解,甚至更簡單的HttpResponse情況。

比方說,我們有一個接口車輛:

public interface Vehicle { // an interface, just like HttpServletResponse 
    Person getDriver(); // returns a Person, just like getWriter returns a PrintWriter 
} 

和一個簡單的類人:

public class Person { // a class, just like PrintWriter 
    private String name; 

    public Person(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 
} 

車輛接口的任何實例可以存在不定義CLAS實現它:

public class Car implements Vehicle { // an implementation of Vehicle, just like Tomcat provides an implementation of HttpServletResponse 

    private Person driver; // contains a person, just like the HttpServletResponse iplementation contains a PrintWriter 

    public Car(Person driver) { 
     this.driver = driver; 
    } 

    @Override 
    public Person getDriver() { 
     return this.driver; 
    } 
} 

現在讓我們編寫一個程序:

public static void main(String[] args) { 
    Person john = new Person("John"); 
    Vehicle vehicle = new Car(john); 

    doGet(vehicle); 
} 

public static void doGet(Vehicle vehicle) { 
    Person p = vehicle.getDriver(); 
    System.out.println(p); 
} 

在這個例子中:

  • Vehicle類似於HttpServletResponse
  • Vehicle.getDriver()類似於HttpServletResponse.getWriter()
  • Person類似於PrintWriter
  • Car類似於HttpServletResponseImpl,它是由Tomcat提供的HttpServletResponse接口的具體實現。
  • 方法main類似於Tomcat的內部代碼,該代碼調用doGet(),這與您的servlet的doGet()方法類似。
+0

請看我澄清以上.. – dido

+0

閱讀我的更新回答。 –

+0

感謝您的答案,但是我得到了p.getDriver()的編譯錯誤。它表示在Person類中缺少方法getDriver()。 – dido

0

然而,什麼樣的對象在「響應」的說法 被傳遞代碼執行時。由於PrintWriter類與 HTTPServletResponse及其父接口沒有任何關係,所以在作爲響應傳遞的該對象與PrintWriter對象之間必須存在某種連接 ...否則,我不會看到 如何將PrintWriter變量分配給響應。

我認爲你需要了解什麼是,

HttpServeltResponse從ServletResponse的

繼承

的ServletResponse具有的getWriter()

相關問題