我正在将应用转换为在其所有页面上使用i18n / l10n。我对Wicket对此的支持感到非常满意,到目前为止一切顺利。我遇到的一个棘手问题是:
我们有一个文本文件,用作HTML模板,以便在用户在网站上执行某项操作时发送电子邮件。当用户点击特定链接时,我会手动读取此模板,执行一些文本替换,例如"Dear $USERNAME"
,并将结果作为HTML电子邮件发送给用户。
为了支持我们定位的10种左右的语言,我要么必须维护这个模板文件的10个副本,要么想办法使用Wicket内置的i18n支持来呈现这个“页面”,将结果作为字符串抓取,然后发送。
因此我的问题:如何以编程方式“呈现”Wicket页面并将结果作为字符串获取?
如果可能的话,我宁愿避免像使用HttpClient这样的黑客攻击; HttpClient不会有用户的Locale,不会以用户等身份自动登录,所以这对我来说似乎不是一个好的解决方案。
答案 0 :(得分:6)
关于此的两篇文章:
Render a Wicket page to a string for HTML email
目前唯一的其他方法是使用WicketTester,但我不记得有关如何执行此操作的详细信息。
答案 1 :(得分: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() );
答案 2 :(得分:5)
对于较新的Wicket版本:6.7.0正好为此目的添加了新的ComponentRenderer!