Рендеринг страницы в строку в Wicket 1.5 - PullRequest
5 голосов
/ 23 марта 2012

Я работаю над обновлением нашего существующего веб-приложения Wicket до 1.5 и столкнулся с проблемой в нашей функции renderPage, которую мы используем для рендеринга наших электронных писем в формате HTML.

Ранее мы использовали код, указанный / перечисленный в этот вопрос StackOverflow и эта (в настоящее время не работает, но может быть исправлена ​​позже) ссылка , но этот код больше не работает, так как большинство этих классов не существует в 1.5.

Iтакже нашел эту ветку электронной почты, но она легка в деталях, и я не знаю, как создать веб-страницу из моего pageClass и параметров.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();
}

1 Ответ

4 голосов
/ 23 марта 2012

Проверьте исходный код http://www.wicket -library.com / wicket-examples / mailtemplate / example.

...