Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

Второй вариант того же самого сервлета, который мы предложим ниже, демонстрирует, как в данном случае при помощи XSLT можно разделить данные и их презентацию. Идея очень проста: вместо того, чтобы в жестко заданном виде выводить информацию в выходящий поток, можно создать XML-документ в виде DOM-объекта и затем применить к нему XSLT-преобразование, которое создаст для него требуемое HTML-представление.

В этом варианте сервлета мы будем использовать Java-версию XML-библиотеки Oracle XDK (Oracle XML SDK, платформа разработки XML-приложений, созданная в Oracle Corp.). В данном примере из этой библиотеки мы будем использовать только XSLT-процессор (класс

XSLProcessor
) и реализацию DOM-модели XML-документа (класс
XMLDocument
).
Во всем остальном мы будем полагаться на Java-реализацию стандартных интерфейсов объектной модели документа DOM, разработанной Консорциумом W3. DOM-интерфейсы позволят нам манипулировать XML-документом на уровне модели: создавать и включать друг в друга узлы элементов, текстовые узлы и так далее.

Листинг 9.23. Вариант сервлета, использующий XSLT

import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import java.util.*;

import java.net.*;

import oracle.xml.parser.v2.*;

import org.w3c.dom.*;

public class example extends HttpServlet {

 /**

 * Функция, создающая в элементе parent элемент с именем name и

 * текстовым значением value. Если value имеет значение null,

 * текст не создается.

 */

 public static Element addElement(Element parent, String name, String value) {

Element child = parent.getOwnerDocument.createElement(name);

parent.appendChild(child);

if (value != null) {

Text text = parent.getOwnerDocument.createTextNode(value);

child.appendChild(text);

}

return child;

 }

 /**

 * Инициализация.

 */

 public void init(ServletConfig config) throws ServletException {

super.init(config);

 }

 /**

 * Основной метод сервлета

 */

 public void service(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

// Выставляем тип содержимого

response.setContentType("text/html");

// Инициализируем выходящий поток

OutputStreamWriter o_sw =

new OutputStreamWriter(response.getOutputStream);

PrintWriter out = new PrintWriter(response.getOutputStream);

// Получаем объекты

cookie Cookie[] cookies = request.getCookies;

// Создаем выходящий документ

XMLDocument doc = new XMLDocument;

//
Создаем корневой элемент

Request Element elRequest = doc.createElement("Request");

doc.appendChild(elRequest);

// Создаем элемент General

Element elGeneral = addElement(elRequest, "General", null);

// Создаем элементы, содержащие общую информацию

addElement(elGeneral, "ServerName", request.getServerName);

addElement(elGeneral, "ServerPort",

Integer.toString(request.getServerPort));

addElement(elGeneral, "RemoteAddr", request.getRemoteAddr);

addElement(elGeneral, "Protocol", request.getProtocol);

addElement(elGeneral, "Method", request.getMethod);

addElement(elGeneral, "RequestURI", request.getRequestURI);

addElement(elGeneral, "QueryString", request.getQueryString);

// Создаем элемент Param

Element elParam = addElement(elRequest, "Param", null);

// В элементе Param создаем элементы, описывающие параметры запроса

for (Enumeration e = request.getParameterNames;

e.hasMoreElements;) {

String name = e.nextElement.toString;

String[] values = request.getParameterValues(name);

// Для каждого из значений каждого из параметров

// создаем соответствующий элемент

for (int i=0; i < values.length; i++)

addElement(elParam, name, values[i]);

}

// Создаем элемент Session

Element elSession = addElement(elRequest, "Session", null);

// Получаем объект HTTP-сессии

HttpSession session = request.getSession(true);

// Получаем имена параметров сессии

String[] names = session.getValueNames;

// В элементе Session создаем по элементу

// для каждого из параметров сессии

for (int i=0; i < names.length; i++)

addElement(elSession, session.getValueNames[i],

session.getValue(session.getValueNames[i]).toString);

// Создаем элемент Cookie

Element elCookie = addElement(elRequest, "Cookie", null);

// Создаем по элементу для каждого из объектов cookies

for (int i=0; i < cookies.length; i++)

addElement(elCookie, cookies[i].getName, cookies[i].getValue);

// Преобразовываем созданный документ и выводим результат

try {

// Загружаем преобразование

XSLStylesheet stylesheet = new XSLStylesheet(

Поделиться с друзьями: