АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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, пересылаются браузеру через выходной поток объекта ответа ServletResponse.

Последующие обращения к файлу 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 из сервлета
в данном случае производится методом forward() интерфейса RequestDispatcher.

<!--пример # 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


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.024 сек.)