Java 正确使用动态Wicket资源

Java 正确使用动态Wicket资源,java,wicket,Java,Wicket,我正在尝试创建一个基于wicket的简单应用程序。我想在我的页面上放置一个面板,指示用户是否登录。 遗憾的是,我找不到解决我问题的有效示例:如果有人登录,我希望我的标签显示用户名,如果没有用户登录,则显示一些消息。 我想我错过了什么 下面是代码: 专家组: public class Header extends Panel { IModel<StringResourceModel> userNameModel = new LoadableDetachableModel<Str

我正在尝试创建一个基于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));

}

}
标记:

<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();
    }

}