Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml GWT和Sencha GXT:FormPanel结果失败_Xml_Gwt_Gxt_Formpanel - Fatal编程技术网

Xml GWT和Sencha GXT:FormPanel结果失败

Xml GWT和Sencha GXT:FormPanel结果失败,xml,gwt,gxt,formpanel,Xml,Gwt,Gxt,Formpanel,TL/DR:如何通过FormPanel可靠地加载XML响应 我们在GWT中有一个web应用程序,在大部分UI中使用Sencha GXT。我们使用GXTFormPanel将文件上载到服务器端脚本(它只是回显文件的内容)以获取JS中本地文件的内容。最终,这可以通过FileReader实现,但显然不能在不支持FileReader的浏览器中实现 FormPanel提交表单并将结果加载到隐藏的IFrame中,从中使用以下代码段(来自FormPanelImpl.class)提取内容: 试试看{ //确保已

TL/DR:如何通过
FormPanel
可靠地加载XML响应


我们在GWT中有一个web应用程序,在大部分UI中使用Sencha GXT。我们使用GXT
FormPanel
将文件上载到服务器端脚本(它只是回显文件的内容)以获取JS中本地文件的内容。最终,这可以通过FileReader实现,但显然不能在不支持FileReader的浏览器中实现

FormPanel
提交表单并将结果加载到隐藏的IFrame中,从中使用以下代码段(来自
FormPanelImpl.class
)提取内容:

试试看{
//确保已加载iframe的窗口和文档。
如果(!iframe.contentWindow | |!iframe.contentWindow.document)
返回null;
//获取主体的整个内部HTML。
返回iframe.contentWindow.document.body.innerHTML;
}捕获(e){
返回null;
}
我们以这种方式加载XML文件,问题是

return iframe.contentWindow.document.body.innerHTML;
因为在少数情况下,XML是作为XML加载的(因此不会嵌入到HTML包装中)。我尝试了以下方法:

  • 我最初使用了
    内容类型:text/html
    (本地PHP测试脚本中的疏忽,生产代码中的错误)。在Firefox和Chrome中工作,但在IE(9)中没有工作,IE(9)将XML作为XML加载到IFrame中
  • 内容类型:application/xml
    ,这将是有效负载的正确类型。现在它在任何地方都不起作用了,因为我们现在得到了最初只有IE在Chrome和FF中表现出来的行为
  • 内容类型:应用程序/八位字节流
    :这不是一个好主意,它只是下载文件
  • Content-Type:text/plain
    :我希望这会一直触发HTML/body包装,确实如此,但它也将所有内容包装在
    pre
    元素中,因此它现在到处都失败,但至少是可靠的。太好了
  • 经过一番挖掘,我发现显然GXT
    FormPanel
    使用了与GWT相同的
    FormPanelImpl
    ,因此两者的结果都是相同的。GWT的文件上说(Sencha明智地拒绝):

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

    但是,即使发送
    text/html
    ,如果有效负载是XML,那么跨浏览器的行为也是不可预测的

    有没有一个通用的解决方案?还是我遗漏了一些非常琐碎的东西(我现在只看了三天GWT)

    编辑:我尝试在文件内容前加上
    ,这样即使IE在IFrame中也会有一个主体。的确如此,但它也导致了一个非常非常奇怪的
    innerHTML
    开始:

    <?XML:NAMESPACE PREFIX = [default] ...
    

    我的猜测是,一般来说,在HTML上下文中包装XML而不执行任何特殊字符转义是不可靠的。我希望它至少在使用XML文档时失败,比如

    <a>
      <b>
        <html>
        </html>
      </b>
    </a>
    
    
    
    我们采取的方法是只发送一个小的“OK”消息,然后使用单独的请求从服务器获取(缓存的)内容


    或者,也可以执行HTML编码/解码(或Base64…)

    一个解决方法是覆盖类com.google.gwt.dom.client.Element.FormPanelImpl中的方法getContents

    public native String getContents(Element iframe) /*-{
      try {
        // Make sure the iframe's window & document are loaded.
        if (!iframe.contentWindow || !iframe.contentWindow.document)
          return null;
    
        // Get the body's entire inner HTML.
        return iframe.contentWindow.document.body.textContent;
      } catch (e) {
        return null;
      }
    }-*/;
    
    代码更改是使用textContent而不是innerHTML

    public native String getContents(Element iframe) /*-{
      try {
        // Make sure the iframe's window & document are loaded.
        if (!iframe.contentWindow || !iframe.contentWindow.document)
          return null;
    
        // Get the body's entire inner HTML.
        return iframe.contentWindow.document.body.textContent;
      } catch (e) {
        return null;
      }
    }-*/;
    
    我不知道这是否是一个GWT错误


    Jordi.

    目前,任何编码都会带来一些痛苦,原因有两个:(a)它是GWT,所以几乎只有Java语言没有Java标准库,这意味着大多数解码Base64的方法都无法运行。(b)编码是在字节级别完成的,这需要我在之后找出编码(希望是UTF-8,但你永远不会知道)。既然GWT没有处理这个问题的条款,我仍然不知道如何处理它。至少我还是会说这是一个GWT文档问题(好像还不够)。@Joey:我同意,(GWT)FormPanel文档在这里可能缺少一些细节(GXT文档甚至更多)。我们发现使用单独的请求有很多优点:它允许更容易的重新下载,使用下载管理器进行并行下载,提高了安全性(使用一个servlet镜像您发送的所有内容可能会很危险),…我现在使用中的方法解决了这个问题。它本质上是用HTML实体替换特殊字符,并在客户端解码。我现在唯一的问题是Chrome中的随机异常,但仅限于托管模式,但这是另一个问题;-)。单独下载上传的文件会太多,我们现在在这里工作,我甚至不知道我们是否有办法从echo脚本中编写文件,所以我现在排除了这个问题。我如何让
    FormPanel
    使用我的派生实现呢?我打开了一个票证,但显然他们不会修复它,因为FormPanel的文档说它只能返回text/html.new FormPanelImpl(){public native String getContents(com.google.gwt.dom.client.Element iframe)/*-{JSCode}-*/;};