【问题标题】:Wrapper, Filter and Servlet包装器、过滤器和 Servlet
【发布时间】:2013-05-05 00:34:05
【问题描述】:

由于我是 Servlet 编程的新手,我可能会问一个基本问题。

我正在编写一个应用程序,其中过滤器从 servlet 获取响应,并使用它进行一些计算。我发现我需要一个包装类来捕获响应。

我现在的问题是为什么需要包装器?提前致谢!

【问题讨论】:

  • 只有你可以回答这个问题,因为你已经发现你需要一个包装类:-) 你想要实现什么?不,包装器(请求/响应)并不总是必要的......
  • 据我了解,当我想捕获 Servlet 响应并在过滤器中对其进行处理时,我需要一个包装器。那是对的吗?这种情况怎么样:我有一个表单,用户可以在其中输入用户名和一些文本。这应该显示在另一个页面上。我知道 servlet 可以接受输入参数并转发到另一个页面。我可以用过滤器达到同样的效果吗?
  • 1.不,谁告诉你的(这里有一个例子可能会有所帮助)? 2. 我宁愿不在过滤器中实现业务逻辑,为什么您认为过滤器是更好的选择?
  • 我想我只是对这两件事的用途感到很困惑......
  • 一般来说,您应该对非功能性方面使用过滤器。有关示例,请参阅 docs.oracle.com/javaee/6/api/javax/servlet/Filter.html

标签: servlets filter wrapper


【解决方案1】:

1) 首先让我们了解RequestRequest Filter 的工作原理:

当客户端向 servlet 发出请求时,它会通过容器。容器决定需要将 Request 转发到哪个 servlet。这意味着,容器处于完全控制之中。

容器控制使实现请求过滤器变得容易,因为我们可以让容器知道Request应该先到过滤器然后到servlet。因为容器处于完全控制之中。所以实现 request 过滤器很容易。

2) 现在让我们了解ResponseResponse Filter 的工作原理:

当容器调用 Servlet 服务方法时,它会将 2 个对象传递给方法,RequestResponse

这仅仅意味着 Servlet 可以完全控制将响应发送回客户端。如何 ?

因为Response 对象具有指向Output Stream Writer 对象的指针。这意味着,一旦 Servlet 处理完请求,它将使用 pointerResponse 直接写回客户端到 Output Writer Stream 对象。因此,Servlet 不会等待任何人(像过滤器这样的中间人)并直接为客户端服务。到时候再干预就太晚了。

那么,解决方案是什么?

Wrapper 是我们的解决方案。

Wrapper 是如何工作的?

因此,在容器将真正的RequestResponse 对象传递给Servlet 之前,我们将包装我们的Response 对象,然后将Real RequestWrapped Response 对象发送给Servlet 服务方法。

所以现在,Servlet 有指向我们的Wrapped Output Stream Writer 对象而不是Real Response Output Stream Writer 对象的指针。所以,当 Servlet 完成请求时,它会将响应写到我们的Wrapped Stream,然后我们的Wrapped Response Object 会写回Real Response Writer Stream

故事的寓意:在处理Response 时使用wrapperRequest 不需要包装器概念。

【讨论】:

猜你喜欢
  • 2014-04-17
  • 1970-01-01
  • 2016-11-19
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2019-02-11
相关资源
最近更新 更多