Статьи

Механизм событий для Wicket Framework

Система событий, о которой я расскажу здесь, основана на механизме обработки событий, используемом в библиотеке Buoy Swing ( http://buoy.sourceforge.net ). Это отличная библиотека для разработки приложений Swing. Я изменил код обработки событий библиотеки буя, чтобы обеспечить поддержку обобщенных элементов и интеграцию калитки.

В Java нет механизма, соответствующего событиям и делегатам в C #. Вместо них мы должны использовать интерфейсы и анонимные классы, чтобы получать информацию о событиях компонентов; однако это приводит к увеличению количества классов и затрудняет чтение исходного кода. Эта новая система событий упрощает обработку событий, что подразумевает четкое разделение между компонентами и их клиентами.

Я разработаю страницу входа в качестве примера, чтобы объяснить концепцию. Эта страница содержит многократно используемый компонент под названием «LoginComponent». Задача этого компонента — проверить, правильно ли пользователь вводит правильное имя пользователя и пароль. После проверки пользовательского ввода повторно используемый компонент будет отправлять события, указывающие состояние входа в систему. Если пользователь входит в систему успешно, поле «успех» события устанавливается на «истина», в противном случае оно устанавливается на «ложь». «LoginPage», включая «LoginComponent», получает события входа и действует соответственно. Если войти не удается, отображается сообщение об ошибке; в противном случае он перенаправляет пользователя на другую страницу.

Я перечисляю код ниже. 

LoginPage.html

<html><head>
<title> Login page </title>
</head>
<body>
<table>
<tr>
<td>
<div wicket:id="feedbackPanel">
</div>
</td>
</tr>

<tr>
<td>
<div wicket:id="loginPanel">
</div>
</td>
</tr>
</table>

</body>

</html>

LoginPage.java

public class LoginPage extends EasyPage {

public LoginPage() {
add(new FeedbackPanel("feedbackPanel"));

LoginComponent loginComponent = new LoginComponent("loginPanel");
add(loginComponent);


loginComponent.addEventLink(LoginEvent.class, this, "onLogin");
}

@SuppressWarnings("unused")
private void onLogin(LoginEvent event) {
if ( event.isSuccess() ) {
// redirect to another page
info("Login successful");
}else {
error("Login failed");
}
}
}

Список кодов для «LoginComponent» ниже;

LoginComponent.html

<wicket:panel>
<form wicket:id="form">
<table>
<tr>
<td> User name </td>
<td> <input type="text" wicket:id="txtUsername"> </td>
</tr>

<tr>
<td> Password </td>
<td> <input type="password"" wicket:id="txtPassword"> </td>
</tr>

<tr>
<td> </td>
<td> <button type="submit" wicket:id="btnLogin"> Login </button> </td>
</tr>

</table>
</form>

</wicket:panel>

LoginComponent.java

public class LoginComponent extends EasyPanel {

@EasyWicket(id="form")
Form<Void> form;

@EasyWicket(id="form.txtUsername", value="username", required=true)
TextField<String>txtUsername;

@EasyWicket(id="form.txtPassword", value="password", required=true)
PasswordTextField txtPassword;

@EasyWicket(id="form.btnLogin", action="actionLogin")
Button btnLogin;

String username, password;

private static Logger logger = LoggerFactory.getLogger(LoginComponent.class);

public LoginComponent(String id) {
super(id);

}

public void actionLogin() {
if ( logger.isInfoEnabled() ) {
logger.info("username=" + username + " password=" + password);
}


LoginEvent event = new LoginEvent(this);
event.setSuccess(System.currentTimeMillis() % 2 == 0);
dispatchEvent(event);
}

}

Наконец, исходный код «LoginEvent»

LoginEvent.java

public class LoginEvent extends WicketEvent {

private boolean success;


public LoginEvent(Component source) {
super(source);
}

public void setSuccess(boolean success) {
this.success = success;
}

public boolean isSuccess() {
return success;
}
}

Для получения событий прослушиватель событий должен быть зарегистрирован как «LoginPage.java»

loginComponent.addEventLink(LoginEvent.class, this, "onLogin");

Этот фрагмент кода говорит: «this» зарегистрирован как слушатель «LoginEvent», и метод «onLogin» должен быть вызван при запуске «LoginEvent».
Для поддержки этого типа поведения «LoginComponent» должен использовать диспетчер событий, как показано в следующем коде:

из JavaComponent.java

LoginEvent event = new LoginEvent(this);
event.setSuccess(System.currentTimeMillis() % 2 == 0);

dispatchEvent(event);

Этот код создает событие входа в систему, устанавливает поле «success» в соответствии с результатом входа в систему и отправляет событие слушателям события.
Как видно из исходного кода, элементы пользовательского интерфейса снабжены аннотацией «@EasyWicket». Эта аннотация взята из библиотеки EasyWicket, о которой я говорил в предыдущей статье . Я также включил код обработки событий в библиотеку EasyWicket . Вы можете получить коды здесь .