2013-08-27 76 views
1

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

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

  • 将数据保存到上下文:我现在有这个工作,但我对此并不满意。当访问servlet时,我解析参数并更新我的GWT Web应用程序的上下文,然后转发到应用程序,在该应用程序中进行RPC调用以读取上下文。这就是我想要的,但是当多个用户试图访问同一个应用程序并且环境正在迅速变化时,这会造成竞争状态。
  • 将数据存储在会话中:我已经尝试将数据保存到我的servlet中的请求会话中,然后访问我的RPC中的会话,但我总是得到一个新的/不同的会话,所以我假设我正在使用这个某处。在RPC上的servlet

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

    访问会话

保存会话

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

这将返回不同的会话,这会导致 “测试” 属性被空。

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

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

谢谢!

SOLUTION

我想通了什么问题是我会的做法:在我以前是想保存会话数据的servlet是从我的GWT应用程序单独的Tomcat Web应用程序。将它们移动到相同的Web应用程序解决了我的问题,现在它可以工作。我不确定,但我猜测这是一个问题,因为重定向到另一个Web应用程序切换上下文。我将概述我的整个做法,希望这样可以节省别人一段时间后:

把你的GWT项目的服务器文件夹你的servlet代码:

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

地图的servlet在您的GWT应用程序的网站。 XML:

<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> 

这个servlet现在应该是在访问.../GWTApplication/myServlet

下使STANDAR RPC。在任何你会要求在ServiceImpl类的服务器上:

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

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

  1. 将原始POST请求的servlet
  2. 保存POST参数,会话变量
  3. 重定向到
  4. 制作RPC调用onModuleLoad()
  5. 读取会话变量ServiceImpl GWT应用程序class
+0

不太确定我是否理解这里的问题。你能详细说明流程吗? – mithrandir

+0

有一个现有的应用程序(Sakai - 一个学习管理系统),它向我的GWT应用程序发出一个POST请求,并将其显示在现有应用程序的iFrame中。我基本上只是试图找到获取POST参数到我的GWT应用程序的最佳方式。这有帮助吗? – quickity

回答

1

您可以通过R与servlets通话在GWT中进行PC呼叫

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

设置这些数据的服务器端会话并获得servceImpl调用GWT的会话数据,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 




} 

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

+0

您是否建议将参数存储到我的servlet上的会话中,然后在GWT RPC调用中访问会话?我已经尝试过,并且无法访问同一个会话。 – quickity

+0

@quickity可以请你说明你是如何访问'session'吗?如果你无法访问'session',这很奇怪,会导致越来越多的问题。 –

+0

我已经更新了我的问题,以显示如何将会话保存在我的servlet中,重定向到我的GWT应用程序,然后在我的RPC中访问会话。 – quickity

1

由于RemoteServiceServlet延伸HttpServlet,您可以将doPost()方法重写为ac放弃您的POST请求。不要忘了打电话super.doPost()编辑:这是行不通的,因为该方法在AbstractRemoteServiceServlet定稿,所以它不能被覆盖。

此外,GWT Servlets POST数据使用专有的GWT RPC格式。了解更多关于该格式,以及如何在这里解释它:GWT RPC data format

编辑

有几种方法可以覆盖在扩展RemoteServiceServletServiceImpl类:

  1. public String processCall(String payload)会给你一个传入请求的字符串表示。
  2. protected void onAfterRequestDeserialized(RPCRequest rpcRequest)会给你一个RPCRequest有一个参数数组的对象,以及被调用的方法。
  3. public void service(ServletRequest request, ServletResponse response)将为您提供HTTP请求的所有属性。
+0

我所做的所有阅读说,你不能直接访问GWT应用程序内的POST参数。 – quickity

+0

对不起,您可以覆盖ServiceImpl类中的'service(ServletRequest,ServletResponse)'方法或'processCall(String)'方法。如果使用'service()',则可以执行'request.getParameterMap()'来获取参数。如果使用'processCall()',则会将POST请求看作一个包含参数的字符串。 – Churro

+0

好吧,我尝试了一些代码,下面是我发现的:如果重写'protected void onAfterRequestDeserialized(RPCRequest rpcRequest)','RPCRequest'对象会给你一个参数列表。我认为这是最好的方法。在这种方法中,你不必调用'super.onAfterRequestDeserialized()',因为超实现没有任何内容,因为它被打算被覆盖。 – Churro