我试图了解如何将 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/