我需要programmaticaly渲染的JSP页面。
究竟是什么功能要求?你显然在找错方向的解决方案。它是什么,你认为这是解决方案的问题/要求?我们可能会提出更好的建议。
例如,您是否需要其输出?如果是这样,那么java.net.URLConnection
就足够了。
编辑:您编辑您的问题:
我想在编译之前修改源JSP以某种方式(合并两个JSP在一起,要准确),所以我需要一种方法来编译JSP结果从InputStream(或Reader)直接使用JSP Compiller。
OK,这是一个位更加清晰。但是,你需要这个吗?这些JSP实际上代表什么?应该使用的最终结果是什么?
例如,您是否想要在其他JSP中包含一个JSP?例如。包括一个head.jsp
在main.jsp
?如果是这样,那么<jsp:include>
就足够了。或者更糟糕的是,它们是否包含原始Java代码和一些您想要重用的特定代码?如果是这样,那么你应该使用普通的Java类,如果必要的话使用taglibs。
编辑2:当你说:
但现在我们需要一种方式来使用这些JSP页面(这是储存在内存中的方式)作为布局的所有JSP页面用户请
只存储web应用程序的web内容的内部磁盘文件系统上的JSP文件(ServletContext#getRealPath()
可能会进入救援在这里),并转发给自己的主JSP文件的请求使用的考试,其中包括两个JSP文件PLE:
<jsp:include page="${page1}" />
<jsp:include page="${page2}" />
编辑3:我创建了一个SSCCE证明其工作。
package mypackage;
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;
public class TestServlet extends HttpServlet {
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 {
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
writer.write(content);
} finally {
if (writer != null) try { writer.close(); } catch (IOException ignore) {}
}
}
}
在http://localhost:8080/playground/test(或者你使用任何主机/ CONTEXTNAME)执行它,你会看到
We are in first jsp
We are in second jsp
为了更高效的I能缓存一切资源和利用File#exists()
到检查特定页面是否已经保存在磁盘上。
我有一个类似的问题,我发现“最简单”的解决方案是将整个项目切换到Velocity(或其他模板引擎),在这些任务是微不足道的。看起来你在开发过程中已经太过于做出这样的改变,但只是说... – serg 2009-11-12 02:25:33