有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用SpringBoot2(Spring5+Tomcat9)将JSP呈现捕获到字符串中?

我已经实现了吞咽ttpServletResponse示例,该示例可以在各种在线示例中找到。在过去我使用Spring4和Tomcat7时,它对我很有效,但是现在我已经迁移到使用SpringBoot2(它使用Spring5和嵌入式Tomcat9)捕获JSP呈现似乎不再有效了。有人知道如何让SnowinghttpServletResponse示例与SpringBoot2(Spring5+Tomcat9)web应用程序一起工作吗

使用Spring 4+Tomcat 7的代码示例:


共 (1) 个答案

  1. # 1 楼答案

    我也面临着类似的问题。升级到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";
        }
    }