Взаимодействие HTML и Servlets
Главная задача заключается в том, что бы обеспечить доступ HTML разработчикам (людям) к использованию их любимых примочек для редактирования HTML и без необходимости изучать Java, А программистов java лишить надобности импорта готовых HTML в приложения. Другими словами Максимально организовать MVC.
Возможные варианты взаимодействия данных и кода
1) Поместить HTML внутрь вывода значений вашего сервлета методами doGet() или doPost().
2) Использование тега <SERVLET> внутри HTML-файла (и заодно переименуйте его в .shtml). HTML дизайнеры могут создавать странички, а сервлет может выводить маленькие порции текста, это позволяет получить "совмещение" веб страницы с сервером.
3) Представительские шаблоны. Хороший путь для помещения общих навигационных элементов (кнопки, кредиты и т.д.) на всех страничках. Эта технология встроена в Java Web Server и др. движки.
4) JSP - Java Server Pages. Вы пишите файлы в формате HTML, и внедряете актуальный Java код внутрь HTML. Это похоже на использование JavaScript-а, только код выполняется на сервере и это настоящая Java.
Судя по всему 4й вариант ялвляется самым приемлемым но помещать в JSP логику работы приложения не является приемлемым с позиции MVC.
Исходя из этого созрел следующий план. В JSP хранить только HTML а организацию всей логики сохранить в Servlet, при работе же самого приложения организовать перенаправление с Servlet в JSP.
Два примера:
1) Изначальный "импорт HTML в сам сервлет"
import javax.servlet.http.*;
import java.io.*;
public class indexsrv extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
RequestDispatcher dispatcher = null;
String param = request.getParameter("page");
if (param == null)
{
//set the MIME type of the response, "text/html"
response.setContentType("text/html");
//use a PrintWriter send text data to the client who has requested the
// servlet
java.io.PrintWriter out = response.getWriter();
out.println("<HTML><HEAD><TITLE>"); //вывод html-кода
out.println("</TITLE></HEAD><BODY>"); //вывод html-кода
out.println("Main page");//вывод html-кода
out.println("</BODY></HTML>"); //вывод html-кода
out.close();
}
if (param.equals("p0"))
{
//set the MIME type of the response, "text/html"
response.setContentType("text/html");
//use a PrintWriter send text data to the client who has requested the
// servlet
java.io.PrintWriter out = response.getWriter();
out.println("<HTML><HEAD><TITLE>"); //вывод html-кода
out.println("</TITLE></HEAD><BODY>"); //вывод html-кода
out.println("<P>Page 0");//вывод html-кода
out.println("</BODY></HTML>"); //вывод html-кода
out.close();
}
if (param.equals("p1"))
{
//set the MIME type of the response, "text/html"
response.setContentType("text/html");
//use a PrintWriter send text data to the client who has requested the
// servlet
java.io.PrintWriter out = response.getWriter();
out.println("<HTML><HEAD><TITLE>"); //вывод html-кода
out.println("</TITLE></HEAD><BODY>"); //вывод html-кода
out.println("<P>Page 1");//вывод html-кода
out.println("</BODY></HTML>"); //вывод html-кода
out.close();
}
//...........................................................................................
else
//set the MIME type of the response, "text/html"
response.setContentType("text/html; charset=cp1251");
//use a PrintWriter send text data to the client who has requested the
// servlet
java.io.PrintWriter out = response.getWriter();
out.println("Запрашиваемая Вами страница не обнаружена");//вывод html-кода
out.close();
}
}
2) Перенаправление из Servlet в JSP
import javax.servlet.http.*;
import java.io.*;
public class ServToJsp extends HttpServlet {
private String param;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
param = request.getParameter("page");
if (param == null)
{
RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/main.jsp");
dispatcher.include(request, response);
}
if (param.equals("p0"))
{
RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/p0.jsp");
dispatcher.include(request, response);
}
//.............................................................................................
Как видно второй вариант в большей степени реализует MVC, производя перенаправление запроса из логического блока в блок данных. Возникают следующие вопросы
1) Не сильно ли падает производительность при перенаправлении из сервлета в jsp, по сравнению с включением кода HTML непосредственно в Servlet
2) Правильно ли организовано перенаправление из Servlet в JSP? какие ещё есть варианты?
Это совершенно не похоже на использования JavaScript.
JSP-страница внутри - это и есть сервлет. Когда ты деплоишь JSP-страницу под сервлет-контейнер, она компилируется там специальным компилятором и превращается в обычный сервлет, Java-class, который использует обычный интерфейс Writer для вывода строк текста в поток.
Сравнивать по этому производительность JSP и Servlets - некорректно. JSP страница компилируется в сервлет в общем случае, один раз, при деплойменте приложения, и потом уже этот сервлет обслуживает запросы пользователей.
Импорт HTML в сервлет - это неправильный термин. HTML код генерируется в коде метода класса сервлета и выводится в HttpServletResponse.outputStream. Сервлет-контейнер совместно с веб-сервером берет на себя связывание этого объекта HttpResponse с данными, которые отсылаются в браузер.
Идея использовать JSP для только лишь отображения, а сервлеты для управления логикой - рациональна и совершенно правильна, и сейчас реализована в популярных фреймворках, типа Apache Struts.
Твой код корректен, только он слишком, слишком низкоуровневый. В том смысле, что сейчас такой код не пишется веб-разработчиками.
Посмотри http://struts.apache.org/, и так же Apache Tiles.
А так же посмотри на JSF и прочие компонентные архитектуры.
У меня вопрос - по каким источникам ты изучал Servlets-JSP?
Просто судя по твоим фразам о JSP, что это похоже на использования яваскрипт и некоторым другим, ты не очень понимаешь как это все работает внутри. А это советую изучить.