【问题标题】:Help using JAVA URL in a Google Web Toolkit project在 Google Web Toolkit 项目中使用 JAVA URL 的帮助
【发布时间】:2011-07-20 04:08:56
【问题描述】:

我正在尝试在我的 gwt 项目中实现 java URL。这是我迄今为止在试验、试错等方面所做的: HTML:

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <link type="text/css" rel="stylesheet" href="Test_project.css">
    <title>John Mathew's Google AJAX Search API Sample</title>      
    <script src="http://www.google.com/jsapi?key=*insert google api key*" type="text/javascript"></script>  
    <script type="text/javascript">
        google.load('search', '1');  
        google.setOnLoadCallback(function(){
            var searchControl = new google.search.SearchControl();
            searchControl.setResultSetSize(google.search.Search.LARGE_RESULTSET);     
            searchControl.addSearcher(new google.search.WebSearch());
            var drawOptions = new google.search.DrawOptions();
        drawOptions.setDrawMode(google.search.SearchControl.DRAW_MODE_TABBED);     
            searchControl.draw(document.getElementById("content"), drawOptions);           
        }, true); 
</script>

<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
    google.load('search', '1', {language : 'en', style : google.loader.themes.SHINY});
google.setOnLoadCallback(function() {
     var customSearchControl = new google.search.CustomSearchControl('*insert google cse id*');
     CustomSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
     customSearchControl.draw('cse');
}, true);
</script>
<script type="text/javascript" language="javascript" src="test_project/test_project.nocache.js"></script>

正在加载... document.writeln('搜索引擎2');
加载中...
document.writeln('搜索引擎 3');

<div id="customSearch"></div>       

现在 javascript 的两个部分都会生成一个 google 文本框和按钮。输入信息后,它将返回结果。这不是我想要的。我想获得结果供我操纵和玩耍。所以我做了一些研究,发现了 PHP get_file_contents() 和 JAVA URL()。我从未有过 PHP 经验,所以我选择了 Java(有 JQuery get() 但我对如何实现感到困惑,找不到示例)。

为了了解 Java URL() 的工作原理,我创建了一个 Java 项目并了解了这段代码:

URL urlsearch = new URL("*insert website*");        
BufferedReader buffreader = new BufferedReader(new InputStreamReader(urlsearch.openStream()));        
String HTMLdisplay;
while ((HTMLdisplay = buffreader.readLine()) != null) {
   System.out.println(HTMLdisplay);
}
buffreader.close();

