【发布时间】: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