使用继承时Wicket 7链接/标签错误

时间:2015-08-29 03:05:39

标签: wicket

使用Wicket 7,我正在开发一个使用基页作为其他页面扩展模板的应用程序。

在基页上,我希望标签和链接根据用户是否经过身份验证而更改。

这是我的BasePage.html:

char* reverseWords(char *s) {
    char** words = NULL;
    int word_count = 0;

    /*Create an array of all the words that appear in the string*/
    const char *delim = " ";
    char *token;
    token = strtok(s, delim);
    while(token != NULL){
        word_count++;
        words = realloc(words, word_count * sizeof(char*));
        if(words == NULL){
            printf("malloc failed\n");
            exit(0);
        }
        words[word_count - 1] = strdup(token);   
        token = strtok(NULL, delim);
    }

    /*Traverse the list backwards and check the words*/
    int count = word_count;
    char *return_string = malloc(strlen(s) + 1);
    if(return_string == NULL){
        printf("malloc failed\n");
        exit(0);
    }
    int offset = 0;
    while(count > 0){
        memcpy((char*)return_string + offset, words[count - 1], strlen(words[count - 1]));
        free(words[count - 1]);
        offset += strlen(words[count - 1]);
        if(count != 1){
            return_string[offset] = ' ';
            offset++;
        }
        else {
            return_string[offset] = '\0';
        }
        count--;
    }
    printf("%s\n",return_string);
    free(words);
    return return_string;
}

int main(){
    char *string = malloc(1000);
    if(string == NULL){
        printf("malloc failed\n");
        exit(0);
    }
    fgets(string, 1000, stdin);
    string[strlen(string)] = '\0';
    reverseWords(string);
    return 0;
}

和BasePage.java:

<div wicket:id="chromeMenu">foo</div>
    <div>
        <h2 wicket:id="userGreeting"></h2>
        <h2><a href="#" wicket:id="loginLink"><span wicket:id="loginLabel"></span></a> </h2>
    </div>
<wicket:child/>

HomePage扩展了BasePage。

HomePage.html

public BasePage() {
    super();

    add(new ChromeDropDownMenu("chromeMenu", buildMenu()));

    add(new Label("pageTitle", new StringResourceModel("page.title", this, null)));

    if(BasicAuthenticatedSession.get().isSignedIn()) {
        // Do stuff here
    } else {
        add(new Label("userGreeting", "Hello Visitor"));
        add(new Link("loginLink") {
            @Override
            public void onClick() {
                setResponsePage(LoginPage.class);
            }
        });
        add(new Label("loginLabel","Test"));
    }
}

HomePage.java

<wicket:extend/>

HomePage是Wicket应用程序返回的类。

当我尝试加载HomePage时,出现以下错误:

public class HomePage extends BasePage {
    private static final long serialVersionUID = 1L;

    public HomePage() {
        super();

        setPageTitle(new StringResourceModel("page.title", this, new Model<Serializable>("Admin")));

        add(new Label("version", getApplication().getFrameworkSettings().getVersion()));

    }
}

它指向BasePage.html中的&lt; a&gt;&lt; span /&gt;&lt; / a&gt; 结构作为问题的根源。

我已经尝试了几种方法来解决这个问题,但没有成功。我想也许可能需要添加(链接).add(标签),但这也不起作用。

对于我失踪的内容有任何想法吗?

2 个答案:

答案 0 :(得分:2)

错误消息说明了一切。

  

最后一个原因:找不到ID为&id; loginLabel&#39;的组件在[链接   [Component id = loginLink]]       预期:&#39; loginLink:loginLabel&#39;。       找到了类似名称:&#39; loginLabel&#39;

Wicket期望您在Java代码中使用与HTML中编写的相同的组件层次结构。在BasePage.html中,您有:

<h2><a href="#" wicket:id="loginLink"><span wicket:id="loginLabel"></span></a> </h2>

在BasePage.java代码中,您需要将loginLabel添加为loginLink组件的子代。

    Link loginLink = new Link("loginLink") {
        @Override
        public void onClick() {
            setResponsePage(LoginPage.class);
        }
    };
    add(loginLink);
    loginLink.add(new Label("loginLabel", "Test"));

答案 1 :(得分:1)

问题出在

if(tips==true)

链接应该是标签的父级:

add(new Link("loginLink") {
        @Override
        public void onClick() {
            setResponsePage(LoginPage.class);
        }
    });
    add(new Label("loginLabel","Test"));

几个额外的笔记:

  • 如果link = new Link("loginLink") { @Override public void onClick() { setResponsePage(LoginPage.class); } }; link.add(new Label("loginLabel","Test")); add(link);
  • 中唯一需要setResponsePage(),请更好地使用BookmarkablePageLink
  • 使用AbstractLink #setBody(IModel标签)代替Link + Label