我发现了类似的东西,但没有一个真正符合我的愿望。
我有一个 jsp 页面,其中的 java 代码需要 10-30 秒才能完成(我从数据库中获取一些内容并构建图表),我想在页面中间添加一个漂亮的加载图像并使其成功加载完成后逐渐消失。
这不是一个直接的解决方案。但是,使用
iframe
就可以达到你的要求。
我对单页 jsp 的尝试失败了,因为直到 JSP 内部的进程完成后才加载页面。
以下是我使用的解决方法:
- 创建处理显示部分的主JSP(假设index.jsp)页面
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Testing the loading</title>
<script type="text/javascript">
function processRecords(){
document.getElementById("mainContent").src = "process.jsp";
}
</script>
</head>
<body onload="processRecords()">
<iframe id="mainContent" width="100%" style="border: none" seamless src="loader.jsp"></iframe>
</body>
</html>
- 创建带有加载程序显示部分的JSP/HTML(假设loader.jsp)
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>Processing</title>
</head>
<body>
<img src="images/loader.gif" style="position:absolute; top:0; bottom:0; left:0; right:0; margin:auto;"/>
</body>
</html>
- 创建一个具有实际处理和结果显示的JSP(假设process.jsp)
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<title>Processing</title>
</head>
<body>
<%
//Following is a manual sleep simulating a process
try {
//Sleep for 10 seconds
Thread.sleep(10000);
} catch (InterruptedException ex) {
out.write("Error occurred while processing");
}
out.write("Done!");
%>
</body>
</html>
- 工作
当主 JSP 页面 (index.jsp) 加载时,它将使用指向加载器 JSP 页面 (loader.jsp) 的
iframe
src 进行加载。因此,最初将显示加载器 gif 图像。主 JSP 页面中的 onload
方法调用 JavaScript,而 JavaScript 又调用实际处理 JSP 页面 (process.jsp)。直到处理JSP页面返回结果时,iframe
中的加载器页面不会被模拟替换,从而在Java代码中模拟处理前的加载。