簡體   English   中英

如何使用 Spring Boot 2(Spring 5 + Tomcat 9)將 JSP 渲染捕獲到字符串中?

[英]How do you capture a JSP rendering into a String using Spring Boot 2 (Spring 5 + Tomcat 9)?

我已經實現了 SwallowingHttpServletResponse 示例,該示例可在線上的各種示例中找到。 It has worked for me in the past when I was using Spring 4 and Tomcat 7, but now that I have migrated to using Spring Boot 2 (which uses Spring 5 and embedded Tomcat 9) capturing the JSP rendering doesn't seem to work anymore . 有人知道如何讓 SwallowingHttpServletResponse 示例與 Spring Boot 2 (Spring 5 + Tomcat 9) web 應用程序一起使用嗎?

適用於 Spring 4 + Tomcat 7 的代碼示例:

我面臨着類似的問題。 升級到 Spring 5 和 Tomcat 8.5 后,我的內部 jsp 渲染方法停止工作。 原來我沒有在模擬請求中定義請求方法(如 GET)。 這可能是過去默認的? 沒有花太多時間研究它...

無論如何,這是代碼:

服務:

@Service
public class JspService implements ServletContextAware {

    private InternalResourceViewResolver viewResolver;

    @Autowired
    public void setViewResolver(InternalResourceViewResolver viewResolver) {
        this.viewResolver = viewResolver;
    }

    private ServletContext context;

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.context = servletContext;
    }

    public String renderJspView(String viewName, ModelMap modelMap) throws Exception {

        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/WEB-INF/jsp/" + viewName + ".jsp");
        View view = viewResolver.resolveViewName(viewName, Locale.US);

        MockHttpServletResponse mockResp = new MockHttpServletResponse();
        HttpServletRequest mockRequest = new MockHttpServletRequest();
        JspRequestWrapper requestWrapper = new JspRequestWrapper(mockRequest, requestDispatcher);
        mockResp.flushBuffer(); // important! forces servlet include

        view.render(modelMap, requestWrapper, mockResp);

        return mockResp.getContentAsString();
    }
}

請求包裝器

public class JspRequestWrapper extends HttpServletRequestWrapper {

    private final RequestDispatcher requestDispatcher;

    public JspRequestWrapper(HttpServletRequest request, RequestDispatcher requestDispatcher) throws IOException {
        super(request);
        this.requestDispatcher = requestDispatcher;
    }


    @Override
    public RequestDispatcher getRequestDispatcher(String path) {
        return requestDispatcher;
    }

    // Hardcode contextPath and URI so links work
    @Override
    public String getContextPath() {
        return "https://foo.bar.com/<webapp name>";
    }

    @Override
    public String getRequestURI() {
        return "foo.bar.com";
    }

    // Define request method!
    @Override
    public String getMethod() {
        return "GET";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM