GWT formpanel不会调用onSubmitComplete

时间:2012-10-25 23:22:16

标签: java gwt servlets

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>

6 个答案:

答案 0 :(得分:3)

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

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

这是导致响应在新窗口中打开而onSubmitComplete()未被调用的原因。我将它添加到我DialogBox的面板中,之后它按原样运行。

答案 1 :(得分:2)

来自the javadoc

  

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

如果您说响应在另一个窗口中打开,并且您没有为您的FormPanel设置特定的目标,则可能是您的服务器没有执行{ {1}}(或类似于response.setContentType("text/html")参数)

答案 2 :(得分:1)

我一直在努力奋斗

  

它还会弹出一个新窗口

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

  public FormPanel(String target) {...}
  

@param定位&lt; iframe&gt;的名称收到结果               提交,或null指定当前页面              被替换

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

即可
FormPanel form = new FormPanel("_self");

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

答案 3 :(得分:0)

如果表单提交成功完成,将调用

onSubmitComplete。确保表单提交中没有错误。

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

您还可以尝试使用提供here

的FormPanel的示例

答案 4 :(得分:0)

我也遇到了同样的问题,结果是我没有设置FormPanel的操作URL。

final FormPanel formPanel = new FormPanel();
formPanel.setAction("/test");

答案 5 :(得分:0)

问题来自iframe,它在GWT应用程序中使用。在文件上传期间,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)。还要在localhost上使用静态端口(即6544)启动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”。