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 吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 GWT 的客户端读取文件

谷歌网络工具包和 RPC

gwt 应用程序客户端的会话管理

如何使用 GWT 实现进度条?

gwt中会话超时时触发方法调用

调用 GWT RPC 服务