GWT:调用外部JavaScript库(sjcl)方法

时间:2012-04-20 03:11:38

标签: javascript gwt

我想在我的GWT项目(客户端)中使用外部加密库。 (特别是斯坦福Javascript加密库,http://crypto.stanford.edu/sjcl/ 我在项目的gwt配置文件(MyProj.gwt.xml)中添加了这些行

<script src="libs/sjcl/sjcl.js" />
<script src="libs/sjcl/core/sha256.js" />

并在我的安全类中创建了一个新方法:

public static native String sha256(String ptext)
      /*-{
       return sjcl.hash.sha256.hash(ptext);
       }-*/;

但是当我称之为

String result = Security.sha256("password");

我收到错误(“sjcl未定义”)

如果知道这些问题的人和javasript可以阅读图书馆并告诉我正确的方法,那么我将节省大量的时间和精力 - 不用挖掘怪异的JavaScript。

UPD:

我首先想到的是,外部库必须在/ war目录中 其次,如果我将以下内容添加到gwt.xml文件中,我无法使GWT导入* .js文件

<script src="libs/sjcl/sjcl.js"></script>
<script src="libs/sjcl/core/sha256.js"></script>

我必须在Entry point的html源

中添加类似的行
<script src="/sjcl/sjcl.js"></script>
<script src="/sjcl/core/sha256.js"></script>

这种方式导入有效,我可以使用Chrome Inspector

进行检查

我尝试使用另一个库,不像sjcl那么复杂,而且工作正常。 所以,显然,我没有正确使用sjcl。 另一个库更简单,只是纯方法,sjcl使用类和东西,但由于我根本不了解JS,我无法弄清楚如何在不深入研究JS语法的情况下正确调用这些东西。我真的想跳过这部分。

任何人都可以查看sjcl代码并告诉我如何正确调用该方法?源代码非常小,我认为JS专业人员可以一目了然。

UPD 2: 事实证明,将以下代码添加到gwt.xml就足够了,只需将库放入/ war并注意路径中前面的“/”。如果你不把它放在那里,GWT将在模块目录中寻找你的lib          

UPD 3: 并且不要忘记清除浏览器的缓存或“未找到”错误不会消失

2 个答案:

答案 0 :(得分:2)

确保当您在全局上下文中讨论使用$wnd作为前缀的对象时,这意味着应用程序正在运行的主window实例。这在JSNI文档中有记录,见https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#writing

public static native String sha256(String ptext)
  /*-{
      return $wnd.sjcl.hash.sha256.hash(ptext);
  }-*/;

答案 1 :(得分:0)

“未定义sjcl”表示您未正确导入sjcl文件。 检查文件路径并确保浏览器可以访问该文件。