Wicket:定义应用程序范围的变量

Wicket: Define Application wide variable

我想 "log" 了解用户正在做什么。我有不同的面板,所有这些面板都具有 Ajax 功能,例如 "onclick"、"onevent" 和 "onchange"。我的计划是定义一个应用程序范围的字符串 ArrayList 来记录所有的东西。

我将以下内容写入 WicketApplication.java

public class WicketApplication extends WebApplication {

private List<String> log = new ArrayList<String>();

@Override
public Class<? extends WebPage> getHomePage() {
    //code
}

@Override
public void init() {
    //code
}

public List<String> getLog() {
    return log;
}

public void setLog(List<String> log) {
    this.log = log;
}}

然后在我的一个面板中:

public class Foo extends Panel{
private static final long serialVersionUID = 1L;
private WicketApplication wapp = (WicketApplication) Application.get();

public Foo(String id){
    super(id);
}

public void bar(){
    List<String> protocol = wapp.getLog();
    protocol.add(foo.getBarName() + " has been added to " + selectedKontakt.getObject().getName());
    wapp.setLog(protocol);
}
}

在下一个面板中,我尝试创建对 WicketApplication 的新引用。但是好像不太一样。
现在我有这些问题:

wapp <----- field that is causing the problem

是否有任何其他方法来创建应用程序范围的变量?

正常的使用方式是(静态)方法。很典型,别怕。

MyApllication m = MyApllication.get();

所以在每个检票口对象中通常都很容易。 通常 "statically overrided" 到 return 正确的类型,(并且可以提供额外的控制)。

public static MyApllication getMyApplication() {
        return (MyApllication) get();
    }

 public static MyApllication get() {
        return (MyApllication ) WebApplication.get();
    }

当这个静态方法 return 类型正确时,您的问题就解决了。

分析如何构建 AuthenticatedWebApplication 优于 WebApplication(或 WebApplication 优于 Application),它来自 Wicket 团队并且似乎是规范的

顺便说一句,我会根据用户/会话了解访问/执行操作的想法存在类似的想法:WebSessionMySession

中覆盖

我认为你做错了(在多个层面上)。

首先:如果要记录日志,请使用日志记录框架。例如。 LogBack, preferably accessed through SLF4J

其次:如果你不想使用日志框架,创建一个日志服务(一个专用的对象,而不是Wicket Application),使用Dependency Injection将日志服务注入到你需要它的所有组件中。 Wicket 同时支持 Spring and Guice

第三:按照已接受的答案的建议静态访问 WebApplication 听起来像是一个非常糟糕的主意(但公平地说,这显然是由 Wicket 建议的)。