2015-09-23 3 views
0

Я хотел сделать небольшой «журнал» того, что делает пользователь. У меня разные панели, и все они имеют функции Ajax, такие как «onclick», «onevent» и «onchange». Я планировал определить Application ArrayList of Strings для регистрации всех вещей.

я написал следующее в WicketApplication.javaWicket: Определить переменную Application wide

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 ----- поле, которое вызывает проблему

Есть ли другой способ создать широкую переменную Application?

ответ

2

Обычный способ использования (статический) метод. Его типичный, не бойтесь.

MyApllication m = MyApllication.get(); 

Таким образом, в каждом калибровочном объекте совершенно естественно. Обычно «статически переопределяется», чтобы возвращать правильный тип (и может давать дополнительный контроль).

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

или

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

Когда этот статический метод возвращает правильный тип, Ваша проблема будет решена.

Анализ, как построить AuthenticatedWebApplication над WebApplication (или WebApplication над Application), его из команды калиткой и кажется канонической

КСТАТИ Я вас будет идея доступа/выполнять действия, зависящие от пользователя/сессии подобная идея существует: WebSession override in MySession

+0

Спасибо, WebSession было решением. Эта [ссылка] (https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=76385) помогла. –

3

Я думаю, что вы делаете это неправильно (на нескольких уровнях).

Во-первых: если вы хотите войти в систему, используйте фреймворк регистрации. Например. LogBack, предпочтительно получить доступ через SLF4J

Во-вторых: если вы не хотите использовать структуру журнала, создать службу журнала (выделенный объект, а не калитка Application), использовать Dependency Injection внедрить услугу журнала во всех компонентах где вам это нужно.Калитка Поддерживает Spring и Guice

Третье: Статический доступ к WebApplication как предложено принятой ответ звучит как очень плохая идея (но это, по-видимому предложил калиткой, чтобы быть справедливым).

+0

Благодарим вас за ввод. Я знаю, что это не окончательное решение. Я намеревался сначала сделать что-то простое, чтобы посмотреть, как это работает. Я переключусь на _Log4J_ –

+0

Я выбрал SLF4J из-за ошибки импорта, которую я получаю с Log4J, не знаю почему, но SLF4J работает так же хорошо. Спасибо. –

+0

1. с помощью первого контакта Wicket + инъекция имеет точную точку зрения (это была моя проблема - вы пишете хорошо): инъекции работают в COMPONENT, я задавался вопросом, почему (не так просто) в модели 2. Реализация статического метода (в рамках) основанный в текущем контексте потока, может быть, не так уж плохо? Это не «школьный» статический доступ. Но я не так хакер, я хочу что-то услышать –

Смежные вопросы