
- •Жизненный цикл сервлета
- •Шаблон Модель-Представление-Контроллер. Роли компонент и зависимости между ними. Пример на одной из Java-реализаций.
- •Задачи mvc
- •Типовая структура Enterprise приложения. Слои, зоны ответственности и зависимости между слоями. Пример (названия классов и методов слоев).
- •Технологии работы с базой данных из Java. Особенности работы с соединениями с базой данных из Web-приложения. Пример.
- •Технология Hibernate
- •Аспектно ориентированное программирование: основные понятия, назначение, пример.
- •Основные концепции
- •Технологии интеграции приложений. Типы интеграции (общий ресурс, удаленный вызов процедур, обмен сообщениями) , сравнение.
- •Типы интеграции
- •Цели интеграции
- •Преимущества веб-интеграции
- •Технологии интеграции приложений. Enterprise Java Beans. Пример Stateless Session Bean.
Web-контейнер, Servlet, JSP. Структура, назначение и пример сервлета или JSP.
Контейнер сервлетов — программа, представляющая собой сервер, который занимается системной поддержкой сервлетов и обеспечивает их жизненный цикл в соответствии с правилами, определёнными в спецификациях. Может работать как полноценный самостоятельный веб-сервер, быть поставщиком страниц для другого веб-сервера, например Apache, или интегрироваться в Java EE сервер приложений. Обеспечивает обмен данными между сервлетом и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
Сервлет является Java-интерфейсом, реализация которого расширяет функциональные возможности сервера. Сервлет взаимодействует с клиентами посредством принципа запрос-ответ.
Хотя сервлеты могут обслуживать любые запросы, они обычно используются для расширения веб-серверов. Для таких приложений технология Java Servlet определяет HTTP-специфичные сервлет классы.
Пакеты javax.servlet и javax.servlet.http обеспечивают интерфейсы и классы для создания сервлетов.
public class MyServlet extends javax.servlet.http.HttpServlet {
protected void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{}
public void destroy() {
this.log("Servlet destroyed");
}
public void init(ServletConfig cfg) throws ServletException {
this.log("Servlet inited");
}
}
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 сессии
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 "Пример сервлета";
}
}
HttpServletRequest – класс, экземпляры кот. представляют запрос от браузера
String getContextPath() – возвращает путь к контексту приложения
String getServletPath() – URL вызванного сервлета (JSP)
HttpSession getSession() – Сессия пользователя
Object getAttribute() / void setAttribute(String name, Object value) – Хранение пользовательских атрибутов, связанных с запросом
String getParameter(String value) – Параметр запроса (и для GET и для POST)
void setCharacterEncoding(String enc) – Кодировка значений параметров запроса (windows-1251, UTF-8)
HttpServletResponse – класс, экземпляры кот. представляют ответ браузеру
void setContentType(String contentType) – MIME-тип ответа браузеру
java.io.PrintWriter getWriter() – поток вывода для ответа браузеру
void sendRedirect(String location) – перенаправление на другую страницу
HttpSession – класс, экземпляры кот. хранят состояние сессии клиента
Object getAttribute() / void setAttribute(String key, Object value) – Атрибуты сессии (сохраняются между запросами одного клиента)
HttpServletContext – класс, экземпляры кот. представляют все web-приложение
Object getAttribute() / void setAttribute(String key, Object value) – Атрибуты контекста (общие для всех пользователей и запросов к web-приложению)
Жизненный цикл сервлета
Жизненный цикл сервлета состоит из следующих шагов:
В случае отсутствия сервлета в контейнере.
Класс сервлета загружается контейнером.
Контейнер создает экземпляр класса сервлета.
Контейнер вызывает метод init(). Этот метод инициализирует сервлет и вызывается в первую очередь, до того, как сервлет сможет обслуживать запросы. За весь жизненный цикл метод init() вызывается только однажды.
Обслуживание клиентского запроса. Каждый запрос обрабатывается в своем отдельном потоке. Контейнер вызывает метод service() для каждого запроса. Этот метод определяет тип пришедшего запроса и распределяет его в соответствующий этому типу метод для обработки запроса. Разработчик сервлета должен предоставить реализацию для этих методов. Если поступил запрос, метод для которого не реализован, вызывается метод родительского класса и обычно завершается возвращением ошибки инициатору запроса.
В случае если контейнеру необходимо удалить сервлет, он вызывает метод destroy(), который снимает сервлет из эксплуатации. Подобно методу init(), этот метод тоже вызывается единожды за весь цикл сервлета.
JSP (JavaServer Pages) — технология, позволяющая веб-разработчикам легко создавать содержимое, которое имеет как статические, так и динамические компоненты. По сути, страница JSP является текстовым документом, который содержит текст двух типов: статические исходные данные, которые могут быть оформлены в одном из текстовых форматовHTML, SVG, WML, или XML, и JSP элементы, которые конструируют динамическое содержимое. Кроме этого могут использоваться библиотеки JSP тегов, а также EL (Expression Language), для внедрения Java-кода в статичное содержимое JSP-страниц.
Шаблон Модель-Представление-Контроллер. Роли компонент и зависимости между ними. Пример на одной из Java-реализаций.
Задачи mvc
Реализация MVC: Диспетчер, контроллеры, представления Binding (конвертация HTTP-параметров в объекты Java - модели) Validation (проверка данных модели)
Поддержка различных типов представлений (JSP, XSLT, Velocity, Freemarker, Word, Excel)
I18n / L10n
Security (Authorization – проверка прав доступа)
JSP-теги для удобства работы с всеми возможностями, описанными выше
Типовая структура Enterprise приложения. Слои, зоны ответственности и зависимости между слоями. Пример (названия классов и методов слоев).
import org.springframework.web.servlet.mvc.Controller; import org.springframework.web.servlet.ModelAndView; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.IOException; public class HelloController implements Controller { protected final Log logger = LogFactory.getLog(getClass()); public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { logger.info(«Returning hello view»); return new ModelAndView(«hello.jsp»); } }
Шаблон «Инверсия управления». Назначение и пример.
Представляет собой реестр (контейнер) объектов, которыми управляет
Позволяет декларативно конфигурировать объекты и их свойства
Сам код классов может не зависеть от IoC фреймворка. IoC контейнер является “клеем”
Берет на себя
Управление жизненным циклом объекта (когда и кем создается, когда удаляется)
Управление зависимостями (объект лишь говорит что ему нужно)
public class SetterMessage {
private String message = null;
/**
* Gets message.
*/
public String getMessage() {
return message;
}
/**
* Sets message.
*/
public void setMessage(String message) {
this.message = message;
}
}
public class MessageRunner {
final static Logger logger = LoggerFactory.getLogger(MessageRunner.class);
/**
* Main method.
*/
public static void main(String[] args) {
logger.info("Initializing Spring context.");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
logger.info("Spring context initialized.");
Message message = (Message) applicationContext.getBean("message");
logger.debug("message='" + message.getMessage() + "'");
}
}