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 的新引用。但是好像不太一样。
现在我有这些问题:
- WicketApplication 不是唯一的,因此可用于这种操作吗?
- 我需要参加这个课程吗?
- 我什至可以将 Applcation 解析为 WebApplication 吗?因为我在控制台中有这个错误
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 团队并且似乎是规范的
顺便说一句,我会根据用户/会话了解访问/执行操作的想法存在类似的想法:WebSession
在 MySession
中覆盖
我认为你做错了(在多个层面上)。
首先:如果要记录日志,请使用日志记录框架。例如。 LogBack, preferably accessed through SLF4J
其次:如果你不想使用日志框架,创建一个日志服务(一个专用的对象,而不是Wicket Application),使用Dependency Injection将日志服务注入到你需要它的所有组件中。 Wicket 同时支持 Spring and Guice
第三:按照已接受的答案的建议静态访问 WebApplication
听起来像是一个非常糟糕的主意(但公平地说,这显然是由 Wicket 建议的)。
我想 "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 的新引用。但是好像不太一样。
现在我有这些问题:
- WicketApplication 不是唯一的,因此可用于这种操作吗?
- 我需要参加这个课程吗?
- 我什至可以将 Applcation 解析为 WebApplication 吗?因为我在控制台中有这个错误
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 团队并且似乎是规范的
顺便说一句,我会根据用户/会话了解访问/执行操作的想法存在类似的想法:WebSession
在 MySession
我认为你做错了(在多个层面上)。
首先:如果要记录日志,请使用日志记录框架。例如。 LogBack, preferably accessed through SLF4J
其次:如果你不想使用日志框架,创建一个日志服务(一个专用的对象,而不是Wicket Application),使用Dependency Injection将日志服务注入到你需要它的所有组件中。 Wicket 同时支持 Spring and Guice
第三:按照已接受的答案的建议静态访问 WebApplication
听起来像是一个非常糟糕的主意(但公平地说,这显然是由 Wicket 建议的)。