由于HttpServletRequest 和 HttpServletResponse是接口,我们知道在 Java 中我们不能实例化接口。那么我们如何在doGet()或doPost() 中拥有这 2 个对象?
//这里的东西....... doPost(HttpServletRequest request,HttpServletResponse response) { //这里的东西 }
由于HttpServletRequest 和 HttpServletResponse是接口,我们知道在 Java 中我们不能实例化接口。那么我们如何在doGet()或doPost() 中拥有这 2 个对象?
//这里的东西....... doPost(HttpServletRequest request,HttpServletResponse response) { //这里的东西 }
这些是由运行您的 servlet 的任何 Servlet 容器提供的。这是 Java 世界如何使用接口来指定其他人通过提供这些接口的具体实现来遵循的契约的一个很好的例子。
Servlet 规范指定了用于构建 servlet 执行环境的 API,即servlet容器。servlet 规范,与任何标准设置文档一样,不提供实际的软件实现,只是行为的定义,即实现软件必须遵循的合同。接口用于定义这种行为。
这些接口是在javax.servlet.*
包空间中提供的,它是 Java EE 的一部分——我认为。无论如何,它是 Java 的一部分。希望提供 Servlet 容器实现的人们必须提供实现这些接口的类;具体实现的内部细节——tomcat、jetty 等——只要符合接口的约定,就可以有很大的不同。
许多接口是由 servlet 容器本身实现的,但有些接口是由应用程序开发人员实现的。例如,如果您正在编写一个 web 应用程序,您可能会提供您自己的应用程序特定的javax.servlet.Servlet
接口实现。
在运行时,当 servlet 容器接收到映射到您的 Servlet 接口实现的请求时,容器将创建它自己javax.servlet.http.HttpServletRequest
的它想处理那个请求。通过请求对象可用的数据包括请求 URI、请求参数等。
这些接口的实现类将由 Web 服务器(或)应用服务器提供。他们会注意为这些接口创建对象。
当您使用 Servlet 运行 Java Web 应用程序时,您的代码将部署到 Web 容器(例如 Tomcat)或应用程序服务器(例如 JBoss)上。这些服务器提供它们自己的这些接口的实现(即实现这些接口的具体类)并将它们的实例传递给您的servlet 的方法。
“servlet 容器”* 提供了这些对象的实现。在编写单元测试时,您可以使用 Mockito 等模拟框架来实例化这些接口的模拟实现。
*例如 Google App Engine、Glassfish、Tomcat、JBoss 等。