使用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(标签),但这也不起作用。
对于我失踪的内容有任何想法吗?
答案 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);