Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Взаимодействие HTML и Servlets

49K
11 августа 2009 года
initmax
3 / / 24.07.2009
Решил разложить по полочкам все возможные варианты взаимодействия отображаемых данных "HTML" и логики, движка приложения "Servlet". Проанализировав которые выбрать самое оптимальное под определённую задачу.


Главная задача заключается в том, что бы обеспечить доступ 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.*;
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.*;
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? какие ещё есть варианты?
63
23 августа 2009 года
Zorkus
2.6K / / 04.11.2006
Чтобы прояснить:

Цитата:
4) JSP - Java Server Pages. Вы пишите файлы в формате HTML, и внедряете актуальный Java код внутрь HTML. Это похоже на использование JavaScript-а, только код выполняется на сервере и это настоящая Java.


Это совершенно не похоже на использования 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, что это похоже на использования яваскрипт и некоторым другим, ты не очень понимаешь как это все работает внутри. А это советую изучить.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог