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

时间:2015-09-23 06:36:17

标签: java session wicket

我想对用户正在做的事情做一点“记录”。我有不同的面板,所有这些面板都有Ajax功能,如“onclick”,“onevent”和“onchange”。我计划的是定义一个应用程序范围的字符串列表来记录所有的东西。

我在 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的新引用。但似乎不一样。
现在我有这些问题:

  • WicketApplication不是唯一的,因此可以用于这种操作吗?
  • 我必须参加一个会议吗?
  • 我甚至可以将Applcation解析为WebApplication吗?因为我在控制台中有这个错误
  

wapp&lt; -----导致问题的字段

有没有其他方法可以创建Application wide变量?

2 个答案:

答案 0 :(得分:3)

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

首先:如果要记录,请使用Logging框架。例如。 LogBack,最好通过SLF4J

访问

其次:如果您不想使用日志框架,创建日志服务(专用对象,而不是Wicket应用程序),请使用依赖注入将日志服务注入您需要的所有组件。 Wicket支持SpringGuice

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

答案 1 :(得分:2)

正常使用方式是(静态)方法。它的典型,不要害怕。

MyApllication m = MyApllication.get();

因此在每个wicket对象中都很容易。 通常&#34;静态覆盖&#34;返回正确的类型,(并可以提供额外的控制)。

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

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

当此静态方法返回正确的类型时,您的问题已解决。

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

顺便说一句你有想法访问/执行操作取决于用户/会话类似的想法存在:WebSession覆盖MySession