out.println(' <h1>Request parameters</h1>');
out.println(' <table>');
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++) {
out.println(' <tr>');
out.println(' <td>' + name + '</td>');
out.println(' <td>' + values[i] + '</td>');
out.println(' </tr>');
}
}
out.println(' </table>');
// Выводим параметры HTTP-сессии
out.println(' <h1>Session parameters</h1>');
out.println(' <table>');
HttpSession session = request.getSession(true);
String[] names = session.getValueNames();
for (int i=0; i < names.length; i++) {
String name = session.getValueNames()[i];
out.println(' <tr>');
out.println(' <td>' + name + '</td>');
out.println(' <td>' +
session.getValue(name).toString() + '</td>');
out.println(' </tr>');
}
out.println(' </table>');
// Выводим cookies
response.addCookie(new Cookie('content', 'apple jam'));
out.println(' <h1>Cookies</h1>');
out.println(' <table>');
Cookie[] cookies = request.getCookies();
for (int i=0; i < cookies.length; i++) {
out.println(' <tr>');
out.println(' <td>' + cookies[i].getName() + '</td>');
out.println(' <td>' + cookies[i].getValue() + '</td>');
out.println(' </tr>');
}
out.println(' </table>');
out.println(' </body>');
out.println('</html>');
// Закрываем выходящий поток
out.close();
}
}
Результатом обращения к этому сервлету по URL вида
http://localhost/servlet/example? x=1&y=2&z=3&x=4&y=5&z=6
будет документ, аналогичный представленному на рис. 9.13.

Рис. 9.13. Результат обращения к сервлету
Несложно видеть, насколько жестко в этом сервлете закодирована презентация данных: для минимального изменения генерируемого документа придется в обязательном порядке изменять сам сервлет, что в современных системах может быть непозволительной роскошью, — все равно, что перебирать мотор для того, чтобы перекрасить автомобиль.
Второй вариант того же самого сервлета, который мы предложим ниже, демонстрирует, как в данном случае при помощи 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-документом на уровне модели: создавать и включать друг в друга узлы элементов, текстовые узлы и так далее.
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);
}