它完全按照我想要的方式工作,因为它检索页面的 html 页面源(例如:http://www.bing.com/search?q=gygax)。为了实现这一点,我根据http://code.google.com/webtoolkit/doc/latest/tutorial/create.html 的指示创建了一个项目,因此在上面的 HTML 代码中有一行 .链接两者的命令在类onModuleLoad(): // Associate the Main panel with the HTML host page. RootPanel.get("customSearch").add(mainPanel);

这听起来有点令人困惑,所以我将总结一下:在我的 .java 上使用 Google Widgets 当我将它作为 Web 应用程序运行时,我创建了一个文本框和按钮。当您单击按钮时,假设执行 java url 代码并检索它查询的页面源。相反,我得到了这些错误:

[DEBUG] [test_project] - Validating newly compiled units
[ERROR] [test_project] - Errors in 'file:/C:/*file path*/Test_project.java'
[ERROR] [test_project] - Line 92: No source code is available for type java.net.URL; did you forget to inherit a required module?
[ERROR] [test_project] - Line 93: No source code is available for type java.io.BufferedReader; did you forget to inherit a required module?
[ERROR] [test_project] - Line 93: No source code is available for type java.io.InputStreamReader; did you forget to inherit a required module?
[ERROR] [test_project] - Line 99: No source code is available for type java.net.MalformedURLException; did you forget to inherit a required module?
[ERROR] [test_project] - Line 102: The method exit(int) is undefined for the type System
[ERROR] [test_project] - Line 107: The method exit(int) is undefined for the type System
[TRACE] [test_project] - Finding entry point classes
[ERROR] [test_project] - Unable to find type 'com.example.test_project.client.Test_project'
[ERROR] [test_project] - Hint: Previous compiler errors may have made this type unavailable
[ERROR] [test_project] - Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly
[ERROR] [test_project] - Failed to load module 'test_project' from user agent 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15 ( .NET CLR 3.5.30729; .NET4.0E)' at localhost:3410

我已经导入java.io.* and import java.net.*(也尝试过特定的包)以及许多com.google.gwt 包。

我的问题:如何克服这些阻止我在 GWT 项目中使用 JAVA URL 的错误?

【问题讨论】:

    标签: java html url gwt


    【解决方案1】:

    您不能在 GWT Project 客户端中使用 java.io.*java.net。由于 GWT 不提供上述包的等价物(Serializable 除外)。

    我认为Test_project.java 仅在客户端,因此您会收到此错误。

    在客户端你只能使用 lang,util 包。

    【讨论】:

    • 与上述相同的答案。谢谢。在进行查询后,我将不得不寻找不同的方向来获取 html 页面源。我在上面问过,但你知道有什么方法可以规避这个吗?到目前为止,它可能是 com.google.gwt.http.client 但还有什么能像 jQuery 那样解决这个问题的吗?
    • 理论上,如果项目有服务器端组件,应该可以隔离服务器端不兼容的包使用。但是,我在尝试在 gwt 项目中使用 protobuf 类时遇到了类似的情况:我遇到了同样的错误——“没有源代码可用于 java.io.InputStream 类型,...com.google.protobuf.GeneratedMessage等”——尽管只从服务器/rpc 方法中引用这些类。如果我找到有关如何从 gwt 隐藏这些引用的答案,我会回复。
    【解决方案2】:

    Google Web Toolkit 不支持整个 JRE 标准库; it emulates only certain classes 不幸的是,它没有 java.net.*。但是,它确实有com.google.gwt.http.client。你应该使用它。

    【讨论】:

    • 好的。我会调查 com.google.gwt.http.client 并看看该怎么做。谷歌并没有让这变得容易。我希望 bing 和 yahoo 不会那么困难。 jQuery 会绕过这个问题吗?
    • 我对 GWT 不是很熟悉,我不知道您想要实现什么,但您可以编写 Java 代码然后将其翻译成 JavaScript 并不是 GWT 的重点?如果您确实使用 jQuery,那么您可能会自己完成所有工作。
    【解决方案3】:

    您可以通过将不可翻译的代码移动到 Java 项目中的不同位置来完成这项工作。

    请记住,GWT 将 Java 转换为 javascript 并在浏览器中运行。 GWT 编译器针对模块的 client/ 目录下的任何内容,即。正如 no.good.at.coding 所提到的,javascript 缺少 java.io* 和 java.net* 包,因此 GWT 无法将您的那部分代码转换为 js。

    但是,如果您将代码移动到 server/rpc/ 下的服务器端 .java 文件并将其公开为服务,则可以使用任何您想要的库。要将服务器端 rpc 服务与 GWT 连接起来,您需要为您的服务创建一个同步和异步接口,以及实现,例如(不检查错别字):

    // rpc service interface, UrlGetServiceRpc.java:
    @RemoteServiceRelativePath("urlget.rpc")
    public interface UrlGetServiceRpc extends RemoteService {
    String getPage(String url);
    }
    
    // async version of the interface, UrlGetServiceRpcAsync.java:
    public interface UrlGetServiceRpcAsync {
    void getPage(string url, AsyncCallback<String> async);
    }
    
    // implementation of the service, UrlGetServiceRpcImpl.java:
    @Override
    public string getPage(string url) {
      // return page fetched using your code above.
    }
    
    // now in your page's module file... class level field:
    private UrlGetServiceRpc urlGetSvc;
    
    // in your page's constructor:
    this.urlGetSvc = GWT.create(UrlGetServiceRpc.class);
    
    // and when you want to display the html:
    this.someWidget.setHtml(urlGetAsync.getPage("foo.com/goodreading.html"));
    

    以上内容可能存在错误,但应该可以理解总体思路。我还从我的 GWT 模块(client/* 页面)中省略了不兼容包的导入语句,而是在我的方法中使用完全限定的引用(java.net.URL 而不仅仅是 URL)。这将非 GWTable 包的范围限制在方法级别,并有助于确保 GWT 编译器不会看到导入和抱怨。

    现在,您还可以通过在页面中将服务声明为private UrlGetServiceRpcAsync urlSvc;,然后调用该方法的异步重载来获取 html 并异步显示它。不过,这有点超出了这个问题的范围; Google 的“Communicating with a Server”文章是了解 GWT 应用程序中运行的内容以及如何将事物隔离到正确层的好地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 2011-09-03
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多