当前位置: 首页 > 知识库问答 >
问题:

如何使用Spring Boot 2(Spring 5 Tomcat 9)将JSP渲染捕获到String中?

徐奇
2023-03-14

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

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

  • https://technologicaloddity.com/2011/10/04/render-and-capture-the-output-of-a-jsp-as-a-string/
  • https://www.javatips.net/api/CaptureJSP-master/src/main/java/com/technologicaloddity/capturejsp/util/SwallowingJspRenderer.java

共有1个答案

罗翰
2023-03-14

我也面临着类似的问题。升级到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";
    }
}
 类似资料:
  • 问题内容: 我有这样的代码,可以在没有定义路线的情况下渲染玉器模板。可以把它想成express.static,但是它用URL调用res.render。 问题在于res.render()不会引发错误。而是呈现错误页面。有没有办法检测丢失的模板或任何渲染错误? 问题答案: 一个更好的方法是使用render的callback ,而不是需要另一个回调,而是:

  • 问题内容: 有没有一种方法可以将html渲染为PNG图片?我知道画布是可能的,但我想呈现例如div之类的标准html元素。 问题答案: 我知道这是一个很老的问题,已经有了很多答案,但是我仍然花了几个小时来尝试做自己想做的事情: 给定一个html文件,从命令行生成具有 透明 背景的(png)图像 使用无头的Chrome(此响应的版本为74.0.3729.157),实际上很容易: 命令说明: 您可以从

  • 在此处输入图像描述我正在使用use效果挂钩来使用获取api,但它不起作用。当只有一个api时,它可以正常工作,但当我使用另一个api使用createData函数中的use效果挂钩获取数据时,它会出错。 我做了一些研究,我认为这是因为react中的组件重新渲染引起的一些问题,我试图搜索修复,但没有找到它,所以我发布它,如果有任何问题,请在评论中问我,我会给出更多的细节。

  • 我想使用P3D渲染器用PGraphics实例渲染基本的3D形状,而不使用任何别名/平滑,但是noslooth()似乎不起作用。 我记得在一个纹理上调用。 处理过程中的等价物是什么?

  • 问题内容: 渲染模板后如何运行方法?我要设置和之后,我需要使用JQuery进行更改(例如,在模板内容的DOM中)。正在“之前”渲染工作(模板的DOM尚不可用)。谢谢。 问题答案: 创建在链接函数中运行代码的指令。构建模板后,将调用链接功能。 请参阅ng-click以获取想法。

  • 我无法呈现一个selectOneMenu,但只能禁用该项目 例如,这是可行的: 而这个不是: 有什么建议吗 谢谢