5

現在、既存の Wicket Web アプリケーションを 1.5 にアップグレードする作業を行っていますが、HTML メールをレンダリングするために使用する renderPage 関数に問題が発生しました。

以前は、この StackOverflow の質問このリンク (現在は壊れていますが、後で修正される可能性があります) で参照/リストされているコードを使用していましたが、これらのクラスの多くが 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 + パラメータを渡す必要があったため、最終的に aを渡しました。

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();
}
4

1 に答える 1

4

http://www.wicket-library.com/wicket-examples/mailtemplate/サンプルのソース コードを確認してください。

于 2012-03-23T13:38:34.767 に答える