zoukankan      html  css  js  c++  java
  • GWT中实现跳转及不同entrypoint怎么互相访问

    怎么跳转? 
    跳转这个概念这里指的是从一个web页面跳转到另一个web页面,如果我们使用gwt来开发web,很自然的我们会想到怎么从一个gwt做的页面跳转到另一个gwt做的页面。 

    但从网上的gwt例子来看,似乎gwt的应用更像一个桌面应用:总的就一个页面,相当于应用程序主体,不同的功能就是不同的gwt控件在做展示。没有像普通的web 应用那样不同的功能是在不同的web页面上,从一个功能到另一个功能就是一个页面跳转到另一个页面。gwt应用更像桌面应用,不同的功能用不同的gwt控件表示,如gwt窗体,gwt对话框,gwt tab等等。各种控件的数据都是通过ajax从服务端取得,gwt把界面定义出来,数据再去取,而不是像传统的web应用那样,一个web页面展示一个功能,同时把数据与界面混合写在一起,返回给客户端 

    gwt的一个ui module就代表了一个页面,gwt会生成一个相应的html文件,在该文件中加载module生成的js。所以如果要加多个module的话,就得每个module建立自己的html文件,在其中加载自己的module js,一个加载module的html看起来如下: 

    Html代码  收藏代码
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    2. <html>  
    3.   <head>  
    4.     <meta http-equiv="content-type" content="text/html; charset=UTF-8">  
    5.    
    6.     <!--                                                               -->  
    7.     <!-- Consider inlining CSS to reduce the number of requested files -->  
    8.     <!--                                                               -->  
    9.     <link type="text/css" rel="stylesheet" href="Gwtapp.css">  
    10.    
    11.     <!--                                           -->  
    12.     <!-- Any title is fine                         -->  
    13.     <!--                                           -->  
    14.     <title>Web Application Starter Project</title>  
    15.    
    16.     <!--                                           -->  
    17.     <!-- This script loads your compiled module.   -->  
    18.     <!-- If you add any GWT meta tags, they must   -->  
    19.     <!-- be added before this line.                -->  
    20.     <!--                                           -->  
    21.     <script type="text/javascript" language="javascript" src="gwtapp/gwtapp.nocache.js"></script>  
    22.   </head>  
    23.    
    24.   <!--                                           -->  
    25.   <!-- The body can have arbitrary html, or      -->  
    26.   <!-- you can leave the body empty if you want  -->  
    27.   <!-- to create a completely dynamic UI.        -->  
    28.   <!--                                           -->  
    29.   <body>  
    30.    
    31.     <!-- OPTIONAL: include this if you want history support -->  
    32.     <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;0;height:0;border:0"></iframe>  
    33.   </body>  
    34. </html>  



    如果自己加了module,gwt自己不会为它建立相关的html文件,cypal插件就会 

    现在的问题是,建立好了两个module,也知道了加载他们的html文件名,那如何在一个module里打开另一个module呢?,这个java代码怎么写? 

    1.  gwt中的java代码会被转换成javascript代码 
    2. 要能在java代码中写页面的跳转功能 
    3. 如果在javascript写跳转当然很方便,直接window.lcoation=“url” 
    4. 所以如果能在java代码中直接写这个javascript代码不就可以实现跳转了吗 
    5. 所以通过jsni在java代码里直接写javascript不就可以了吗 

    例如 

    Java代码  收藏代码
    1. public static native void redirect(String url)/*-{ 
    2.       $wnd.location = url; 
    3.   }-*/;  



    6.gwt有没有为我们提供这个接口呢?有就最gwt的<strong>com.google.gwt.user.client.Window</strong>类 

    不同EntryPoint怎么互相访问 
    一个EntryPoint就是一个module里包含的模块,负责处理界面上的某个界面内容,GWT会根据它们的定义顺序加载它们 
    现在项目需要在一个EntryPoint中调用另一个EntryPoint中的方法 
    整理一下思路 

    1. 它们都在同一相module下 
    2. gwt会根据定义的顺序创建他们,并调用他们的onModuleLoad方法 
    3. GWT应该知道一个module里都有那些entrypoint,并能够访问到它们 
    4. GWT应该有相关的工厂 
    5. 但是没找到这个工厂 
    6. 另一个思路,所有的entrypoint都会被转换成javascript 
    7. 能不能通过javascript来找到这个entrypoint呢 
    8. java与javascript怎么互访? 
    9. 使用jsni,但jsni要访问一个Entrypoint,也得有这个对象的引用,我们现在要知道了就是怎么在一个Entrypoint里得到另一个entrypoint的引用 
    不过这里记录一下jsni怎么访问java代码,如果访问一个类的方法: 
    类引用.@类的全名::方法名(方法定义时参数定义)(实参); 
    类的全名::静态方法名(方法定义时参数定义)(实参); 

    10。自己写代码来实现这个功能,我们写一个单体的注册类,我们把所有加载的EntryPoint都在这个类上面注册,其它地方使用的时候再从这个注册类里面取得,这是可行的: 

    Java代码  收藏代码
    1. public class Register {  
    2.  private static Map&lt;String, EntryPoint&gt; registry = new HashMap&lt;String, EntryPoint&gt;();  
    3.  public static void register(String name,EntryPoint entry){  
    4.   registry.put(name, entry);  
    5.  }  
    6.  public static EntryPoint getEntryPoint(String name){  
    7.   return registry.get(name);  
    8.  }  
    9. }  
    10.    
    11. public void onModuleLoad() {  
    12.   Register.register("CreditrightStatisitcs"this);  
    13. .....................  
    14.    
    15. public void onModuleLoad() {  
    16. Register.register("CreditrightListModule"this);  
    17. com.google.gwt.user.client.Window.alert("in java:"+((CreditrightStatisitcs)Register.getEntryPoint("CreditrightStatisitcs")).test());  



    这个成功做到一个EntryPoint访问另一个EntryPoint 

    以上是原作者的文章,不过想法很好,他说的这种方法我们在开发中以用过不只一次了,什么时候本人将把方法总结后写出来!

  • 相关阅读:
    Confluence 6 从一个备份中获得文件附件
    Confluence 6 从其他备份中恢复数据
    Confluence 6 从生产环境中恢复一个测试实例
    从 Confluence 5.3 及其早期版本中恢复空间
    Confluence 6 恢复一个空间的问题解决
    Confluence 6 从一个 XML 备份中导入一个空间
    Confluence 6 恢复一个空间
    Confluence 6 恢复一个站点有关使用站点导出为备份的说明
    网易蜂巢(云计算基础服务)MongoDB服务重磅来袭
    pdfjs viewer 开发小结
  • 原文地址:https://www.cnblogs.com/zhwl/p/3577930.html
Copyright © 2011-2022 走看看