Java 正确使用动态Wicket资源
我正在尝试创建一个基于wicket的简单应用程序。我想在我的页面上放置一个面板,指示用户是否登录。 遗憾的是,我找不到解决我问题的有效示例:如果有人登录,我希望我的标签显示用户名,如果没有用户登录,则显示一些消息。 我想我错过了什么 下面是代码: 专家组:Java 正确使用动态Wicket资源,java,wicket,Java,Wicket,我正在尝试创建一个基于wicket的简单应用程序。我想在我的页面上放置一个面板,指示用户是否登录。 遗憾的是,我找不到解决我问题的有效示例:如果有人登录,我希望我的标签显示用户名,如果没有用户登录,则显示一些消息。 我想我错过了什么 下面是代码: 专家组: public class Header extends Panel { IModel<StringResourceModel> userNameModel = new LoadableDetachableModel<Str
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));
}
}
标记:
<wicket:panel>
<wicket:label class="username" wicket:id="username" />
</wicket:panel>
呈现的文本是
StringResourceModel[键:username.noUser,默认值:null,参数:[]
这种行为是有道理的。但是如何修复它以呈现所需的文本?您应该从load方法返回字符串:
请注意对StringResourceModelgetObject的调用。我深入研究了,并选择了以下方法:
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();
}
}
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();
}
}
};
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();
}
}