4

GWT:我可以在浏览器中调用 servlet。当我通过formpanel调用它时,它可以调用onSubmit。但它不会调用 onSubmitComplete。它还会弹出一个新窗口,uri 是我的 servlet。

String URL= GWT.getModuleBaseURL()+"getType";
         FormPanel formPanel = new FormPanel();  
         formPanel.setAction(URL); 
         formPanel.setEncoding(FormPanel.ENCODING_URLENCODED);  
         formPanel.setMethod(FormPanel.METHOD_GET); 

     formPanel.addSubmitHandler(new SubmitHandler(){

        @Override
        public void onSubmit(SubmitEvent event) {
            // TODO Auto-generated method stub
            System.out.println(event.getSource());
        }

     });
     formPanel.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() {  
            public void onSubmitComplete(SubmitCompleteEvent event) { 
                System.out.println("in");
                System.out.println(event.getResults());  
            }  
        });  
     formPanel.submit();

GWT.xml
 <servlet class="msp2.server.getType" path="/getType" />  


web.xml
    <servlet >
<servlet-name>getType</servlet-name>
    <servlet-class>msp2.server.getType</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>getType</servlet-name>
    <url-pattern>/msp2_app/getType</url-pattern>
</servlet-mapping>
4

6 回答 6

4

我知道这是一个老问题,但我只是遇到了同样的问题,这些答案都不是解决方案。调用后FormPanel.submit(),响应将在新选项卡中打开并且onSubmitComplete()不会被调用。

解决方案最终是 myFormPanel没有添加到我调用的对话框中submit()。由于表单完全由Hidden字段组成,其值是根据按下的页面上的按钮设置的,因此我FormPanel实际上不包含任何具有用户可选值的表单小部件,因此我不需要将其添加到任何地方的窗口。

这就是导致响应在新窗口中打开onSubmitComplete()而不被调用的原因。我将它添加到我的面板中,DialogBox然后它就可以正常工作了。

于 2014-02-27T10:23:29.707 回答
2

javadoc

后端服务器应该以“text/html”的内容类型进行响应,这意味着返回的文本将被视为 HTML。如果服务器指定了任何其他内容类型,则在 onFormSubmit 事件中发送的结果 HTML 将在浏览器之间不可预测,并且 onSubmitComplete 事件可能根本不会触发。

假设您说响应在另一个窗口中打开,并且您没有为您的 设置特定目标FormPanel,则可能是您的服务器没有这样做response.setContentType("text/html")(或与;charset=参数类似)

于 2012-10-26T10:23:07.990 回答
1

我已经挣扎过了

它还会弹出一个新窗口

我找到的所有答案都是关于将表单小部件添加到面板或添加 FormPanel 本身而不是小部件,使操作链接成为绝对链接和其他没有凝胶的东西。经过一个小时的尝试后,真正为我工作的解决方案是阅读 javadoc

  public FormPanel(String target) {...}

@param target 接收提交结果的<iframe>的名字,或者null指定当前页面被替换

只需将“_self”传递给 FormPanel 构造函数

FormPanel form = new FormPanel("_self");

或者稍后通过 .setTarget(...) 方法设置它。哇 - 它不会打开一个弹出窗口(这肯定会被 Chrome 阻止)还在方法中创建一个表单并提交它,甚至没有附加到 DOM 按预期工作。

于 2016-01-21T12:48:54.117 回答
0

如果表单提交成功完成,将调用 onSubmitComplete。确保表单提交没有错误。

发布您正在尝试的代码。它将帮助其他人找出问题所在。

您也可以尝试使用此处提供的 FormPanel 的示例

于 2012-10-26T03:52:01.810 回答
0

问题来自在 GWT 应用程序中使用的 iframe。在文件上传过程中,Javascript 中经常会出现跨域调用,这是不允许的。在开发应用程序期间,您打开开发模式,即在端口 9999 上,因此您的浏览器使用http://127.0.0.1:9999/YourApp.html。应该处理上传文件的 servlet 在另一台机器上或在同一台机器上但在另一个端口上运行(即http://127.0.0.1:6544/servlet/upload)。这两种情况都会遇到 Javascript 安全问题,因为域中包含端口号。

但是您可以在您的开发机器上安装一个 Apache 并使用 mod_proxy 将您的应用程序的两个部分移动到一个域中。将 -bindAddress 设置为 localhost 并为您的 GWT 应用程序使用静态端口(即 9999)。还使用静态端口(即 6544)在 localhost 上启动 servlet。然后你可以添加

ProxyRequests Off
ProxyPreserveHost Off
ProxyTimeout 3600

<Location /gui>
  Allow from All
  ProxyPass          http://localhost:9999
  ProxyPassReverse   http://localhost:9999
</Location>

<Location /api>
  Allow from All
  ProxyPass          http://localhost:6544/servlet
  ProxyPassReverse   http://localhost:6544/servlet
</Location>

到您的 Apache 配置。现在可以使用“ http://localhost/gui/YourApp.html ”启动 GWT 应用程序,并在 FormPanel.setAction() 中引用“/api/upload”(相对 URL)。现在两个域(GWT app 和upload-servlet)都在同一个域中(http://localhost),您将获得SubmitCompleteEvent.getResults()。在 servlet 中,您还必须将 HTTP 响应标头“Content-Type”设置为“text/html”。

于 2018-03-14T12:39:36.837 回答
0

我也有同样的问题,原来是我没有设置 FormPanel 的操作 URL。

final FormPanel formPanel = new FormPanel();
formPanel.setAction("/test");
于 2017-12-04T14:03:47.240 回答