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

9
我正在将一个应用程序的所有页面转换为使用i18n/l10n进行本地化。我非常满意Wicket对此的支持,目前进展顺利。我遇到的唯一棘手问题如下:
我们有一个文本文件,用作发送电子邮件时的HTML模板,当用户在网站上执行某个操作时会使用它。当用户单击特定链接时,我手动读取此模板,进行一些文本替换,例如“亲爱的$USERNAME”,然后将结果作为HTML电子邮件发送给用户。
为了支持我们针对的10种语言左右,我要么必须维护10份此模板文件,要么找出一种方法来使用Wicket内置的i18n支持来渲染此“页面”,获取结果作为字符串,然后发送它。
因此,我的问题是:如何以编程方式“渲染”Wicket页面并将结果作为字符串获取?
如果可能,我更喜欢避免使用类似HttpClient的黑客技巧。 HttpClient没有用户的Locale和自动登录的功能等,所以这对我来说不是一个好的解决方案。

这是一个非常好的问题,我已经在寻找答案了。 - biziclop
3个回答

6

谢谢,我使用了您第一个链接的稍微修改过的版本:https://gist.github.com/1152059 - George Armhold
仅分享其他页面的链接有一个缺点,即目标页面可能在未来被删除。 - Markus

5
如果你只需要原始代码,这里是它:(这与文章中描述的解决方案几乎相同。)
//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() );

我无法让上述代码编译通过:“WebResponse是抽象的,ServletWebRequest缺少构造函数参数,未找到WebRequestCycle,RequestCycle没有请求方法”。这是哪个版本的Wicket? - Martin Wickman
@MartinWickman 1.4,因为它是去年八月份的最新版本。 - biziclop
啊,这就解释了。1.5 显然改变了很多,所以代码在那里不起作用。也许更新答案以反映这一点。 - Martin Wickman
1
当然,我会尝试一下,但是随着Wicket/Java等新版本的发布,我不能四处更新我的所有答案 :) - biziclop

5
对于较新的Wicket版本:6.7.0 版本带有一个名为 ComponentRenderer 的全新功能,可以精确地满足此要求!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接