JAXB (Java API for XML Binding) – позволяет сохранять поля класса в виде xml-файла (аналог сериализации).
При описании класса используются ключевые слова: @XmlElement() (будет сохранен как элемент), @XmlAttribute() (будет сохранен как атрибут).
import java.io.FileWriter;
import java.util.*;
import javax.xml.bind.*;
public class Java2XML {
public Java2XML() {
}
public static void main(String args[]) throws Exception{
JAXBContext context = JAXBContext.newInstance(Person.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Person person = new Person(
"Anonymous", 32, new Date(1970, 1, 10), "employee");
marshaller.marshal(person, new FileWriter(".\\src\\Person.xml"));
}
}
В итоге получим xml-файл следующего вида
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<person type="employee">
<age>32</age>
<dateOfBirth>1970-01-10 T00:00:00+05:30</dateOfBirth>
<name>Anonymous</name>
</person>
25. Создание JAXB контекста, маршалинг и демаршалинг.
JAXB предлагает быстрый и удобный способ создания двухстороннего преобразования между XML документами и классами языка Java. Задавая DTD, компилятор JAXB создает набор классов Java, содержащий весь код, который необходим для анализа XML документов, основанных на данной схеме. Разработчик, использующий созданные классы, может строить дерево объектов Java, изображающих XML документ, обрабатывать содержимое этого дерева и заново создавать XML документы из него.
Класс javax.xml.bind.JAXBContext - "точка входа" в JAXB API
Демаршаллизация: Процесс преобразования XML-данных в Java-класс (или классы).
Маршаллизация: Процесс преобразования Java-данных в XML-документ (в противоположность демаршаллизации).
Простой пример JAXB: rules.xml
<rules>
<rule>
<name>test1</name>
</rule>
<rule>
<name>test2</name>
</rule>
<rule>
<name>test3</name>
</rule>
</rules>
Rule.java
public class Rule {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
|
Rules.java
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import java.util.List;
@XmlRootElement
public class Rules {
@XmlElement(name = "rule")
List<Rule> rules;
}
Демаршализация:
JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] {Rules.class});
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Rules rules = (Rules) unmarshaller.unmarshal(new File("rules.xml"));
Маршализация:
// marshal to System.out Marshaller m = jaxbContext.createMarshaller();m.marshal(rules, System.out);
26. Сервлеты, создание, жизненный цикл
Сервлет является Java-программой, выполняющейся на стороне сервера и расширяющей функциональные возможности сервера. Сервлет взаимодействует с клиентами посредством принципа запрос-ответ.
Пакеты javax.servlet и javax.servlet.http обеспечивают интерфейсы и классы для создания сервлетов.
The service() method отправляет запросы к следующим методам doGet(), doPost(), doPut(), doDelete(), etc., в соответствии с HTTP запросами.
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class NewServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Параметр
String parameter = request.getParameter("parameter");
// Старт HTTP сессии
if (request.getSession() == null) {
HttpSession session = request.getSession(true);
session.setAttribute("parameter", parameter);
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Заголовок</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Пример сервлета"+parameter+"</h1>");
out.println("</body>");
|
out.println("</html>");
} finally {
out.close();
}
}
@Override
public String getServletInfo() {
return "Пример сервлета";
}
}
Жизненный цикл Сервлета
1. В случае отсутствия сервлета в контейнере.
a. Класс сервлета загружается контейнером.
b. Контейнер создает экземпляр класса сервлета.
c. Контейнер вызывает метод init(). Этот метод инициализирует сервлет и вызывается в первую очередь, до того, как сервлет сможет обслуживать запросы. За весь жизненный цикл метод init() вызывается только однажды.
2. Обслуживание клиентского запроса. Каждый запрос обрабатывается в своем отдельном потоке. Контейнер вызывает метод service() для каждого запроса. Этот метод определяет тип пришедшего запроса и распределяет его в соответствующий этому типу метод для обработки запроса. Разработчик сервлета должен предоставить реализацию для этих методов. Если поступил запрос, метод для которого не реализован, вызывается метод родительского класса и обычно завершается возвращением ошибки инициатору запроса.
3. В случае если контейнеру необходимо удалить сервлет, он вызывает метод destroy(), который снимает сервлет из эксплуатации. Подобно методу init(), этот метод тоже вызывается единожды за весь цикл сервлета.