0

我试图了解 response.getWriter() 的分配是如何发生在 PrintWriter 上的。

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

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

我知道 HTTPServletResponse 的父接口(超接口)包含一个 getWriter 方法,它返回一个 PrintWriter 类的实例。但是,当此代码执行时,在“响应”参数中传递了什么样的对象。作为响应传递的那个对象和 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);

    }

}

谢谢

4

2 回答 2

2

我不确定我是否理解这个问题。作为参数传递的对象是一个类的实例,由 servlet 容器提供,如下所示:

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()此空引用。所以很明显,你会得到一个 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(),这类似于您的 servlet 的doGet()方法。
于 2013-08-22T13:21:53.313 回答
0

但是,当此代码执行时,在“响应”参数中传递了什么样的对象。作为响应传递的那个对象和 PrintWriter 对象之间必须有某种连接......因为 PrintWriter 类与 HTTPServletResponse 或其父接口没有任何关系......否则我看不到如何将 PrintWriter 变量分配给响应。

我想你需要明白的是,

HttpServeltResponse 继承自 ServletResponse

ServletResponse 有 getWriter()

于 2013-08-22T15:35:29.167 回答