通过servlet访问GWT POST参数?

时间:2013-08-27 17:45:04

标签: java session gwt tomcat servlets

我正在创建一个将由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”属性为null。

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

任何帮助将不胜感激!我一般都在学习GWT和网络开发,所以不要害怕在任何明显或愚蠢的错误中打电话给我。

谢谢!

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

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

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");

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

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

2 个答案:

答案 0 :(得分:1)

您可以通过GWT中的RPC调用与servlet交谈

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

将该数据设置为服务器端会话,并在servceImpl extendsRemoteServiceServlet.

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 } 调用中获取会话数据

示例:

{{1}}

我在这里写的一个简短示例:How to make an GWT server call(GWT RPC?)

答案 1 :(得分:1)

由于RemoteServiceServlet扩展了HttpServlet,您只需覆盖doPost()方法即可访问您的POST请求。不要忘记致电super.doPost() 编辑:这不起作用,因为该方法已在AbstractRemoteServiceServlet中完成,因此无法覆盖。

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

修改

您可以在扩展ServiceImpl的{​​{1}}类中覆盖多种方法:

  1. RemoteServiceServlet将为您提供传入请求的字符串表示形式。
  2. public String processCall(String payload)将为您提供一个protected void onAfterRequestDeserialized(RPCRequest rpcRequest)对象,其中包含一系列参数以及被调用的方法。
  3. RPCRequest将为您提供HTTP请求的所有属性。