0

response.getWriter() の割り当てが PrintWriter にどのように発生するかを理解しようとしています。

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

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

HTTPServletResponse の親インターフェイス (スーパー インターフェイス) には、PrintWriter クラスのインスタンスを返す getWriter メソッドが含まれていることがわかっています。ただし、このコードの実行時に「response」引数で渡されるオブジェクトの種類。応答として渡されるオブジェクトと PrintWriter オブジェクトの間に何らかの接続が必要です... PrintWriter クラスは HTTPServletResponse やその親インターフェイスとは何の関係もないため...そうでなければ表示されませんPrintWriter 変数を応答に割り当てる方法。

この機能の独自の例を実装しようとして、Vehicle というクラスを返すメソッドを含む iDriveable というインターフェイスを作成しました。しかし、私は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);

    }

}

ありがとう

4

2 に答える 2

2

質問を理解しているかどうかわかりません。引数として渡されるオブジェクトは、次のようなサーブレット コンテナーによって提供されるクラスのインスタンスです。

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

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

    // other fields and methods
}

これは、別のオブジェクトを含むオブジェクトの単純なケースです。

編集:

あなたの例がうまくいかない理由を説明するには: dnull である を に渡しますv.testFunction()。このメソッドはaccelerate()、この null 参照で呼び出します。明らかに、NullPointerException が発生します。でメソッドを呼び出すことはできませんnull

あなたの例を書き直してみましょう。これは複雑すぎて理解できず、単純な HttpResponse ケースよりもさらに複雑です。

インターフェース Vehicle があるとしましょう:

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

そして単純なクラス Person:

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

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

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

Vehicle インターフェースのインスタンスは、それを実装するクラスを定義しないと存在できません。

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()似ており、サーブレットのdoGet()メソッドに似ています。
于 2013-08-22T13:21:53.313 に答える