Ben programmaticaly JSP sayfanın sunulmasına gerek için şunlardır: Ben jsp öneriyoruz.
İşlevsel gereksinim nedir? Yanlış yöne doğru bir çözüm arıyorsun. Bu, çözümün bu olduğunu düşündüğünüz sorun/gereksinim nedir? Daha iyi öneriler bulabiliriz.
Örneğin sadece çıkışına sahip olmanız gerekiyor? Eğer öyleyse, java.net.URLConnection
yeterli olabilir.
Düzenleme: Sorunuzu düzenlendi:
Bir şekilde derleme önce kaynak JSP değiştirmek istiyorum
(kesin olmak için birlikte iki JSP birleştirme), bu yüzden JSP sonucu derlemek için bir yol gerekir Doğrudan JSP derleyicisini kullanarak InputStream (veya Reader) 'dan.
Tamam, bu bir bitlik daha açık. Ama buna ne gerek var? Bu JSP'ler gerçekte neyi temsil ediyor? Nihai sonuç ne için kullanılmalı?
Örneğin sadece bir JSP'yi diğerine eklemek ister misiniz? Örneğin. main.jsp
'da head.jsp
dahil olmak üzere? Eğer öyleyse, <jsp:include>
yeterli olabilir. Ya da daha kötüsü, yeniden kullanmak istediğiniz belirli bir kod ile ham Java kodu içerir mi? Eğer öyleyse, o zaman basit Java sınıfları kullanmalı ve bunun için gerekli ise taglibs.
Düzenleme 2: siz yorum olarak:
Ama şimdi bu kullanıcı tüm JSP sayfaları için düzenleri olarak (mağaza arada bellekte olduğunu vardır), bu JSP sayfalarını kullanmak için bir yol gerekir (ServletContext#getRealPath()
buraya kurtarma içine gelebilir)
Sadece web uygulamasının Webcontent içindeki disk dosya sistemi üzerinde JSP dosyaları depolamak isteyebilir ve sınav için kullanarak iki JSP dosyaları içeren kendi ana JSP dosyasında isteği iletmek ple:
<jsp:include page="${page1}" />
<jsp:include page="${page2}" />
Düzenleme 3: Ben onun çalışma kanıtlamak için bir SSCCE yarattı.
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 (veya kullandığınız ne olursa olsun ev sahibi/contextname) adresinden yürütün ve
We are in first jsp
We are in second jsp
daha verimli Her kaynak önbelleğe olacağını yapmak için bkz ve File#exists()
faydalanmak edeceğiz Belli bir sayfanın diskte kayıtlı olup olmadığını kontrol edin.
Benzer bir sorun yaşadım ve bulduğum "en kolay" çözüm, tüm projeyi bu tür görevlerin önemsiz olduğu Velocity (veya başka bir şablon motoru) olarak değiştirmekti. Bu tür değişiklikler yapmak için geliştirme konusunda çok uzaksınız gibi görünüyor, ama sadece ... – serg