在GWT中使用servlet上传文件时,如何避免URL更改?

在GWT中使用servlet上传文件时,如何避免URL更改?,gwt,servlets,file-upload,smartgwt,Gwt,Servlets,File Upload,Smartgwt,我可以选择在我的webapp中上传文件,我已经完成了,但是有一个问题:上传完成后,浏览器会将我重定向到“base_url”+在web.xml文件中定义的url模式。我知道这应该是正常的,因为我正在标记中定义它。但是,我希望我的webapp保持在当前的url中,我如何才能做到这一点 <servlet-name>uploadServlet</servlet-name> <servlet-class>com.premium.server.FileUplo

我可以选择在我的webapp中上传文件,我已经完成了,但是有一个问题:上传完成后,浏览器会将我重定向到“base_url”+在
web.xml
文件中定义的url模式。我知道这应该是正常的,因为我正在
标记中定义它。但是,我希望我的webapp保持在当前的url中,我如何才能做到这一点

  <servlet-name>uploadServlet</servlet-name>
    <servlet-class>com.premium.server.FileUploadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>uploadServlet</servlet-name>
    <url-pattern>/Project/upload</url-pattern>
  </servlet-mapping>

根据SmartGWT的文档,这是预期的行为:

不使用智能GWT服务器上传

如果可以接受应用程序在上载完成后重新加载整个页面,您可以简单地:

  • 将编码设置为“多部分”
  • 包含UploadItem以获取基本HTML上载控件
  • 将操作设置为已部署服务器端代码以处理上载的URL
  • 调用DynamicForm.submitForm以提交表单
这将导致DynamicForm组件像普通HTML元素一样提交到form.action URL。许多在线教程都解释了如何使用各种服务器端技术处理HTML表单文件上传

请注意,当您提交表单()时,将发送到actionURL的唯一值是存在实际表单项的值。这与saveData()不同,在saveData()中,始终发送整个表单值集。要处理提交额外值的操作,请使用HiddenItems

有关更多详细信息,请参阅UploadItem文档

-资料来源:

你可能正在寻找的是他们所谓的后台上传:

不使用智能GWT服务器的后台上传

实现后台文件上传而不使用Smart GWT服务器也是可能的,尽管要先进得多。除了上面的步骤之外,在页面中创建一个隐藏元素,并使用target在此IFRAME中以表单提交为目标。为了在上载完成时接收回调通知,在处理文件上载后,服务器应为IFRAME输出HTML内容,其中包括一个块,该块将导航出IFRAME(通常通过JavaScript全局“top”),并调用您声明为回调的全局方法

-资料来源:


注意:GWT自带的
FormPanel
小部件默认为后台上传。

这不是正常行为(除非SmartGWT认为应该这样)。你能为上传文件的表单显示你的代码吗?@ThomasBroyer嗯,我想这是正常的,因为标签的名字。在那里你可以看到代码。提前非常感谢。我正在使用SmartGWT的LGPL版本,所以我认为我不能使用该功能。我将尝试一下GWT的
FormPanel
。你在说什么“功能”?我引用了没有智能GWT服务器的部分。对不起,我误读了。我要试试后台上传。
private static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL() + "upload";

public void onModuleLoad() {
    final DynamicForm form = new DynamicForm();
    form.setAction(UPLOAD_ACTION_URL);

    form.setEncoding(Encoding.MULTIPART);
    form.setMethod(FormMethod.POST);

    SubmitItem submit = new SubmitItem("a", "Submit");
    submit.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            form.submitForm();
        }
    });
    UploadItem upload = new UploadItem();
    upload.setName("uploadFormElement");
    form.setFields(upload, submit);

    VLayout panel = new VLayout();
    panel.addMember(form);

    RootPanel.get().add(form);