1

我正在创建一个将由 POST 请求访问的 GWT 应用程序,其中包含我关心的参数(用户 ID 等)。

到目前为止,我所做的所有阅读都让我相信我应该创建一个 servlet(我使用的是 tomcat)来处理 POST 参数,然后转发到我的 GWT 应用程序。我已经完成了这项工作,但我仍然无法将此数据传递给我的应用程序。我已经看到了 3 种建议的方法:

  • 将数据保存到上下文中:我现在有这个工作,但我对它不满意。当访问 servlet 时,我解析参数并更新我的 GWT Web 应用程序的上下文,然后转发到我进行 RPC 调用以读取上下文的应用程序。这可以满足我的要求,但是当多个用户尝试同时访问应用程序并且上下文快速变化时,这会产生竞争条件。
  • 在会话中存储数据:我尝试将数据保存到我的 servlet 中的请求会话,然后在我的 RPC 中访问会话,但我总是得到一个新的/不同的会话,所以我假设我在某个地方搞砸了。

在 servlet 上保存会话

HttpSession session = request.getSession();
session.setAttribute("test", "testValue");
response.sendRedirect(response.encodeRedirectURL("/GWT_Application"));

RPC 中的访问会话

HttpSession session = this.getThreadLocalRequest().getSession();
session.getAttribute("test");

这将返回一个不同的会话,从而导致“test”属性为空。

  • 在 URL 中传递数据:我的应用程序将在 iframe 中打开,这意味着Window.location.getParameter()将无法使用。

任何帮助将不胜感激!总的来说,我仍在学习 GWT 和 Web 开发,所以不要害怕在任何明显或愚蠢的错误上叫我出来。

谢谢!

解决方案

我发现我的会话方法存在什么问题:我之前尝试保存会话数据的 servlet 位于与我的 GWT 应用程序不同的 tomcat Web 应用程序中。将它们移动到同一个网络应用程序解决了我的问题,它现在可以工作了。我不确定,但我猜这是一个问题,因为重定向到另一个 Web 应用程序会切换上下文。我将概述我的整个方法,希望这可以在以后节省其他人:

将您的 servlet 代码放在 GWT 项目的 server 文件夹中:

package GWTApplication.server;
public class myServlet extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    session.setAttribute("myAttribute", request.getParameter("myParam");
    // handle rest of POST parameters
    response.sendRedirect(response.encodeRedirectURL("/GWTApplication");
  }
}

在 GWT 应用程序的 web.xml 中映射 servlet:

<servlet>
  <servlet-name>myServlet</servlet-name>
  <servlet-class>GWTApplication.myServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>myServlet</servlet-name>
  <url-pattern>/myServlet</url-pattern>
</servlet-mapping>

现在应该可以在 .../GWTApplication/myServlet 访问此 servlet

接下来制作一个标准的 RPC。在您将在ServiceImpl服务器上的类中调用的任何方法中:

HttpSession session = this.getThreadLocalRequest().getSession();
return session.getAttribute("myAttribute");

onModuleLoad()最后,在GWT 应用程序的方法中进行 RPC 调用。回顾一下:

  1. 将原始 POST 请求发送到 servlet
  2. 将 POST 参数保存到会话变量
  3. 重定向到 GWT 应用程序
  4. 进行 RPC 调用onModuleLoad()
  5. 读取ServiceImpl类中的会话变量
4

2 回答 2

1

由于RemoteServiceServletextends HttpServlet,您可以重写doPost()方法来访问您的 POST 请求。不要忘记调用super.doPost() EDIT:这不起作用,因为该方法已完成,AbstractRemoteServiceServlet因此不能被覆盖。

此外,GWT Servlets 使用专有的 GWT RPC 格式发布数据。在此处阅读有关该格式以及如何解释它的更多信息:GWT RPC 数据格式

编辑

您可以在ServiceImpl扩展类中覆盖几种方法RemoteServiceServlet

  1. public String processCall(String payload)将为您提供传入请求的字符串表示形式。
  2. protected void onAfterRequestDeserialized(RPCRequest rpcRequest)将为您提供一个RPCRequest具有参数数组的对象以及被调用的方法。
  3. public void service(ServletRequest request, ServletResponse response)将为您提供 HTTP 请求的所有属性。
于 2013-08-27T17:54:53.880 回答
1

您可以通过 GWT 中的 RPC 调用与 servlet 对话

您需要在 GWT 应用程序的起点进行 RPC 调用。

将该数据设置为服务器端会话并在servceImpl调用 GWT时extends获取会话数据RemoteServiceServlet.

例子 :

YourServiceImpl extends RemoteServiceServlet  {

@ovveride
doGet(){
  //you can access session here
}

@ovveride
doPost(){
//you can access session here
}

@ovveride
doPut(){
//you can access session here
}

----your other methods




}

我在这里写的一个简短示例:如何进行 GWT 服务器调用(GWT RPC?)

于 2013-08-27T17:53:43.493 回答