我需要在我的面板上显示工作目录。
我用String value = System.getProperty("user.dir")
. 之后我将此字符串放在标签上,但我在控制台上收到此消息:
The method getProperty(String, String) in the type System is not applicable for the arguments (String).
我使用日食。
我猜你还没有经历过 GWT 101 - 你不能盲目地在客户端使用 JAVA CODE。
您可以从 JAVA 中找到 GWT 支持的类和方法的列表。 https://developers.google.com/web-toolkit/doc/latest/RefJreEmulation
对于 System,仅支持以下内容。
err, out,
System(),
arraycopy(Object, int, Object, int, int),
currentTimeMillis(),
gc(),
identityHashCode(Object),
setErr(PrintStream),
setOut(PrintStream)
在您的情况下,在您的服务器端代码中执行 System.getProperty("user.dir") 并使用 RPC 或任何其他服务器端 gwt 通信技术访问它。
不支持 System.getProperty("key"),但支持 System.getProperty("key", "default"),尽管它只会返回默认值,因为本身没有系统属性。
如果在 gwt 编译期间需要工作目录,则需要使用自定义链接器或生成器,在构建时获取系统属性,并将其作为公共资源文件发出。
对于链接器,您必须导出 gwt 可以下载的外部文件并获取所需的编译时数据。对于生成器,您只需将所需的字符串注入编译的源代码。
这是一个关于链接器的幻灯片,实际上非常有趣。
http://dl.google.com/googleio/2010/gwt-gwt-linkers.pdf
如果您不想使用链接器和额外的 http 请求,您也可以使用生成器,这可能更容易(而且更快):
interface BuildData {
String workingDirectory();
}
BuildData data = GWT.create(BuildData.class);
data.workingDirectory();
然后,您需要制作一个生成器:
public class BuildDataGenerator extends IncrementalGenerator {
@Override
public RebindResult generateIncrementally(TreeLogger logger,
GeneratorContext context, String typeName){
//generator boilerplate
PrintWriter printWriter = context.tryCreate(logger, "com.foo", "BuildDataImpl");
if (printWriter == null){
logger.log(Type.TRACE, "Already generated");
return new RebindResult(RebindMode.USE_PARTIAL_CACHED,"com.foo.BuildDataImpl");
}
SourceFileComposerFactory composer =
new SourceFileComposerFactory("com.foo", "BuildDataImpl");
//must implement interface we are generating to avoid class cast exception
composer.addImplementedInterface("com.foo.BuildData");
SourceWriter sw = composer.createSourceWriter(printWriter);
//write the generated class; the class definition is done for you
sw.println("public String workingDirectory(){");
sw.println("return \""+System.getProperty("user.dir")+"\";");
sw.println("}");
return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING
,"com.foo.BuildDataImpl");
}
}
最后,您需要告诉 gwt 在您的界面上使用您的生成器:
<generate-with class="dev.com.foo.BuildDataGenerator">
<when-type-assignable class="com.foo.BuildData" />
</generate-with>