2015-07-02 4 views
0

Я пытаюсь создать простое приложение на основе калитки. Я хочу разместить панель на своей странице, которая указывает, вошел ли пользователь в систему. К сожалению, мне не удалось найти рабочий пример моей проблемы: я хочу, чтобы мой ярлык отображал имя пользователя, если кто-то вошел в систему, и какое-то сообщение, если ни один пользователь не вошел в систему. Наверное, я что-то упускаю.Использование динамических Wicket-ресурсов правильным способом

вот код:

панели:

public class Header extends Panel { 

IModel<StringResourceModel> userNameModel = new LoadableDetachableModel<StringResourceModel>() { 

    @Override 
    protected StringResourceModel load() { 
     final User user = MySession.get().getAuthenticatedUser(); 
     if (user==null){ 
      return new StringResourceModel("username.noUser", Header.this , null); 
     }else{ 
      return new StringResourceModel("username.user", Header.this, Model.of(user)); 
     } 
    } 
}; 

public Header(final String id) { 
    super(id); 
} 

@Override 
protected void onInitialize() { 
    super.onInitialize(); 
    add(new Label("username", userNameModel)); 

} 

} 

Свойства:

username.noUser=You are not logged in 
username.user=Welcome, ${name} 

Markup:

<wicket:panel> 
    <wicket:label class="username" wicket:id="username" /> 
</wicket:panel> 

Визуализированное текст

StringResourceModel [Ключ: username.noUser, по умолчанию: NULL, Титулы: []]

Поведение имеет смысл. Но как я могу исправить это, чтобы текст был рендерен?

ответ

0

Вы должны вернуть строку из метода #load():

IModel<String> userNameModel = new LoadableDetachableModel<String>() { 

    @Override 
    protected String load() { 
     final User user = MySession.get().getAuthenticatedUser(); 
     if (user==null){ 
      return new StringResourceModel("username.noUser", Header.this , null).getObject(); 
     }else{ 
      return new StringResourceModel("username.user", Header.this, Model.of(user)).getObject(); 
     } 
    } 
}; 

Обратите внимание на вызов StringResourceModel#getObject().

0

я имел более глубокий взгляд на wiki и выбрал следующий подход:

public class Header extends Panel { 

    private static class UserState { 
     private final String userLoggedIn; 
     private final User user; 


     public UserState(final User user) { 
      super(); 
      userLoggedIn = user==null?"noUser":"user"; 
      this.user = user; 
     } 
     public String getUserLoggedIn() { 
      return userLoggedIn; 
     } 
     public User getUser() { 
      return user; 
     } 

    } 

    IModel<UserState> userModel   = new LoadableDetachableModel<UserState>() { 

             @Override 
             protected UserState load() { 
              return new UserState(HouseSession.get() 
                .getAuthenticatedUser()); 
             } 
            }; 


    public Header(final String id) { 
     super(id); 
    } 

    @Override 
    protected void onInitialize() { 
     super.onInitialize(); 
     final StringResourceModel messageModel = new StringResourceModel("username.${userLoggedIn}", Header.this, userModel); 
     add(new Label("username", messageModel)); 
    } 

    @Override 
    protected void onDetach() { 
     super.onDetach(); 
     userModel.detach(); 
    } 

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