【问题标题】:How can i get the HTML as string from HTTPServletResponse object In Spring?如何在 Spring 中从 HTTPServletResponse 对象获取 HTML 作为字符串?
【发布时间】:2013-08-24 07:30:47
【问题描述】:

我想从控制器获取已处理 JSP 的 HTML 内容。我正在为视图使用 Tiles 实现。

在我的场景中,我想从 jsp 生成 HTML 并将其作为 JSONP 发送。

所以我需要从控制器中获取生成的 html。

【问题讨论】:

    标签: java spring spring-mvc jsonp


    【解决方案1】:

    您需要使用@ResponseBody 注释您的控制器方法。详情请查看文档

    【讨论】:

    • 我猜你误解了这个问题。我正在寻找这样的东西.. ViewResolver viewResoler = // 注入 View view = viewReslover.resolveViewName(String viewName, Locale locale); HttpServletResponse xresponse = // 自定义响应,缓冲数据 view.render(Map model, HttpServletRequest request, HttpServletResponse xresponse); String content = // 从 xresponse 的数据中提取内容
    【解决方案2】:

    在填充 JSP 页面模板之前,控制流离开 DispatcherServlet 并移动到 Servlet 容器(例如 Tomcat)。所以 Spring MVC 永远无法看到从 JSP 模板生成的最终 HTML。

    如果您想将最终的 HTML 输出通过管道传输到 JSONP 请求中,则必须在 Servlet 容器中将其实现为过滤器,它可能支持也可能不支持该行为。

    【讨论】:

    • stackoverflow.com/questions/9104321/…, 看看这种方法,我想有一种方法,但我想知道我们如何从响应对象中提取 html。
    • 该链接中描述的方法不起作用。 view.render() 只是将 RenderDispatcher 定向到目标 .jsp,并创建一个合并的输出模型(变量映射)以传递给 JSP 引擎。一旦 view.render() 完成,JSP 还没有被执行,最终的 HTML 输出还没有生成。此时没有什么可以从 HttpServletResponse 中提取的。在 DispatcherServlet 完全执行完毕并且 Spring 不再是控制流的一部分之前,这种情况不会发生。
    • 好的,谢谢您的信息!我必须想出其他方法。我想在内部使用 httpclient 并获取结果是目前最好的方法。
    【解决方案3】:

    给你!

    这对我来说很完美:

    @Service
    public class CustomViewProcessor
    {
        private static Logger m_log = LoggerFactory.getLogger(CustomViewProcessor.class);
    
        @Autowired
        @Qualifier("tilesViewResolver")
        private ViewResolver viewResolver;
    
        @Autowired
        @Qualifier("commonInterceptor")
        CommonInterceptor commonInterceptor;
    
        public String renderView(HttpServletRequest request, Model model, String viewName)
        {
            ModelAndView mav = new ModelAndView();
            mav.addAllObjects(model.asMap());
            mav.setViewName(viewName);
            commonInterceptor.updateRequest(mav, request);
            try
            {
                View view = viewResolver.resolveViewName(mav.getViewName(), request.getLocale());
                HttpServletResponse localResponse = new MyHttpServletResponseWrapper(new MockHttpServletResponse());
    
                view.render(mav.getModel(), request, localResponse);
    
                return localResponse.toString();
            }
            catch (Exception e)
            {
                return "";
            }
        }
    
        public boolean doesViewExist(HttpServletRequest request, String viewName)
        {
            try
            {
                if (viewResolver.resolveViewName(viewName, request.getLocale()) != null)
                {
                    return true;
                }
            }
            catch (Exception e)
            {
                m_log.error(e.getMessage(), e);
            }
    
            return false;
        }
    
        static class MyHttpServletResponseWrapper extends HttpServletResponseWrapper
        {
            private StringWriter sw = new StringWriter();
    
            public MyHttpServletResponseWrapper(HttpServletResponse response)
            {
                super(response);
            }
    
            public PrintWriter getWriter() throws IOException
            {
                return new PrintWriter(sw);
            }
    
            public ServletOutputStream getOutputStream() throws IOException
            {
                throw new UnsupportedOperationException();
            }
    
            public String toString()
            {
                return sw.toString();
            }
        }
    }
    

    【讨论】:

    • 现在我可以将html包装在jsonp中并发送到前端。
    猜你喜欢
    • 2015-07-13
    • 1970-01-01
    • 2015-06-02
    • 2013-02-04
    • 1970-01-01
    • 2014-08-21
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多