【问题标题】:Wicket: Define Application wide variableWicket:定义应用程序范围的变量
【发布时间】:2015-09-23 06:36:17
【问题描述】:

我想对用户正在做的事情做一点“日志”。我有不同的面板,所有这些都具有 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

还有其他方法可以创建应用程序范围的变量吗?

【问题讨论】:

    标签: java session wicket


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的意见。我知道这不是最终的解决方案。我打算先做一些简单的工作,看看它是如何工作的。我将切换到 Log4J
    • 我选择了 SLF4J,因为我在使用 Log4J 时遇到了导入错误,不知道为什么,但 SLF4J 的效果同样好。谢谢。
    • 1.通过第一次接触 Wicket+injecting 必须准确理解(这是我的问题 - 你写得好):注入在 COMPONENT 中工作,我想知道为什么在模型 2 中(不那么容易)。静态方法实现(在框架中)基于当前线程上下文,也许不是那么糟糕?这不是“学校”静态访问。但我不是那么黑客,渴望听到一些东西
    • @JacekCz 不,我同意。框架设计者明确推荐了静态访问,所以我想这是要走的路。但我仍然认为它丑得要命:-)
    • 是的,这种访问方式在 Wicket 中似乎是惯用的。这可能是因为 Wicket 为访问这些类创建了一个受控环境。 (包括对单元测试的内置支持。)由于并发问题,我个人喜欢将其使用限制为非可变配置(Wicket 保证了很多事情的单线程性,但显然不适用于应用程序范围。)
    【解决方案2】:

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

    MyApllication m = MyApllication.get();
    

    在每个检票口对象中通常都很容易。 通常“静态覆盖”以返回正确的类型,(并且可以提供额外的控制)。

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

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

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

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

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

    【讨论】:

    • 谢谢,WebSession 是解决方案。这个link 帮助了。
    猜你喜欢
    • 1970-01-01
    • 2018-04-27
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    相关资源
    最近更新 更多