如何在客户端编程获取整个GWT页面的Html快照(或捕获所有文本)?

时间:2014-05-18 03:29:37

标签: gwt gwtp

为了让您了解我想要的内容,请阅读:

假设您有一个GWT页面(mydomain.com#!article)。该页面包含从DB下载的许多小部件和数据。 DB数据&小部件彼此混合,例如标签可以保存客户名称(客户名称来自DB)。

因此,该页面上的所有内容都是javascript,即当您查看源代码时,您只能看到Javascript。但是,如果您在Chrome&amp ;;中打开该GWT页面将其保存为“myGwtArticlePage.htm”到您的本地PC,然后重新打开“myGwtArticlePage.htm”,您可以看到“myGwtArticlePage.htm”中的所有文本,小部件...都完全相同作为“mydomain.com#!article”中的那些。

现在,您右键单击&查看源“myGwtArticlePage.htm”,您不仅会看到Javascript,还会看到所有文字,& Db数据&小部件还在那里。

因此,“myGwtArticlePage.htm”被称为“mydomain.com#!article”的Html快照。

你清楚吗?

现在我希望客户端的程序能够捕获“myGwtArticlePage.htm”的所有文本。

因此,MyArticlePresenter.java(在客户端包中)应该像这样工作:

private AsyncCallback<GetArticleResult> getArticleCallback=new AsyncCallback<GetArticleResult>(){
    @Override
public void onSuccess(GetArticleResult result) {
        String articleData=result.getArticleData;
        //... many other data from DB .....

        myLabel.setText(articleData);
        //... many other widgets that setText of the DB data ....

        // Now what I should do here to get Html Snapshot of "`mydomain.com#!article`" ??

    }
}

注意:人们说我可以使用HTMLUnit,但是HtmlUnit在服务器上工作而不是在客户端包中。此外,HTMLUnit无法正确解析GWTP页面。 GWTP是GWTP框架下的GWT app buit。

我希望有人能帮助我提出这个问题。

1 个答案:

答案 0 :(得分:0)

客户端代码,根据定义,必须在客户端上运行 - 对于GWT或任何HTML / JS应用程序,这意味着在Web浏览器中。

HtmlUnit 是一个Web浏览器,但是永远不会呈现在屏幕上。您仍然可以询问它当前页面的HTML内容。它完全用Java编写,因此可以在任何JVM中轻松运行,包括服务器。还要考虑PhantomJS,一个无头的Chromium - 你可以编写脚本来截取屏幕截图,导出html等。这是一个本机应用程序,你需要为你的服务器获得正确的构建,你需要连接到致电PhantomJS。

正确配置后,HtmlUnit应与GWT完美配合。 GWTTestCase默认情况下使用HtmlUnit在浏览器中运行GWT测试而不启动“真正的”浏览器实例。当然,要做到这一点,HtmlUnit必须在普通的JVM中运行,就像运行服务器一样。

也就是说,你不能直接调用客户端代码,而只需在HtmlUnit浏览器中启动HTML / JS(从GWT / Java编译)页面。

要考虑的另一个细节 - 速度。特别是如果您有兴趣被搜索引擎索引,速度很重要有两个原因。首先,搜索引擎将快速点击这些页面,并且当Google / Yahoo / Bing驱动并下载它可以找到的所有URL时,您不希望您的服务器被杀死。其次,服务器可以在对页面进行排名时考虑完成URL的速度。

  • 开发模式很慢,因为在浏览器中的JS(甚至是HtmlUnit)和真正的Java之间来回调用。由于您无论如何都要将应用程序编译为JS,因此无需在服务器上使用开发模式
  • 预加载页面:考虑定期运行htmlunit并生成简单的html页面,然后可以在请求时立即提供。如果您的数据不经常更改,这可能对您有用,并且如果页面已经预先渲染和缓存,那么它将是最快的。

最后,如果已经使用GWTP,请查看他们的Crawler服务,它似乎旨在使用编码片段过滤我们的URL并转换为#!令牌,然后将其传递给您的GWTP应用程序。有关详细信息,请参阅https://github.com/ArcBees/GWTP/wiki/Crawler-Support