我正在学习servlets
而我正在研究由我的教授创建的一个完整的例子。我的servlet的service()
方法如下所示:
public void service (ServletRequest req, ServletResponse res)
throws ServletException, IOException {
res.setContentType( "text/plain");
PrintWriter out = res.getWriter();
out.println( "Some response" );
out.close();
}
在上面的示例中,service()
使用了ServletResponse
个对象,因此我进入了我的servlet-api .jar
,搜索了javax.servlet.ServletResponse.class
并发现ServletResponse.class
是一个界面(public abstract interface javax.servlet.ServletResponse
)。所以在我的代码中我使用类型为ServletResponse
的对象,这是一个接口,但我认为你无法在Java中实例化一个接口。我还注意到这个接口是由ServletResponseWrapper.class
实现的。
所以我的问题是:
答案 0 :(得分:1)
您没有实例化接口ServletResponse
。您正在使用servlet容器在调用servlet上的service()
方法时传递给您的引用。容器实例化一个实现ServletRepsonse
接口的类。实例化(具体)类可以是ServletResponseWrapper
或任何其他"内部"类,只要它实现ServletResponse
接口。
尝试在res.getClass().getName()
方法中打印service()
。它应该告诉你servlet容器实例化的确切类名。
答案 1 :(得分:0)
我不相信你确实实例化了ServletResponse
;你只是简单地使用传递给你的实例。你不关心实施细节;你只关心界面指定的合同。
接口指定了联系人,可能有各种各样的实现。他们每个人都可以用不同的方式实现契约,但每个人的行为都完全相同(匹配界面中指定的内容)。