gpt4 book ai didi

java - ServletResponse 和 HttpServletResponseWrapper 之间的区别?

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:07 24 4
gpt4 key购买 nike

我是 servlet 的新手,正在阅读一些有关过滤器和包装器的文章。我能理解过滤器,但对包装器感到困惑。在书中,作者举了一个例子:

如果没有包装器:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {

String name = request.getParameter("name").trim();

try {
chain.doFilter(request, response);
PrintWriter out = response.getWriter();
if (name.length() == 0) {
out.println("Some message");
out.println("</body>");
out.println("</html>");
out.close();
}
} catch (Throwable t) {
}
}

如果是包装器:

 public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {

String name = request.getParameter("name").trim();

HttpServletResponse httpRes = (HttpServletResponse) response;
HttpServletResponseWrapper resWrapper = new HttpServletResponseWrapper(httpRes);
try {
chain.doFilter(request, response);

PrintWriter out = resWrapper.getWriter(); // why dont we just use response.getWriter();
if (name.length() == 0) {
out.println("<h3>Some message");
out.println("</body>");
out.println("</html>");
out.close();
}
} catch (Throwable t) {
}
}

为什么我们需要 HttpServletResponseWrapper 而我们可以在情况 1 中使用 ServletResponse 做同样的事情?谁能给我一个明确的例子,说明我们必须使用 HttpServletResponseWrapper 而不是 ServletResponse?我试过用谷歌搜索,但没有找到任何运气。

最佳答案

BalusC 的回答很好,但如果您刚开始,可能会有点不知所措。

简单地说:SerlvetResponse及其扩展名,HttpServletResponse , 是接口(interface)告诉你可以调用哪些方法来做你需要的事情。在使用过滤器、Servlet 等的正常过程中,您将经常使用 HttpServletResponse 来告诉您的应用程序如何响应请求。

HttpServletResponseWrapper是 HttpServletResponse 的一个特定实现,它为您提供了一种方便的方法来用您自己的一些逻辑包装现有的响应,而无需编写接口(interface)的全新实现。它有很多方法,所以这真的很棒。作为一个简单的例子,假设您想禁止调用 response.flushBuffer() .此代码使用 HttpServletResponseWrapper,将执行此操作:

class DisallowFlushResponseWrapper extends HttpServletResponseWrapper {
public DisallowFlushResponseWrapper(HttpServletResponse response) {
super(response);
}

@Override
public void flushBuffer() {
throw new UnsupportedOperationException("Don't call this!");
}
}

使用此类包装器的典型方法是创建如下过滤器:

class DisallowFlushFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
if (response instanceof HttpServletResponse) {
HttpServletResponse newResponse =
new DisallowFlushResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, newResponse);
}
...
}
...
}

请注意,我们使用我们自己的包装器实例包装进入过滤器的响应。然后我们将包装器传递给过滤器链中的下一个项目。因此,如果调用 flushBuffer(),此过滤器之后的任何内容都会出现异常,因为它将在我们的包装器上调用它。由于其默认行为,包装器会将任何其他调用委托(delegate)给包装的响应,这是真实的响应,因此除了调用该方法之外的所有内容都将正常工作。

关于java - ServletResponse 和 HttpServletResponseWrapper 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7023374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com