为“HTTPServletResponse响应”分配了什么类型的参数

时间:2013-08-22 13:16:58

标签: java jsp http tomcat servlets

我试图理解如何在PrintWriter中发生response.getWriter()的分配。

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

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

我知道HTTPServletResponse的父接口(超级接口)包含一个返回PrintWriter类实例的getWriter方法。但是,当执行此代码时,在'response'参数中传递什么类型的对象。作为响应传递的对象与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 个答案:

答案 0 :(得分: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()。此方法在此null引用上调用accelerate()。显然,你得到一个NullPointerException。您无法在null上调用任何方法。

让我们重写你的例子,这个例子过于复杂而无法理解,甚至比简单的HttpResponse案例更复杂。

假设我们有一个界面Vehicle:

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,则不存在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()方法。

答案 1 :(得分:0)

  

但是,在'response'参数中传递了什么类型的对象   当这段代码执行时。必须有某种联系   在作为响应传递的对象和PrintWriter之间   object ...因为PrintWriter类与之没有任何关系   HTTPServletResponse也不是它的父代表面......否则我看不到   如何将PrintWriter变量分配给响应。

我认为您需要了解的是,

  

HttpServeltResponse继承自ServletResponse

     

ServletResponse有getWriter()