我想做异步分页,即浏览器对 Spring 控制器进行 Ajax 调用,该控制器将返回由分页控制数据(当前页面、总页数)和包含 html 内容的字段组成的 json。是否可以从 jsp 视图渲染 html 并将其作为字段之一放入 json 响应中?
是的,实际上,这是可以做到的,而且我已经这样做很多年了。 这有点棘手,但其想法是将渲染的响应吞入字符串缓冲区,然后将字符串缓冲区的内容放入 JSON 响应中。 不幸的是,我无法将完整的答案放在这里,因为它有很多代码。 您可以私信我获取代码,或者尝试按照以下指示自行解决。
在 Google 上搜索 Direct Web Remoting 项目中的“
SwallowingHttpServletResponse
”。 该类是 HttpServletResponse
的子类,并将呈现的 JSP 模板写入内部缓冲区,而不是写入 servlet 的正常输出流。
首先,您获取
RequestDispatcher
(HttpServletRequest.getRequestDispatcher()
) 的实例,并调用其 include()
方法,将其传递给 StringWriter 实例的 SwallowingHttpServletResponse
实例。 对 include()
的调用会调用 JspServlet
并让它呈现 JSP。 对 include()
的调用完成后,呈现的 JSP 内容将位于前面提到的 StringWriter 内部。 然后,您可以在 StringWriter 上调用 getBuffer().toString()
来获取生成的 HTML 并将其放入 JSON 结构中。
总共,您将需要 3 个类:
SwallowingHttpServletResponse
、WriterOutputStream
(它是 ServletOutputStream
的子类)和 InternalJSPRenderer
(它实现了 Spring 的 ServletContextAware
)。 后两个需要您自己编写,第一个需要替换其导入语句(将 javax.servlet
替换为 jakarta.servlet
)。
希望有帮助🙏