有什么好的理由为什么javax.servlet.Servlet
's 的
void service(ServletRequest req, ServletResponse res)
方法具有ServletResponse
给定的参数,而不是仅仅返回它?
4 回答
Java Servlet API 是一种抽象,它定义了任何 Java Web 应用程序处理任何类型的请求所需的最低要求(如果您查看它,您会注意到几乎所有的类都定义为接口或抽象类)。
该 API 由JCP在不同 Java 服务器供应商(IBM、Sun、Apache、Oracle 等)同意最低要求的过程之后定义,从而定义了现在被视为官方标准的内容。然而,不同的供应商有不同的方式来实现他们的 servlet 容器,导致现在它们的数量不同(每个都有不同的特性)。
由于 servlet 容器需要跟踪两个对象(请求和响应)以正确处理两者,它们不能利用为用户创建ServletResponse
(或 HTTP 变体HttpServletResponse
)的责任——记住里面的内容Servlet 的service
方法是用户代码。service
因此,servlet 容器在调用方法之前创建并预填充请求和响应对象(使用它们自己的实现) 。从用户的角度来看,仅通过接口处理它们就足够了,这也保护了供应商特定的代码,因为我们无法访问这两个对象的实际实现。
然而,在定义 API 时,这些供应商意识到,在某些情况下,用户希望覆盖任何这些对象的默认行为,因此他们包含一组可以由用户代码扩展的包装器( 、 等HttpServletRequestWrapper
)HttpServletResponseWrapper
并在 servlet 或过滤器中使用,以替换容器提供的默认实现。
一个完整的请求周期由 arequest
和 a组成response
,当我们发出请求时,A 请求和 A 响应对象由容器创建并提供处理它们的权限。
如果您看到文档
由 servlet 容器调用以允许 servlet 响应请求。
与请求关联的响应对象,您只需响应该请求即可。
如果你自己创建一个Response
对象,没有请求,你可以随机发送响应吗?
基于来自客户端的请求,Web 容器创建一个 ServletResponse 对象并将该对象传递到服务方法中,以便可以向客户端提供响应。
传入的对象res
将是特定于容器的子类ServletResponse
。您不能以独立于容器的方式自己创建这样的实例。