내가 programmaticaly JSP 페이지를 렌더링하는 필요를 위해 다음과 같습니다 : 나는 JSP를 추천 할 것입니다.
결국 기능적 요구 사항은 무엇입니까? 당신은 분명히 잘못된 방향으로 해결책을 찾고 있습니다. 이것이 해결책이라고 생각하는 문제/요구 사항은 무엇입니까? 우리는 더 나은 제안을 내놓을 수 있습니다.
출력 예 : 출력이일까요? 그렇다면 java.net.URLConnection
면 충분합니다.
편집 : 당신은 당신의 질문 편집 :
나는 어떤 방법으로 컴파일 전에 소스 JSP를 변경하려면
(정확히 말하면 두 개의 JSP를 병합)를, 그래서 JSP 결과를 컴파일하는 방법이 필요합니다 JSP 컴파일러를 직접 사용하여 InputStream (또는 Reader)에서.
확인, 그건 비트 더 분명하다. 그러나 당신은 이것을 위해 무엇을 필요로합니까? JSP가 실제로 무엇을 나타 냅니까? 사용 된 최종 결과는 무엇입니까?
예를 들어 하나의 JSP를 다른 JSP에 포함하고 싶습니까? 예 : main.jsp
에 head.jsp
을 포함하고 있습니까? 그렇다면 <jsp:include>
이면 충분합니다. 아니면 재사용하고 싶었던 특정 코드로 원시 Java 코드를 포함하고 있습니까? 그렇다면 일반 Java 클래스를 사용하고 필요한 경우 taglib을 사용해야합니다.
편집 2 : 당신이 주석으로 :
하지만 지금 우리가 사용하는 모든 JSP 페이지에 대한 레이아웃 등 (저장소 방법으로 메모리에있는)이 JSP 페이지를 사용하는 방법이 필요합니다 합니다 (ServletContext#getRealPath()
여기에 구조에 올 수)
그냥 웹 애플리케이션의 웹 콘텐츠 내부의 디스크 파일 시스템에있는 JSP 파일을 저장할 요청하고 시험을 사용하여 두 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
가보다 효율적으로 내가 모든 자원을 캐시 할 수 있도록하기 위해보고에 File#exists()
의 사용을 만들 수 있습니다 특정 페이지가 이미 디스크에 저장되어 있는지 확인하십시오.
나는 유사한 문제가 있었는데, 내가 발견 한 "가장 쉬운"해결책은 전체 프로젝트를 Velocity (또는 다른 템플릿 엔진)로 전환하는 것이었고 그러한 작업은 사소한 작업이었습니다. 그런 변화를 만들기 위해 이미 너무 멀리 개발 된 것처럼 보이지만 단지 말하고있는 것 같습니다 ... – serg