Я работаю над обновлением нашего существующего веб-приложения Wicket до версии 1.5 и столкнулись с проблемой в нашей функции renderPage, которую мы используем для рендеринга наших электронных писем в формате HTML.
Ранее мы использовали код, указанный/перечисленный в этом вопросе StackOverflowи этой (в настоящее время неработающей, но, возможно, исправленной позже) ссылке, но этот код больше не работает, поскольку многие из этих классов не существует в 1.5.
Я также нашел эту ветку электронной почты, но в ней мало деталей, и я не знаю, как создать веб-страницу из моего класса страницы и параметров. http://apache-wicket.1842946.n4.nabble.com/Render-WebPage-to-String-in-Wicket-1-5-td3622130.html
Вот мой код:
// Renders a page under a temporary request cycle in order to get the rendered markup
public static String renderPage(Class extends Page> pageClass, PageParameters pageParameters)
{
//get the servlet context
WebApplication application = (WebApplication) WebApplication.get();
ServletContext context = application.getServletContext();
//fake a request/response cycle
MockHttpSession servletSession = new MockHttpSession(context);
servletSession.setTemporary(true);
MockHttpServletRequest servletRequest = new MockHttpServletRequest(application, servletSession, context);
MockHttpServletResponse servletResponse = new MockHttpServletResponse(servletRequest);
//initialize request and response
servletRequest.initialize();
servletResponse.initialize();
WebRequest webRequest = new ServletWebRequest(servletRequest);
BufferedWebResponse webResponse = new BufferedWebResponse(servletResponse);
webResponse.setAjax(true);
WebRequestCycle requestCycle = new WebRequestCycle(application, webRequest, webResponse);
requestCycle.setRequestTarget(new BookmarkablePageRequestTarget(pageClass, pageParameters));
try
{
requestCycle.getProcessor().respond(requestCycle);
if (requestCycle.wasHandled() == false)
{
requestCycle.setRequestTarget(new WebErrorCodeResponseTarget(HttpServletResponse.SC_NOT_FOUND));
}
}
finally
{
requestCycle.detach();
requestCycle.getResponse().close();
}
return webResponse.toString();
}
В частности , код прерывается, поскольку классы WebRequestCycle и BookmarkablePageRequestTarget больше не существуют. Я чувствую, что должен каким-то образом использовать класс StringResponse
, но мне не хватает ссылки, которая помогла бы мне запустить рендеринг этого ответа.
Будем признательны за любую помощь. Спасибо.
Используя пример, к которому я был направлен ответом ниже, я получил следующий код. Я также вставляю его сюда, чтобы, если эта ссылка исчезнет или изменится в будущей версии Wicket, люди из будущего все равно смогут получить нужный им ответ.
В итоге я передал PageProvider
, потому что в некоторых случаях мне нужно было передать экземпляр Page
, а в других — pageClass + параметры.
public static String renderPage(final PageProvider pageProvider)
{
final RenderPageRequestHandler handler = new RenderPageRequestHandler(pageProvider, RedirectPolicy.NEVER_REDIRECT);
final PageRenderer pageRenderer = Application.get().getPageRendererProvider().get(handler);
RequestCycle requestCycle = RequestCycle.get();
final Response oldResponse = requestCycle.getResponse();
BufferedWebResponse tempResponse = new BufferedWebResponse(null);
try
{
requestCycle.setResponse(tempResponse);
pageRenderer.respond(requestCycle);
}
finally
{
requestCycle.setResponse(oldResponse);
}
return tempResponse.getText().toString();
}