JSP中<jsp:include>能否异步/在其他HTML渲染完成后执行
核心结论
<jsp:include> 是服务端执行的包含逻辑,会在服务端把所有引用的JSP内容拼接成完整HTML后才返回给浏览器,只要侧边栏JSP渲染耗时长,整个响应都会被阻塞,浏览器没法优先渲染Welcome文本。要实现主内容优先展示,有两种成熟实现方案。
方案1:前端异步加载侧边栏(推荐,稳定性最高)
思路是主页面首屏只输出核心主内容,侧边栏预留空容器占位,等主内容渲染完成后,再通过异步请求拉取侧边栏内容注入页面,完全不阻塞主内容展示。
- 改造后主页面代码:
<body class="nav-md"> <div class="container body"> <div class="main_container"> <!-- 侧边栏占位容器 --> <div id="sideNavWrap"></div> <!-- 主内容区靠前放置,优先输出渲染 --> <div class="right_col" role="main"> <div class="alert alert-success" style="margin-top: 60px;">Welcome</div> </div> <jsp:include page='_Footer_Note.jsp'></jsp:include> </div> </div> <script> // DOM解析完成(主内容已渲染)后加载侧边栏 document.addEventListener('DOMContentLoaded', () => { fetch('_Side_Navigation.jsp') .then(resp => resp.text()) .then(navHtml => { document.getElementById('sideNavWrap').innerHTML = navHtml; // 若侧边栏有交互初始化逻辑,在此处补充执行 }) .catch(err => console.error('侧边栏加载异常:', err)); }); </script> </body>
- 注意事项:
- 侧边栏依赖的CSS、JS文件需要提前在主页面引入,避免内容注入后样式错乱、交互失效
- 可以给侧边栏占位容器加固定高度和加载提示,减少布局跳动
方案2:服务端分块输出(无需写JS,兼容性一般)
思路是输出完主内容后,手动把已生成的响应内容推给浏览器,再继续渲染耗时较长的侧边栏,不需要改前端加载逻辑。
- 改造后代码:
<body class="nav-md"> <div class="container body"> <div class="main_container"> <div class="right_col" role="main"> <div class="alert alert-success" style="margin-top: 60px;">Welcome</div> </div> <% // 将已渲染内容立即推送给浏览器 response.flushBuffer(); %> <!-- 后续渲染侧边栏时,主内容已经可以在浏览器展示 --> <jsp:include page='_Side_Navigation.jsp'></jsp:include> <jsp:include page='_Footer_Note.jsp'></jsp:include> </div> </div> </body>
- 注意事项:该方案稳定性受服务端配置影响,如果服务端开启了Gzip压缩、或者经过反向代理层缓存,
flushBuffer()可能失效,无法实现分块推送。
内容的提问来源于stack exchange,提问作者lauwis
相关产品推荐
相关产品推荐

