【问题标题】:Render page to string in Wicket 1.5在 Wicket 1.5 中将页面渲染为字符串
【发布时间】:2012-03-22 20:23:05
【问题描述】:

我正在努力将我们现有的 Wicket webapp 升级到 1.5,并且在我们用于渲染 HTML 电子邮件的 renderPage 函数中遇到了问题。

之前我们使用了 this StackOverflow questionthis (currently broken but maybe fixed later) link 中引用/列出的代码,但该代码不再有效,因为其中很多类在 1.5 中不存在。

我也找到了这个电子邮件线程,但它对细节很清楚,我不知道如何从我的 pageClass 和参数创建 WebPage。 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();
}

【问题讨论】:

    标签: java wicket wicket-1.5


    【解决方案1】:

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2016-10-01
      • 2016-03-23
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多