我试图理解如何在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);
}
}
由于
答案 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()