【问题标题】:What kind of argument is assigned to 'HTTPServletResponse response'为“HTTPServletResponse 响应”分配了什么样的参数
【发布时间】:2013-08-22 13:16:58
【问题描述】:

我试图了解 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);

    }

}

谢谢

【问题讨论】:

    标签: java jsp http tomcat servlets


    【解决方案1】:

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

    public class HttpServletResponseImpl implements HttpServletResponse {
        private PrintWriter out = new PrintWriter(...);
    
        @Override
        public PrintWriter getWriter() {
            return this.out;
        }
    
        // other fields and methods
    }
    

    这是一个对象包含另一个对象的简单案例。

    编辑:

    解释为什么您的示例不起作用:您将d(为空)传递给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()方法。

    【讨论】:

    • 感谢您的回答,但是我在 p.getDriver() 上遇到编译错误。它说 Person 类中缺少方法 getDriver()。
    • 对不起,我的意思是System.out.println(p)。现已修复。
    • “汽车”及其与 HttpServletResponseImpl 的类比正是我所缺少的。那是我没看懂的部分。因此,作为“响应”传入的参数实际上是实现 ServletResponse 接口的 HttpServletResponseImpl 实例(由 Tomcat 本身提供)。我现在明白了吗?
    • 是的。只需将System.out.println(response.getClass()) 添加到您的doGet() 方法(或使用调试器),您就会知道该类的实际名称。
    【解决方案2】:

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

    我认为你需要了解的是,

    HttpServeltResponse 继承自 ServletResponse

    ServletResponse 有 getWriter()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多