Автор работы: Пользователь скрыл имя, 27 Февраля 2014 в 15:52, реферат
Технология JavaServer Pages (JSP) позволяет легко создавать web содержимое, которое имеет как статические, так и динамические компоненты.
JSP технология воплощает все динамические возможности технологии Java Servlet, но обеспечивает более естественный способ создания статического содержимого. Главные особенности JSP технологии:
Язык разработки JSP страниц, которые являются текстовыми документами и описывают, как обработать запрос и построить ответ.
Структурные компоненты для доступа к серверным объектам.
Механизмы для определения расширений языка JSP.
Если контейнеру необходимо удалить этот сервлет JSP страницы, он вызывает метод jspDestroy.
Вы можете контролировать различные параметры выполнения JSP страницы. Директивы, которые относятся к буферизации выхода и ошибкам обработки, обсуждаются здесь. Другие директивы рассматриваются в контексте специфических задач на протяжении всей главы.
Буферизация
Когда выполняется JSP страница, выход, записанный в объект response, автоматически буферизуется. Вы можете настраивать размер буфера следующей директивой:
<%@ page buffer="none|xxxkb" %>
Буфер большего размера позволяет записать больше содержимого прежде, чем что-то будет реально отправлено обратно клиенту. Таким образом JSP странице выделяется больше времени для установки соответствующих кодов состояния и заголовков или переадресации к другим web ресурсам. Маленький буфер сокращает загрузку памяти сервера и позволяет клиенту начать получение данных быстрее.
Ошибки обработки
Любое количество исключений может возникать в процессе выполнения JSP страницы. Для определения того, что web контейнер должен передать управление странице ошибок (error page), если встречается исключение, поместите следующую директиву в начало вашей JSP page:
<%@ page errorPage="file_name" %>
Страница приложения Duke's Bookstore initdestroy.jsp содержит директиву
<%@ page errorPage="errorpage.jsp"%>
В начале страницы errorpage.jsp указано, что она используется как страница ошибок. Для этого служит директива:
<%@ page isErrorPage="true|false" %>
Эта директива
делает объекты исключений (типа javax.servlet.jsp.
Замечание
Вы также можете определить страницу ошибок для WAR, который содержит JSP страницу. Если страница ошибок определена и для WAR и для JSP page, ошибка JSP страницы принимает приоритет.
Вы можете переделать процесс инициализации, чтобы позволить JSP странице читать постоянные данные конфигурации, инициализировать ресурсы и выполнить любые другие разовые действия путем перегрузки метода jspInit интерфейса JspPage. Вы освобождаете ресурсы, используя метод jspDestroy. Методы, определяемые с использованием JSP деклараций, обсуждаются в разделе Declarations.
Страница примера bookstore initdestroy.jsp определяет метод jspInit, чтобы найти или создать компонент JavaBeans database.BookDB, который представляет базу данных bookstore:
private BookDB bookDB;
public void jspInit() {
bookDB =
(BookDB)getServletContext(). getAttribute("bookDB");
if (bookDB == null) {
try {
bookDB = new BookDB();
getServletContext().
"bookDB", bookDB);
} catch (Exception ex) {
System.out.println(ex.
}
}
}
И метод jspDestroy, чтобы удалить компонент JavaBeans и освободить переменную BookDB.
public void jspDestroy() {
try {
bookDB.remove();
} catch (Exception ex) {
System.out.println(ex.
}
getServletContext().
bookDB = null;
}
Дальше следует ввод в действие бина database. Этот бин имеет две переменных: текущую книгу и ссылку на enterprise beandatabase. Ссылка создана с применением технологии, описанной в Getting Started.
public class BookDB {
String bookId = "0";
private BookDBEJB database = null;
public BookDB () throws Exception {
try {
InitialContext ic = new InitialContext();
Object objRef = ic.lookup(
"java:comp/env/ejb/BookDBEJB")
BookDBEJBHome home =
(BookDBEJBHome)
narrow(objRef, database.BookDBEJBHome.class);
database = home.create();
} catch (RemoteException ex) {
throw new Exception(
"Couldn't create database bean.");
} catch (CreateException ex) {
throw new Exception(
"Couldn't create database bean.");
} catch (NamingException ex) {
throw new Exception("Unable to lookup home: "+
"java:comp/env/ejb/BookDBEJB."
}
public void remove () throws Exception {
try {
database.remove();
database = null;
} catch (RemoteException ex) {
throw new Exception(
"Error while removing database bean.");
} catch (EJBException ex) {
throw new Exception(
"Error while removing database bean.");
} catch (RemoveException ex) {
throw new Exception(
"Error while removing database bean.");
}
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
...
}
Так как database bean разделяется между всеми JSP страницами (совместно используется ими), он должен быть инициализирован, когда стартует приложение, вместо того чтобы инициализироваться в каждой JSP странице. Java Servlet технология обеспечивает события цикла жизни приложения и классы listener для этих целей. В качестве упражнения вы можете перенести код, который управляет бином, в context listener class. Смотрите Handling Servlet Life Cycle Events о context listener, который инициализирует версию Java Servlet приложения bookstore.
Вы создаете статическое содержимое JSP страницы, просто написав ее так, как будто она состоит только из этого содержимого. Статическое содержимое может быть представлено в любом текстовом формате, таком как HTML, WML или XML. Форматом по умолчанию является HTML. Если вы хотите использовать другой формат, вы включаете в начало вашей JSP страницы page директиву с атрибутом contentType, устанавливающим тип формата. Например, если вы хотите, чтобы страница содержала данные, представленные в wireless markup language (WML), вы должны включить следующую директиву:
<%@ page contentType="text/vnd.wap.wml"
Реестр имен типа содержимого хранится в IANA (Агентство по выделению имен и уникальных параметров протоколов интернет) на:
ftp://ftp.isi.edu/in-notes/
Вы создаете динамическое содержимое подключением Java объектов из скриптовых элементов.
Вы можете из JSP page получить доступ к разнообразным объектам, включая enterprise beans и JavaBeans компоненты. JSP технология автоматически делает такие объекты доступными, и вы можете также создать и получить доступ к объектам, специфическим для приложения.
Неявные объекты
Неявные объекты создаются web контейнером и содержат информацию, связанную с отдельными запросами, страницами или приложениями. Многие из этих объектов определяются Java Servlet технологией, на которой основана JSP технология, и которая подробно обсуждается в Java Servlet Technology. Следующая таблица перечисляет эти неявные объекты.
Переменная |
Класс |
Пояснение |
application |
javax.servlet. |
Контекст для сервлета JSP страницы и любого web компонента, содержащегося в том же самом приложении. Смотрите Accessing the Web Context. |
config |
javax.servlet. |
Информация об инициализации сервлета JSP страницы. |
exception |
java.lang. |
Доступно только из страницы ошибок (error page). Смотрите Handling Errors. |
out |
javax.servlet. |
Выходной поток. |
page |
java.lang. |
Экземпляр сервлета JSP страницы, обрабатывающий текущий запрос. Обычно не используется авторами JSP страниц. |
pageContext |
javax.servlet. |
Контекст JSP страницы. Содержит единственный API для управления различными контекстными атрибутами, описанными в Sharing Information. Этот API широко используется, когда реализуют tag handlers (программы обработки тегов) (смотрите Tag Handlers). |
request |
подтип
от |
Запрос, запускающий выполнение JSP страницы. Смотрите Getting Information From Requests. |
response |
подтип
от |
Ответ, возвращаемый клиенту. Обычно не используется авторами JSP страниц. |
session |
javax.servlet. |
Объект – сессия клиента. Смотрите Accessing the Web Context. |
Таблица 2. Неявные объекты.
Объекты, специфические для приложения
Если возможно, поведение приложения должно быть инкапсулировано в объекты, чтобы разработчики JSP страниц могли сосредоточиться на представлении результатов. Объекты могут быть созданы разработчиками, которые являются специалистами по Java, организации доступа к базам данных и другим сервисам. Имеется четыре пути создания и использования объектов внутри страницы JSP:
Декларации, скриплеты и выражения описаны ниже в JSP Scripting Elements.
Разделяемые объекты
Условия эффективного конкурентного доступа к разделяемым объектам описаны в Sharing Information и относятся к объектам, доступным из JSP страниц, которые выполняются как многопоточные сервлеты. Вы можете указать, как web контейнер должен координировать множественные клиентские запросы с помощью следующей page директивы:
<%@ page isThreadSafe="true|false" %>
Если isThreadSafe установлен в true, web контейнер может выбрать отправку множественных конкурентных клиентских запросов странице JSP. Это – настройка по умолчанию. Если используется true, вы должны должным образом синхронизировать доступ ко всем разделяемым объектам, определенным на уровне этой страницы. Сюда включаются объекты, созданные в декларациях, компоненты JavaBean, доступные на странице, и атрибуты scope объектов страницы.
Если isThreadSafe установлен в false, запросы направляются по одному в каждый момент времени в порядке их получения, и доступ к объектам страницы не нужно контролировать. Однако, вы все еще должны обеспечить, чтобы доступ к атрибутам приложений или session scope объектов и JavaBean компонентам был должным образом синхронизирован.
JSP скриптовые элементы используются, чтобы создать и получить доступ к объектам, определить методы и управлять потоком контроля. Так как одной из целей JSP технологии является отделение статических исходных данных от кода, необходимого для генерации динамического содержимого, рекомендуется очень умеренно использовать JSP скрипты. Много работы, которая требует использования скриптов, может быть устранена при использовании заказных тегов, описанных ниже в разделе Extending the JSP Language (расширения языка JSP).
JSP технология позволяет контейнеру поддерживать любые языки скриптов, которые могут вызывать Java объекты. Если вы хотите использовать другой язык скриптов вместо java, который задан по умолчанию, вы должны определить его в page директиве в начале JSP страницы:
<%@ page language="scripting language" %>
Так как скриптовые элементы конвертируются в выражения языка программирования в классе сервлета JSP страницы, вы должны декларировать все классы и пакеты, используемые в JSP странице.
Если языком страницы является java, вы декларируете, что JSP страница будет использовать класс или пакет, с помощью page директивы:
<%@ page import="packagename.*, fully_qualified_classname" %>
Страничка примера bookstore showcart.jsp импортирует классы, необходимые, чтобы реализовать карту покупок (shoppingcart), с помощью следующей директивы:
<%@ page import="java.util.*, cart.*" %>
Декларации
Декларация используется, чтобы объявить переменные и методы языка скриптов страницы. Синтаксис декларации имеет вид:
<%! декларация языка скриптов %>
Если в качестве языка скриптов используется Java, переменные и методы в JSP декларациях становятся декларациями класса сервлета JSP страницы.
Страничка примера bookstore initdestroy.jsp определяет экземпляр переменной, названной bookDB, а также методы инициализации и завершения jspInit и jspDestroy, обсужденные раньше:
<%!
private BookDB bookDB;
public void jspInit() {
...
}
public void jspDestroy() {
...
}
%>
Скриплеты
Скриплет может содержать любой фрагмент кода, который адекватен языку скриптов, используемому на странице. Синтаксис скриплета имеет вид:
<%
выражения на языке скриптов
%>
Если в качестве языка скриптов выбран java, скриплет трансформируется во фрагмент Java оператора и вставляется в метод service сервлета JSP страницы. Переменные языка программирования, созданные скриплетом, доступны везде на JSP странице.
JSP страница showcart.jsp содержит скриплет, который извлекает итератор для коллекции элементов, содержащихся в карте покупок (корзинке), и настраивает логическую структуру для перебора всех элементов карты. Внутри цикла JSP страница извлекает свойства объектов (книг) и форматирует их, используя разметку HTML. Так как цикл while открывает блок, разметка HTML формируется скриплетом, который закрывает этот блок.
<%
Iterator i = cart.getItems().iterator();
while (i.hasNext()) {
ShoppingCartItem item =
(ShoppingCartItem)i.next();
BookDetails bd = (BookDetails)item.getItem();
%>
<tr>
<td align="right" bgcolor="#ffffff">
<%=item.getQuantity()%>
</td>
<td bgcolor="#ffffaa">
<strong><link href="
<%=request.getContextPath()%>/