|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Http://localhost:8082/FirstProject/index.jsp
Сервлет будет вызван из JSP-страницы по URL-имени MyServlettest, Рис. 17.1. Вывод сервлета после вызова метода doGet() Первая JSP Java Server Pages (JSP) обеспечивает разделение динамической и статической частей страницы, результатом чего является возможность изменения дизайна страницы, не затрагивая динамическое содержание. Это свойство используется при разработке и поддержке страниц, так как дизайнерам нет необходимости знать, как работать с динамическими данными. Процессы, выполняемые с файлом JSP при первом вызове: d) Браузер делает запрос к странице JSP. e) JSP-engine анализирует содержание файла JSP. b) JSP-engine создает временный сервлет с кодом, основанным на исходном тексте файла JSP, при этом контейнер транслирует операторы Java в метод _jspService(). Если нет ошибок компиляции, то этот метод вызывается для непосредственной обработки запроса. Полученный сервлет ответствен за исполнение статических элементов JSP, определенных во время разработки в дополнение к созданию динамических элементов. c) Полученный код компилируется в файл *.class. d) Вызываются методы init() и _jspService(), и сервлет логически исполняется. b) Сервлет на основе JSP установлен. Комбинация статического HTML Последующие обращения к файлу JSP просто вызовут метод _jspService() сервлета. Сервлет используется до тех пор, пока сервер не будет остановлен и сервлет не будет выгружен вручную либо пока не будет изменен файл JSP. Результат работы JSP можно легко представить, зная правила трансляции JSP в сервлет, в частности в его _jspService() -метод. Рис. 17.2. Рабочий цикл JSP Если рассмотреть преобразование в сервлет простейшей JSP, отправляющей <!--пример # 2: простейшая страница JSP: simple.jsp --> <html><head> <title>Simple</title> </head> <body> <jsp:text>Hello, Bender</jsp:text> </body></html> то в результате запуска в браузер будет выведено: Рис. 17.3. Вывод после вызова index.jsp А код сервлета будет получен следующий: // пример # 3: сгенерированный сервлет: simple_jsp.java package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*;
public final class simple_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent{ private static java.util.List _jspx_dependants;
public Object getDependants() { return _jspx_dependants; } public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null; PageContext pageContext = null; HttpSession session = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; PageContext _jspx_page_context = null; try { _jspxFactory = JspFactory. getDefaultFactory (); response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;
out.write("<html><head>\r\n"); out.write("<title>Simple</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n"); out.write("Hello, Bender\r\n"); out.write("</body></html>"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out!= null && out.getBufferSize()!= 0) out.clearBuffer(); if (_jspx_page_context!= null) _jspx_page_context.handlePageException(t); } } finally { if (_jspxFactory!= null) _jspxFactory.releasePageContext(_jspx_page_context); } } } JSP-код заключается в специальные теги, которые указывают контейнеру, чтобы он использовал этот код для генерации сервлета или его части. Таким образом поддерживается документ, который одновременно содержит и статическую страницу, и теги Java, которые управляют этой страницей. Статические части HTML-страниц посылаются в виде строк в метод write(). Динамические части включаются прямо в код сервлета. С этого момента страница ведет себя как обычная HTML-страница с ассоциированным сервлетом. Взаимодействие сервлета и JSP Страницы JSP и сервлеты никогда не используются в информационных системах друг без друга. Причиной являются принципиально различные роли, которые играют данные компоненты в приложении. Страница JSP ответственна за формирование пользовательского интерфейса и отображение информации, переданной с сервера. Сервлет выполняет роль контроллера запросов и ответов, то есть принимает запросы от всех связанных с ним JSP-страниц, вызывает соответствующую бизнес-логику для их (запросов) обработки и в зависимости от результата выполнения решает, какую JSP поставить этому результату в соответствие. Ниже приведен пример вызова сервлета из JSP с последующим вызовом другой JSP. <!--пример # 4: страница JSP с вызовом сервлета: index.jsp --> <%@ page language="java" contentType="text/html; charset=ISO-8859-5" pageEncoding="ISO-8859-5"%> <html><body> <jsp:useBean id="gc" class="java.util.GregorianCalendar"/> <jsp:getProperty name="gc" property="time"/> <FORM action="serv" method="POST"> <INPUT type="submit" value="Вызвать сервлет"> </FORM> </body></html> В результате запуска проекта в браузер будет выведено: Рис. 17.4. Запуск index.jsp Кодировка для символов кириллицы задана с помощью директивы page. Аction-теги useBean и getProperty используются для создания объекта класса GregorianCalendar в области видимости JSP и вывода его значения. Сервлет ContServlet вызывается методом POST. // пример # 5: простой контроллер: СontServlet.java package chapt17; import java.io.IOException; import java.util.Calendar; import java.util.Locale; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class ContServlet extends javax.servlet.http.HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //добавление атрибута к запросу request.setAttribute("loc", Locale. getDefault ()); //добавление атрибута к сессии request.getSession().setAttribute("calend", Calendar. getInstance ()); //получение объекта RequestDispatcher и вызов JSP request.getRequestDispatcher("/main.jsp").forward(request, response); } } Передачу информации между JSP и сервлетом можно осуществлять, в частности, с помощью добавления атрибутов к объектам HttpServletRequest, HttpSession, HttpServletContext. Вызов main.jsp из сервлета <!--пример # 6: страница, вызванная сервлетом: main.jsp --> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html><body> <h3>Региональные установки и Время</h3> <c:out value="Locale from request: ${loc}"/><br> <c:out value="Time from Servlet: ${calend.time}"/> </body></html> После вызова сервлета и последующего вызова main.jsp будет выведено: Рис. 17.5. Вывод информации страницей main.jsp В данном коде директива taglib подключает JSP Standard Tag Library (JSTL), и становится возможным вызов тега <c:out>, а также использование Expression Language (EL) в виде ${loc}. Конфигурационный файл web.xml для данной задачи должен содержать следующую информацию: <servlet> <display-name>Controller</display-name> <servlet-name>controller</servlet-name> <servlet-class> chapt17.ContServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>controller</servlet-name> <url-pattern> /serv </url-pattern> </servlet-mapping> В этой главе была дана общая информация о взаимодействии различных компонентов Web-приложения. Задания к главе 17 Вариант А Создать сервлет и взаимодействующие с ним пакеты Java-классов и JSP-страницы, способные выполнить следующие действия: 8. Подсчет суммы случайным образом выбранных элементов массива. 9. Вывести полное название страны и языка. 10. Подсчитать время между выполнением сервлета и JSP в наносекундах. 11. Создать массив дат и вывести самую позднюю дату. 12. Задать температуру. Если она меньше нуля, вывести значение температуры синим цветом, если больше, то красным. 13. Создать приложение, выводящее фамилию разработчика, дату и время получения задания, а также дату и время его выполнения. Вариант B Задания варианта В главы 1 выполнить на основе сервлетов. Число n генерировать с помощью методов класса java.util.Random. Тестовые задания к главе 17 Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.017 сек.) |