java - 什么样的参数分配给 'HTTPServletResponse response'

标签 java jsp http tomcat servlets

我试图了解如何将 response.getWriter() 赋值给 PrintWriter。

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

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

我知道 HTTPServletResponse 的父接口(interface)( super 接口(interface))包含一个 getWriter 方法,它返回一个 PrintWriter 类的实例。但是,执行此代码时,将在“响应”参数中传递什么样的对象。作为响应传递的对象与 PrintWriter 对象之间必须存在某种连接......因为 PrintWriter 类与 HTTPServletResponse 或其父接口(interface)没有任何关系......否则我看不到如何将 PrintWriter 变量分配给响应。

我尝试实现我自己的此功能示例,并创建了一个名为 iDriveable 的接口(interface),其中包含一个返回名为 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);

    }

}

谢谢

最佳答案

我不确定我是否理解这个问题。作为参数传递的对象是类的实例,由 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 情况还要复杂。

假设我们有一个接口(interface) 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 接口(interface)的实例不能存在:

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接口(interface)的具体实现。
  • 方法main类比Tomcat的内部代码,调用doGet(),类比你servlet的doGet() 方法。

关于java - 什么样的参数分配给 'HTTPServletResponse response',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381580/

相关文章:

Linux 上的 Java Runtime.exec() 参数

java - JNI - java ArrayList 转换为 c++ std::string*

c++ - HTTP 隧道示例

html - http响应中的空格和空行是否会影响下载页面的速度?

http - 如何在 axios 中设置全局 header ?

java - JAXB 注释将 XML 内容绑定(bind)为字符串

java - 从保管库中提取数据库 secret 以执行 Jooq 在本地主机上不起作用

java - 通过单击 JSP 中的按钮插入 MySQL 数据库

java - Adobe CQ。获取当前页面路径

javascript - 如何设置光标焦点onload?