Добавил:
Кафедра ВТ Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab8

.docx
Скачиваний:
1
Добавлен:
08.04.2023
Размер:
198.27 Кб
Скачать

МИНОБРНАУКИ РОССИИ

САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ

ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

«ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА)

Кафедра ВТ

ОТЧЕТ

по лабораторной работе

по дисциплине «Распределенные системы»

Тема: Enterprise JavaBeans (EJB)

Студенты гр.

Преподаватель

Бекенева Я.А..

Санкт-Петербург

2023

Задание

Продемонстрировать работу Enterprise Java Bean.

Ход работы

Enterprise JavaBeans (EJB) — спецификация технологии написания и поддержки серверных компонентов, содержащих бизнес-логику.

С точки зрения компонента EJB - это всего лишь надстройка над классом, описываемая с помощью аннотации.

Эта технология обычно применяется, когда бизнес-логика требует как минимум один из следующих сервисов, а часто — все из них:

  • поддержка сохранности данных (persistence): данные должны быть в сохранности даже после остановки программы. Чаще всего достигается с использованием базы данных;

  • поддержка распределенных транзакций;

  • поддержка параллельного изменения данных и многопоточность;

  • поддержка событий;

  • поддержка именования и каталогов (JNDI);

  • безопасность и ограничение доступа к данным;

  • поддержка автоматизированной установки на сервер приложений;

  • удалённый доступ.

Аннотации из спецификации EJB наделяют помеченный класс определенными полномочиями, силами, суперспособностями.

Есть три основные типа бинов:

  1. Message Driven Beans (бины, управляемые сообщениями); Клиенты никогда не вызывают методы MDB напрямую. Такие бины чаще всего выступают в роли слушателей JMS (Java Message Service) сообщений и служат для организации асинхронного обмена сообщениями между частями системы.

  2. Entity Beans (объектные бины) — определены в спецификации JPA (Java Persistence API) и используются для хранения данных;

  3. Session Beans (cессионные бины). Инкапсулируют в себе бизнес-логику, которую клиент может программно вызвать посредством вызова методов этого бина

Рисунок 1. Структура EJB

Рисунок 2. Компоненты, контейнеры и серверы EJB

Структура проекта представлена на рис. 2

Рисунок 3. Структура проекта

Основные аннотации EJB3

@EJB – помечается bean, который мы собираемся использовать.

@Stateless – говорит контейнеру, что класс будет stateless session bean. Для него контейнер обеспечит безопасность потоков и менеджмент транзакций.

@Local – относится к интерфейсу и говорит, что bean реализующий интерфейс доступен локально.

@Remote – относится к интерфейсу и говорит, что bean доступен через RMI (Remote Method Invocation).

@Stateful – говорит контейнеру, что класс будет stateful session bean.

@Remove – метод, помеченный как Remove говорит контейнеру, что после его исполнения нет больше смысла хранить bean, т.е. его состояние сбрасывается. Это бывает критично для производительности.

@Entity – говорит контейнеру, что класс будет сущностью БД.

@Table(name=”<name>”) – указывает таблицу для маппинга БД.

@Id указывает уникальный идентификатор сущности который будет ключом в БД.

@Column – указывает параметры колонки в БД включая имя колонки в БД.

@WebService – говорит, что интерфейс или класс будет представлять web-сервис.

Правила создания session bean

В качестве session bean может выступать обычный класс Java, но он должен удовлетворять следующим условиям:

1. Он должен иметь как минимум один метод;

2. Он не должен быть абстрактным;

3. Он должен иметь конструктор по-умолчанию;

4. Методы не должны начинаться с “ejb” (например ejbBean, ejbGoAtHome)

5. Свойства класса должны быть объявлены примитивами или реализовывать интерфейс Serializable.

Рисунок 4. Пример работы сервера

Рисунок 4. Пример работы сервера

Приложение 1. Листинг

MyServlet

package com.example.lab888; import jakarta.ejb.EJB; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/hello") public class MyServlet extends HttpServlet { //@EJB(lookup = "java:global/lab888-1.0-SNAPSHOT/ListElements") //ListElements le; @EJB EJBSessionBean sessionBean; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write(sessionBean.SayHello()); } }

ListElements

package com.example.lab888; import jakarta.ejb.Stateful; import java.util.ArrayList; import java.util.List; @Stateful(mappedName="ListElements") public class ListElements implements ListElementsRemote{ List<String> values = new ArrayList<>(); @Override public void addElement(String value) { values.add(value); } @Override public void removeElement(String value) { values.remove(value); } @Override public List<String> getElements() { return values; } }

ListElementsRemote

package com.example.lab888; import jakarta.ejb.Local; import jakarta.ejb.Remote; import java.util.List; @Local(ListElementsRemote.class) public interface ListElementsRemote { void addElement(String value); void removeElement(String value); List<String> getElements(); }

EJBSessionBean

package com.example.lab888; import jakarta.ejb.Stateless; @Stateless ///Должна использоваться только один раз и не хранить никакого состояния public class EJBSessionBean { public String SayHello(){ return "Hello World!"; } }

Index.jsp

<%@ page import="com.example.lab888.ListElementsRemote" %> <%@ page import="javax.naming.InitialContext" %> <%@ page import="java.util.List" %> <%@ page import="javax.naming.Context" %> <%@ page import="javax.naming.NameClassPair" %> <%@ page import="javax.naming.NamingEnumeration" %> <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html> <%! private static ListElementsRemote values; public void jspInit(){ try{ InitialContext ic = new InitialContext(); values = (ListElementsRemote) ic.lookup("java:global/lab888-1.0-SNAPSHOT/ListElements"); } catch (Exception e){ System.out.println(e); } } %> <% if(request.getParameter("AddNum") != null){ String val = request.getParameter("t1"); values.addElement(val); } if(request.getParameter("RemoveNum") != null){ String val = request.getParameter("t1"); values.removeElement(val); } %> <html> <head> <title>JSP - Hello World</title> </head> <body> <h1>Корзина </h1> <form name="abc" method="post"> <input type='text' name='t1'><br> <input type='submit' value="Добавить" name='AddNum'><br> <input type='submit' value="Удалить" name='RemoveNum'><br> <% if(values!= null) { List<String> nums = values.getElements(); for(String val:nums){ out.println("<br>"+val); } out.println("<br> Размер: "+nums.size()); }else{ out.println("Корзина пуста!"); } %> </form> </body> </html>

Соседние файлы в предмете Распределенные системы управления