我正在创建一个将由 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 调用。回顾一下:
- 将原始 POST 请求发送到 servlet
- 将 POST 参数保存到会话变量
- 重定向到 GWT 应用程序
- 进行 RPC 调用
onModuleLoad()
- 读取
ServiceImpl
类中的会话变量