【问题标题】:Is it possible to activate a servlets doGet() from an EJB是否可以从 EJB 激活 servlet doGet()
【发布时间】:2011-11-14 23:03:49
【问题描述】:

我有一个独特的场景,我使用 servlet 通过调用数据库来动态输出到浏览器。内容类型是 RSS-XML,因此它可以从数据库更新 RSS 提要 xml。这工作正常。但是,我也有一个 EJB,可作为 Web 服务 @WebService 访问。这样所有的公共方法都可以通过 SOAP 事务访问。我也成功地实现了这一点。所以我通过 Java-WS/SOAP 更新数据库,我的问题是我没有同时更新 servlet 的 doGet(),这意味着它没有更新 Servlet 调用——即使数据库已成功更新。

如何强制从 EJB 对我的 servlet 进行 doGet() 调用?更新这些 HTML/XML 标记的唯一方法是调用 Servlet 并因此调用 doGet() 方法。

谢谢。

为清楚起见进行编辑:我的 Servlet 当前是从 jsp 页面作为 URL 访问的。它被引用为人们可以点击的链接。一旦人们点击它,它就会很好地更新,但由于它是一个 RSS 提要,我还希望能够在我将数据添加到数据库时调用/更新提要。到目前为止,我可以添加数据,但提要没有更新,因为我不知道如何在我的业务逻辑中调用 doGet()。

这就是我的 servlet 的相关部分的样子:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws     ServletException, IOException {

    Statuses = rssbean.arrayUpdates();

    XMLOutputFactory factory = XMLOutputFactory.newInstance();
    try {
        XMLStreamWriter writer = factory.createXMLStreamWriter(response.getOutputStream());
        response.setContentType("application/rss+xml; charset=UTF-8");


        writer.writeStartDocument();
        writer.writeStartElement("rss");
        writer.writeAttribute("version", "2.0");
        writer.writeStartElement("channel");
for(int i = 0; i < (Statuses.length); i++){
                writer.writeStartElement("item");
                    writer.writeStartElement("title");
                        writer.writeCharacters(Statuses[i]);
                    writer.writeEndElement();
                    writer.writeStartElement("link");
                        writer.writeCharacters("http://www.link.com");
                    writer.writeEndElement();
                    writer.writeStartElement("description");

                    writer.writeEndElement();
                writer.writeEndElement();

如您所见,我正在通过 doGet() 动态创建这个 .rss 文件。当您链接到它时,这工作正常,但我不确定如何从我的 EJB(而不是浏览器)运行这些编写器调用。

【问题讨论】:

  • 或者我应该在 servlet 本身内进行某种刷新或调用,以便它不断更新。我认为不可能从您的业务逻辑内部对 Servlet 进行这样的调用。 Servlet 用于 HTTP 请求。
  • “更新 doGet()”是什么意思?您是否在 Web 服务以及 servlet 中缓存数据库中的数据?
  • 我不太明白——servlet 不会在调用后刷新其从数据库中的输出吗?如果没有,设置一个标志来指示 servlet 需要刷新它的缓存,但是它的缓存。
  • 是的,这可能会刷新缓存或重新加载页面,但你如何做到这一点是我的问题。我可以从我的逻辑 bean 内部调用吗?
  • 您为什么要这样做?如果有人再次调用 servlet,您的 rssbean 会在数据库中获取最新的更改,不是吗?所以输出会如你所愿。您目前的方法是否遇到问题?

标签: jakarta-ee servlets get ejb


【解决方案1】:

你的 rssBean.arrayUpdates() 每次都需要查询数据库并返回结果。如果它返回一些预先存在的数据,那么这将不起作用。

单击链接并访问 servlet 后,servlet 从数据库中提取信息并将结果提供给客户端。

当您通过 Web 服务更新数据时,无需像您期望的那样调用 servlet 以确保它已更新。

HTTP 是请求/响应。一旦向客户提供了响应,他们就必须刷新页面或单击链接以刷新内容。

另请参阅缓存控制的 HTTP 标头http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

【讨论】:

  • rssBean.arrayUpdates() 确实查询数据库。那部分工作得很好。未完成的是 doGet() 的更新。是的,如果我单击 URL 中的引用,它将更新,但我不能指望用户在我更新数据库时单击 URL。他们不知道那是什么时候。
  • 是jsp还是浏览器缓存了你的结果?您是否尝试在页面上重新加载?
  • 让我解释一下,您调用 doGet 不会更新客户端。 期间。当他们订阅您的提要并转到您的提要链接时,他们将看到最新的内容。
  • 我也是这么想的。但至少我正在使用的提要阅读器没有触发 doGet() 方法,它似乎正在扫描缓存的数据并在那里等待更改。我认为有些人建议我进行自动刷新或重新加载可能是我唯一的选择。
  • 调试您的 servlet,也就是说,当您收到对该特定 servlet/链接的请求时,从您的提要阅读器...调试并查看发生了什么。是否调用了该方法?如果是这样,数据是否会重新加载?有些问题可以通过将一些 HTTP 标头设置为 no-cache 来解决。
猜你喜欢
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
相关资源
最近更新 更多