我正在创建一个将由POST请求访问的GWT应用程序,该请求包含我关心的参数(用户ID等)。
到目前为止我所做的所有阅读都让我相信我应该创建一个servlet(我正在使用tomcat)来处理POST参数,然后转发到我的GWT应用程序。我已经完成了这项工作,但我仍然无法将此数据传递给我的应用程序。我已经看到了3种建议的方法:
在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。
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调用。作为回顾:
onModuleLoad()
ServiceImpl
class 答案 0 :(得分:1)
您可以通过GWT中的RPC调用与servlet交谈
您需要在GWT应用程序的起点进行RPC调用。
将该数据设置为服务器端会话,并在servceImpl
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
}
调用中获取会话数据
示例:
{{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}}类中覆盖多种方法:
RemoteServiceServlet
将为您提供传入请求的字符串表示形式。public String processCall(String payload)
将为您提供一个protected void onAfterRequestDeserialized(RPCRequest rpcRequest)
对象,其中包含一系列参数以及被调用的方法。RPCRequest
将为您提供HTTP请求的所有属性。