如果服务器的部署文件夹是可写的,并且服务器被配置为热发布部署文件夹中的任何更改(默认情况下是 Tomcat),那么您可以让 servlet 在此处写入 JSP 文件并将请求转发到某个主 JSP 文件.
想象一下,你想动态地创建一个 main.jsp 包含以下内容:
<jsp:include page="${page1}" />
<jsp:include page="${page2}" />
如果${page1} 解析为page1.jsp,${page2} 解析为page2.jsp,那么这里是SSCCE:
package com.stackoverflow.q1719254;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
File root = new File(getServletContext().getRealPath("/"));
String main = "<jsp:include page=\"${page1}\" /><jsp:include page=\"${page2}\" />";
write(main, new File(root, "main.jsp"));
String page1 = "<p>We are in ${data1}";
write(page1, new File(root, "page1.jsp"));
request.setAttribute("page1", "page1.jsp");
request.setAttribute("data1", "first jsp");
String page2 = "<p>We are in ${data2}";
write(page2, new File(root, "page2.jsp"));
request.setAttribute("page2", "page2.jsp");
request.setAttribute("data2", "second jsp");
request.getRequestDispatcher("main.jsp").forward(request, response);
}
private static void write(String content, File file) throws IOException {
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"))) {
writer.write(content);
}
}
}
在 http://localhost:8080/playground/test(或您使用的任何主机/上下文名称)执行它,您会看到
We are in first jsp
We are in second jsp
为了提高效率,我会缓存所有资源并使用File#exists() 检查特定页面是否已保存在磁盘上。