GWT 客户端可以读取调用它的 httpservletresponse 吗?
Posted
技术标签:
【中文标题】GWT 客户端可以读取调用它的 httpservletresponse 吗?【英文标题】:Can GWT client read the httpservletresponse with which it was invoked? 【发布时间】:2014-04-10 13:34:50 【问题描述】:我有一个 Greasemonkey 脚本,它从一个站点读取文件的内容并通过 HTTP POST 方法将其发送到我的 GWT 应用程序中的 servlet。一旦内容在我的 servlet 中可用,我想将文件内容传递给 GWT 客户端(即触发使用文件内容打开应用程序)。
为了触发应用程序,我在我的 servlet 代码中使用了它:
response.sendRedirect("/path/to/my/application");
有什么方法可以读取我的 GWT 入口点类的 onModuleLoad() 中的文件内容吗?因为我将响应从 servlet 重定向到客户端,所以响应中会包含从其他站点读取的字符串文件吗?
目前我所做的是,
从站点读取文件并通过 HTTP-POST 将其发送到我的服务器。
在会话中存储字符串内容
向客户端发送 cookie 以指示服务器会话中有文件可供读取
客户端读取cookie,向服务器发送请求以获取文件。
我发现这种方法似乎有点绕。有没有更简单的方法,通过读取客户端的响应内容直接访问文件内容?
【问题讨论】:
【参考方案1】:您可能希望在您的web.xml
文件中使用load-on-startup
,然后覆盖您的servlet 中的init()
方法来完成所需的任务。
<servlet>
<servlet-name>startupTasks</servlet-name>
<servlet-class>xxx.xxxxxx.server.StartupTasksServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
更多信息请见here
【讨论】:
这是指定启动顺序的吧?我的查询类似于通过重定向访问内容的更简单方式。 这用于指定您想要在应用程序启动时执行的操作。即在 onModuleLoad() 之前。它将在您的服务器启动时运行。如果您的应用程序在没有文件内容的情况下无法运行,您可以尝试一下。【参考方案2】:使用Timer
,它将使用 GWT RPC 调用不断查看用户会话。如果在会话中找到文件内容,则只需将内容发送给客户端。
将以下代码放入您的入口点类中。
Timer timer = new com.google.gwt.user.client.Timer()
@Override
public void run()
//GWT RPC call to check the user session
// if you want then cancel the timer
//timer.cancel();
;
timer.scheduleRepeating(5000); // 5 seconds
或者你也可以试试这个
如果/path/to/my/application
正在重定向到 JSP 文件,那么您可以读取 JSP 文件中的会话属性。
服务器端:
session.setAttribute("keyname",fileContent);
JSP:
<div id="myHiddenDiv" style="visibility: hidden;"><%=session.getAttribute("keyname")%></div>
入口点:
System.out.println(getElementById("myHiddenDiv").getInnerhtml());
...
public static final native Element getElementById(String id) /*-
return $wnd.document.getElementById(id);
-*/;
【讨论】:
定时器没问题。但它不会增加开销,让它在后台持续运行吗?而且,我正在研究是否有方法可以访问 onModuleLoad 部分中的 HttpResponse 对象(使用该对象进行 response.sendRedirect 调用)? 获取内容后取消定时器即可。使用 Timer 没有任何开销,因为它就像在特定时间后调用的javascript
函数。
第二个选项呢?
我没有在我的应用程序中使用 JSP。不过看起来是个好主意。以上是关于GWT 客户端可以读取调用它的 httpservletresponse 吗?的主要内容,如果未能解决你的问题,请参考以下文章