Wicket:如何以编程方式呈现页面并将结果作为字符串?

我正在将应用程序转换为在其所有页面上使用i18n / l10n。 我对Wicket对此的支持感到非常满意,到目前为止一切顺利。 我遇到的一个棘手的部分是:

我们有一个文本文件,用作HTML模板,以便在用户在网站上执行某项操作时发送电子邮件。 当用户点击特定链接时,我手动读取此模板,执行一些文本替换,例如"Dear $USERNAME" ,并将结果作为HTML电子邮件发送给用户。

为了支持我们目标的10种左右的语言,我要么必须维护这个模板文件的10个副本,要么想办法使用Wicket的内置i18n支持渲染这个“页面”,抓住结果作为字符串,然后发送它。

因此我的问题是 :如何以编程方式“呈现”Wicket页面并将结果作为字符串?

如果可能的话,我宁愿避免像使用HttpClient这样的黑客攻击; HttpClient不会有用户的Locale,也不会自动以用户等身份登录,所以这对我来说似乎不是一个好的解决方案。

关于此的两篇文章:

将Wicket页面呈现为HTML电子邮件的字符串

将面板渲染为字符串

目前唯一的另一种方法是使用WicketTester ,但我不记得如何做到这一点的细节。

如果您只是想要原始代码,那么它是:(这几乎与本文中描述的解决方案相同。)

 //I assumed that you want to use the current user's session for rendering. If this isn't the case, you'll have to use a mock session MockHttpServletRequest mockReq = new MockHttpServletRequest( WebApplication.get(), ((WebRequest)getRequest()).getHttpServletRequest().getSession(), WebApplication.get().getServletContext() ); MockHttpServletResponse mockRes = new MockHttpServletResponse( mockReq ); WebResponse res = new WebResponse(mockRes); ServletWebRequest req = new ServletWebRequest( mockReq ); RequestCycle cycle = new WebRequestCycle( WebApplication.get(), req, res ); PageParameters pp = new PageParameters(); //add page parameters here //Your email page should really be a bookmarkable page, but if it isn't, you can replace the request target with something that better suits your case cycle.request( new BookmarkablePageRequestTarget( EmailPage.class, pp )); System.out.println( mockRes.getDocument() ); 

对于较新的Wicket版本: 6.7.0附带了一个新的ComponentRenderer,正是为了这个目的!