为扩展基页的页面呈现两次Wicket头标记
我正在将现有的web应用程序从Wicket 1.4移植到1.5。在应用程序中,有两个模板页面,它们是一个基本页面的子页面。这些模板名为secure和unsecure,它们为经过身份验证和未经身份验证的用户定义页面。应用程序中的任何页面都继承自这些模板。在Wicket 1.4中,该设置运行良好,没有任何问题 移植到Wicket 1.5后,我得到以下错误: 在[HtmlHeaderContainer]中找不到id为“PageTitle”的组件 “PageTitle”是一个Wicket标签,用于在基本页中动态构建页面标题,它位于基本页标记的为扩展基页的页面呈现两次Wicket头标记,wicket,wicket-1.5,page-layout,Wicket,Wicket 1.5,Page Layout,我正在将现有的web应用程序从Wicket 1.4移植到1.5。在应用程序中,有两个模板页面,它们是一个基本页面的子页面。这些模板名为secure和unsecure,它们为经过身份验证和未经身份验证的用户定义页面。应用程序中的任何页面都继承自这些模板。在Wicket 1.4中,该设置运行良好,没有任何问题 移植到Wicket 1.5后,我得到以下错误: 在[HtmlHeaderContainer]中找不到id为“PageTitle”的组件 “PageTitle”是一个Wicket标签,用于在基本
标记中。我发现,
标记被呈现了两次,因此我假设我得到了错误,因为Wicket创建了一次页面标题,然后又尝试再次创建它(
仅在基本页面标记中定义)
快速而肮脏的修复方法是将页面标题移动到模板(重复的代码)。有没有更好的办法来解决这个问题
希望我的描述足够清楚,但是,如果需要,我可以提供一个代码示例。标签应该在页面标记中只使用一次。这意味着,如果在基本页中有标记,则扩展该标记的任何页面都不应包含该标记。此外,任何组件都不应使用该标记
相反,请使用标记包含未包含在您的基本页中的任何其他内容。Wicket将使用标记动态地将内容注入到标记中,该标记被呈现并交付到浏览器。按要求确定以下是一个代码示例。BasePage.java:
public class BasePage extends WebPage
{
public BasePage()
{
this(new PageParameters());
}
public BasePage(PageParameters parameters)
{
add(new Label("PageTitle", "Gosh Wicket version migration is hard work"));
}
...
}
BasePage.html(doctype等,已删除):
}
LogIn.html:
<wicket:extend xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<h2 wicket:id="welcome">Welcome to the Application</h2>
<div style="margin: 20px 150px 20px 150px; text-align: center;">
<p wicket:id="loginHeader"></p>
<form wicket:id="loginform" id="loginform" >
<table style="display: table; border: 0px; margin: auto;" wicket:message="summary:loginTableSummary">
<tr style="display: table-row;">
<td class="login" colspan="2"><span wicket:id="feedback">Feedback</span></td>
</tr>
<tr style="display: table-row;">
<td class="login">
<label for="username"><wicket:message key="username">Username</wicket:message></label>
</td>
<td class="login">
<input wicket:id="username" id="username" type="text" name="user" value="" size="30" maxlength="50"/>
</td>
</tr>
<tr style="display: table-row;">
<td class="login">
<label for="password"><wicket:message key="password">Password</wicket:message></label>
</td>
<td class="login">
<input wicket:id="password" id="password" type="password" name="pswd" value="" size="30" maxlength="16"/>
</td>
</tr>
<tr style="display: table-row;">
<td class="login"> </td>
<td class="login"><input class="btn" type="submit" name="Login" value="Login" wicket:message="title:loginButtonTitle"/></td>
</tr>
</table>
</form>
</div>
</wicket:extend>
欢迎参加申请
反馈
用户名
密码
您能显示一些代码吗?我们使用相同的技术,它工作得非常完美。请看下面的代码……顺便问一下,您使用的是哪个版本的Wicket?好的,谢谢,我认为我们正在这样做(除此之外,我需要回顾一下……如果可以避免,我认为最好避免通过java代码向头部添加内容)最终,它都是通过wicket中的java代码添加的,因为java正在逐步解析html文件,并呈现将返回到浏览器的响应。对于和标记,它们生成一个HtmlHeaderResolver()组件,该组件管理将内容合并到一起以呈现给一个标记。
public class UnSecureTemplate extends BasePage
{
public UnSecurePageTemplate()
{
super(new PageParameters());
}
public UnSecureTemplate(PageParameters parameters)
{
super(parameters);
Label footerText = new Label("footerText", footerComesFromAPropertiesFile);
add(footerText);
//Instance variables here defined in BasePage
// Header bar links - left
Link<Object> hdrHome = addLink("hdrHome", HomePage.class);//this method is in BasePage in case you're wondering
hdrHome.add(new Image("mgrLogo", new ContextRelativeResource(poLogoUrl)));
// Header bar links - Right
ExternalLink hdrCorporate = new ExternalLink("hdrCorporate", anExternnalLink);
hdrCorporate.add(new Image("operatorLogo", new ContextRelativeResource(opLogoUrl)));
add(hdrCorporate);
}
<wicket:extend xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<body id="body" onload="preloadImages(); return true;">
<div class="centerbody">
<a name="top"></a>
<div id="mast">
<a wicket:id="hdrHome" title="home page">
<img wicket:id="mgrLogo" id="mgr-logo" src="images/logoShort.png" width="171" height="45" wicket:message="alt:remon.logoAltText" />
</a>
<a wicket:id="hdrCorporate" title="Web Site">
<img wicket:id="operatorLogo" id="po-logo" src="images/logoNoStrapline.png" height="45" wicket:message="alt:remon.logoAltText" />
</a>
</div>
<div id="mainmenubar" style="width: 100%">
<div class="menubaritem" style="width: 171px;">
<a href="#"> </a>
</div>
<div class="menubaritem" style="width: auto; border-right: none;">
<a href="#"> </a>
</div>
</div>
<div id="mainpanel">
<div id="leftnav">
<p> </p>
</div>
<div id="rightpanel">
<wicket:child/>
</div> <!-- right panel -->
</div> <!-- main panel -->
<div id="footer" style="height:15px;">
<span><a href="#top" style="text-decoration: none;" title="Back to Top"><span wicket:id="footerText">Footer Text</span></a></span>
</div>
<div id="footerspacer">
</div>
</div> <!-- centre body -->
</body>
</wicket:extend>
}
public class Login extends UnSecureTemplate
{
public Login()
{
this(new PageParameters());
}
public Login(PageParameters pageParameters)
{
super(pageParameters);
String welcomeResourceString = stringObtainedFromPropertiesFile;
add(new Label("welcome", welcomeResourceString));
add(new Label("loginHeader", thisAlsoComesFromPropertiesFile);
LoginForm form = new LoginForm("loginform", new SimpleUser(), pageParameters);
form.add(new FeedbackPanel("feedback"));
add(form);
}
...
<wicket:extend xmlns="http://www.w3.org/1999/xhtml" lang="en"
xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<h2 wicket:id="welcome">Welcome to the Application</h2>
<div style="margin: 20px 150px 20px 150px; text-align: center;">
<p wicket:id="loginHeader"></p>
<form wicket:id="loginform" id="loginform" >
<table style="display: table; border: 0px; margin: auto;" wicket:message="summary:loginTableSummary">
<tr style="display: table-row;">
<td class="login" colspan="2"><span wicket:id="feedback">Feedback</span></td>
</tr>
<tr style="display: table-row;">
<td class="login">
<label for="username"><wicket:message key="username">Username</wicket:message></label>
</td>
<td class="login">
<input wicket:id="username" id="username" type="text" name="user" value="" size="30" maxlength="50"/>
</td>
</tr>
<tr style="display: table-row;">
<td class="login">
<label for="password"><wicket:message key="password">Password</wicket:message></label>
</td>
<td class="login">
<input wicket:id="password" id="password" type="password" name="pswd" value="" size="30" maxlength="16"/>
</td>
</tr>
<tr style="display: table-row;">
<td class="login"> </td>
<td class="login"><input class="btn" type="submit" name="Login" value="Login" wicket:message="title:loginButtonTitle"/></td>
</tr>
</table>
</form>
</div>
</wicket:extend>