我想从控制器获取已处理JSP的HTML内容。我正在使用Tiles实现视图。我怎样才能从HTML中作为字符串从HTTPServletResponse对象在春季?
我的方案,我想生成JSP中的HTML并将其作为JSONP。
所以我需要从控制器中获得生成的HTML。
我想从控制器获取已处理JSP的HTML内容。我正在使用Tiles实现视图。我怎样才能从HTML中作为字符串从HTTPServletResponse对象在春季?
我的方案,我想生成JSP中的HTML并将其作为JSONP。
所以我需要从控制器中获得生成的HTML。
你需要用注释@ResponseBody您的控制器方法。请看文档了解更多信息
控制流离开的DispatcherServlet和JSP页面模板之前移动到Servlet容器(例如Tomcat)的填充。因此,Spring MVC将永远无法查看从JSP模板生成的最终HTML。
如果你想管你最终的HTML输出到JSONP请求,你要做的必须实现的是在你的Servlet容器的过滤器,这可能会或可能不支持这种行为。
http://stackoverflow.com/questions/9104321/get-contents-of-processed-jsp-into-spring-controller-without-using-httpclient数据 字符串含量= //提取conten,看这的方法,我想有一种方法,但我想知道我们如何从响应对象中提取html。 – geek
该链接中描述的方法不起作用。 view.render()只是简单地将RenderDispatcher指向目标.jsp,并创建一个合并的输出模型(变量映射),并将其交给JSP引擎。一旦view.render()完成,JSP尚未执行,并且最终的HTML输出尚未生成。此时没有什么可以从HttpServletResponse中提取。直到DispatcherServlet完全执行完毕,才会发生这种情况,Spring不再是控制流的一部分。 –
好的,谢谢你的信息!我必须找出一些其他的方法..我猜想内部使用httpclient,并抓住结果是在这一点上的最佳途径。 – geek
你在这里!
这个工作非常适合我:
@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中并发送到前端。 – geek
我想你误解了这个问题。我看起来像这样.. ViewResolver viewResoler = //注入 View view = viewReslover.resolveViewName(String viewName,Locale locale); HttpServletResponse的xresponse = //定义响应,缓冲剂数据 view.render(地图模型,请求HttpServletRequest的,HttpServletResponse的xresponse);从xresponse – geek