如何在Spring MVC中刷新HTML?

egdjgwm8  于 2022-12-17  发布在  Spring
关注(0)|答案(3)|浏览(150)

在PHP中,可以刷新HTML,这主要是在HTML文件的头之后完成的,如以下示例所示:

<html>
<head>
  <title>Flush Example Page</title>
  <link rel="styles.css" href="my.css" />
  <script src="script.js"></script>
</head>
<?php ob_flush(); ?>
<?php flush(); ?>
<body>...

如何使用SpringMVC来实现这一点呢?如果由于某种原因,这种实践不是最佳的,请务必详细说明。

ymdaylpp

ymdaylpp1#

我绝不会在SpringMVC视图中显式地使用flush,让我解释一下原因。
flush背后的想法是浏览器将更快地获得javascript/css资源的链接,而且由于它可以并行解析这些链接,因此理论上有可能使网站加载速度更快。
较早的Spring MVC应用程序通常会将数据加载到控制器内部的模型中。因此,除了写入输出流之外,视图中没有IO,然后在头部之后刷新没有实际效果。如果您有一个现代的单页面应用程序,在加载包含JavaScript/Css链接的第一个页面时,通常没有IO或IO非常少,实际数据通过REST服务加载为JSON。所以也不需要冲水。
在PHP中使用flush的原因是,它经常混合渲染和数据库IO,这样flush就有意义了。
在Tomcat上,输出缓冲区的大小默认为8 K,如果您可以用头文件填充它,并且一些主体没有任何(重要的)IO,那么就不需要刷新。
如果你看看浏览器开发者工具的时间表,从初始页面请求到资源开始加载,有一段很长的空闲时间,你可能有一些东西可以通过刷新来优化,但这可能是我最后会做的优化(在资源绑定、http缓存等之后)在Angular中(2)您甚至可以预先呈现初始页面,因为大型应用程序的初始化需要时间(刷新也是一个静音点)。

xqk2d5yq

xqk2d5yq2#

观察事物如何运作

对于HTTP响应,您有状态行、头部和主体(让我们忽略尾部,因为浏览器通常不允许您使用这些内容做任何有用的事情)。
在MVC的快乐之路中,您收集所有数据,在响应中设置任何您想要的头,然后您用作视图的模板将用作响应主体。
在错误路径中,会抛出一个异常,该异常重写默认状态代码并更改将使用的视图(通常是其他模板)。
因此,在错误路径中,主模板中的刷新是不相关的,因为它不会被使用,而在快乐路径中,大部分时间都花在收集数据上,因此花在写出模板上的短暂时间在很大程度上是不相关的。

基本策略

如果你想在收集数据之前发送HTML头,你有两个选择,但是这些方法的问题是它们干扰了(比如破坏)Spring的正常错误处理:
1.在控制器中为响应编写一些HTML,然后收集数据,最后在视图模板中呈现其余部分。

response.setContentType("text/html;charset=UTF-8"); // Needed as Spring won't have set this yet.
response.getWriter().write(htmlStartIncludingHead);
response.getWriter().flush();
Model model = collectDataAndbuildModel();
return "myViewWithoutHead";

1.将收集数据的任务(直接或间接、同步或异步)移到模板内部完成,以使刷新有用。如果在等待检索一定量的数据之前进行刷新,则用户可以在等待时接收已完成的内容。
在JSP中,可以使用<% out.flush(); %><% response.getWriter().flush(); %>进行刷新。
在FreeMarker中,它有一个专用的刷新指令:<#flush> .

走向工作解决方案

为了试验一个解决方案,该解决方案尝试了各种方法来解决错误处理,同时将数据收集移动到运行模板时发生的位置,我做了一个概念证明,其中Controller中的Model的值被更改为Callables和/或Futures:
https://github.com/scrhartley/freemarker-streaming-poc
用于错误处理的技巧可归结为:
1.输出 meta刷新标记以在发生错误时执行客户端重定向
1.输出一个script标记,以便在发生错误时执行某些JavaScript页面操作

  • 使用与try/catch等效的模板级别,允许您在发生错误时输出一些回退内容。
  • JSP有一个errorPage机制,但不清楚它是否适合与flushing一起使用:

https://www.tutorialspoint.com/jsp/jsp_exception_handling.htmhttps://www.digitalocean.com/community/tutorials/jsp-exception-handling-jsp-error-page

  • FreeMarker具有attempt/recover指令。尝试 Gulp 会刷新其中的内容,因此需要相应地使用。
olmpazwi

olmpazwi3#

我甚至不知道从何开始。)
您的PHP示例混合了模型、视图和控制器,在SpringMVC中它们是独立的。
实际的呈现发生在视图中,通常是JSP或Thymeleaf模板。模型包含视图的数据,并由控制器配置,控制器还决定应该向用户显示哪个视图。
如果您只使用过PHP,并且对Spring还是个新手,那么您的学习曲线会很长。也许您应该从Spring boot web tutorial之类的教程开始,然后阅读一些关于MVC模式的内容。稍后再提出一些更具体的问题

相关问题