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>
答案 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)
答案 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”。