Выбрать главу

В этом варианте сервлета мы будем использовать 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(

    new URL("http://localhost/stylesheet.xsl"), null);

   // Выполняем преобразование

   XMLDocumentFragment fragment =

    (XMLDocumentFragment)doc.transformNode(stylesheet);

   // Выводим результат

   fragment.print(out);

  }

  catch (MalformedURLException mue) {}

  catch (XSLException xsle) {}

  // Закрываем выходящий поток

  out.close();

 }

}

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

Листинг 9.24. XML-документ, сгенерированный в сервлете

<Request>

 <General>

  <ServerName>aphrodite.fzi.de</ServerName>

  <ServerPort>80</ServerPort>

  <RemoteAddr>127.0.0.1</RemoteAddr>

  <Protocol>HTTP/1.1</Protocol>

  <Method>GET</Method>

  <RequestURI>/servlet/example1</RequestURI>