[英]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.