嗨,我有GWT客户端,标准的服务器端Servlet。
BUT
我有动作的GWT FormPanel(myModule +“import”)。 FormPanel从servlet调用 POST 。然后浏览器将我重定向到 myurl / import ,这样我就可以看到上传文件的内容。
但不是我想要的。我只想把我的弦回来。我补充道 submitCompleteHandler到我的FormPanel,但它没有记录任何结果。
我注意到servlet有方法setContentType
所以我尝试了text / html,text / plain ...我不知道应该在那里...
用一句话来说,我想从servlet向客户端发送String,而不需要浏览器将其重定向到其他地方。可能吗?
答案 0 :(得分:3)
由于您要提交表单,因此您的浏览器会更改导航。为了使它按照您希望的方式工作,您必须使用ajax发送文件。对于GWT,有GWTUpload库允许您这样做。
答案 1 :(得分:2)
如果浏览器重定向您,那是因为您为FormPanel提供了“目标”。默认情况下,它在隐藏的iframe(a.k.a“ajax upload”)中提交。
正如in the javadoc所述,如果您希望可靠地调用setContentType("text/html")
,则必须在您的servlet中onSubmitComplete
。
onSubmitComplete
的结果是返回的HTML body
innerHTML
,因此在使用<
发回值时必须非常小心其中&
。让他们回来的唯一可靠方法是在服务器端转义,并在客户端取消它们。您可以使用自己的转义机制,也可以使用<
和&
。在后一种情况下,对于客户端的unescape,你要么使用String#replace,要么创建一个HTML元素,用你得到的字符串设置它的innerHTML,然后得到它的innerText:
public String htmlUnescape(String htmlEscaped) {
Element tmp = Document.get().createDivElement();
tmp.setInnerHTML(htmlEscaped);
return tmp.getInnerText();
}
在服务器端,您可以使用:
escaped = content.replace("&", "&").replace("<", "<")
(如果您不希望<
成为&lt;
,则此处的顺序很重要;此外,替换<
和&
就足够了,>
和"
这里不会引起任何问题)
在你的情况下,首先要确保文件的内容是“文本”而不是“二进制”,因为返回它是没有意义的,因为String可能会导致问题,具体取决于你如何使用客户端上的值侧。