Эксперт
Сергей
Сергей
Задать вопрос
Мы готовы помочь Вам.

Лабораторная работа 

Создать веб-приложение по шагам, описанным в теоретической части. Запустить приложение в серверной среде и проверить его работоспособность.

 

Лабораторная работа 

Создать простой веб-сайт на основе сервлетов. Первый сервлет обрабатывает ввод пользователя, второй на основе полученного ввода выдает сообщение. Например, пользователь вводит свое имя, а на следующей странице получает сообщение «Привет, «имя пользователя»!».

 

Реализация задания:

Код первого сервлета, обрабатывающего главную страницу «/» (рисунок 29).

Рисунок 29 – Код класса «HomeServlet»

 

Код второго сервлета, обрабатывающего страницу «/welcome» (рисунок 30).

Рисунок 30 – Код класса «WelcomeServlet»

 

Лабораторная работа 

Сделать страничку с аутентификацией пользователя. Предусмотреть как минимум два вида пользователей (обычный пользователь и администратор) с разными итоговыми страницами, на которые осуществляется переход в зависимости от введенного логина и пароля. Предусмотреть проверку корректности введённого пароля с помощью сервлетного фильтра.

Реализация задания:

В качестве примера ниже приведены шесть классов, имитирующих совокупно простую авторизацию пользователя в системе.

Класс HomeServlet отвечает за главную страницу с двумя формами ввод: логин и пароль (рисунок 31).

Рисунок 31 – Код класса «HomeServlet»

 

UserFilter проверяет наличие пользователя в базе днных на основе введенной им информации (рисунок 32).

Рисунок 32 – Код класса «UserFilter»

 

WelcomeServlet отвечает за результат авторизации пользователя, в зависимости от введенных данных пользователь получит соответсвующее сообщение (рисунок 33).

Рисунок 33 – Код класса «WelcomeServlet»

 

Класс Database имитирует базу данных (рисунок 34).

 

Рисунок 34 – Код класса «Database»

 

Класс Enum перечисляет роли в приложении (рисунок 35).

Рисунок 35 — Код класса «Role»

Класс User описывает пользователя (рисунок 36).

Рисунок 36 — Код класса «User»

КОНТРОЛЬНЫЕ ВОПРОСЫ ПО ТЕМЕ СЕРВЛЕТЫ

  1. Что такое сервлеты?
  2. Опишите принцип работы сервлетов?
  3. Назовите основные преимущества сервлетов?
  4. Что такое контейнер сервлетов?
  5. Как устроен жизненный цикл сервлетов?
  6. Что такое дескриптор развертывания?
  7. Что такое Http? Какие существуют Http-методы?
  8. Сколько Http-методов можно переопределить в классе наследующего HttpServlet?
  9. Какое предназначение классов HttpServletRequest и HttpServletResponse?
  10. Какими способами можно закрепить за сервлетом обработку конкретного URL?

Лабораторная работа 

Создать веб-приложение по шагам, описанным в теоретической части. Запустить приложение в серверной среде и проверить его работоспособность.

 

Лабораторная работа

Создать простой веб-сайт на основе сервлетов. Первый сервлет обрабатывает ввод пользователя, второй на основе полученного ввода выдает сообщение. Например, пользователь вводит свое имя, а на следующей странице получает сообщение «Привет, «имя пользователя»!».

Реализация задания:

Код первого сервлета, обрабатывающего главную страницу «/» (рисунок 29).

Рисунок 29 – Код класса «HomeServlet»

 

Код второго сервлета, обрабатывающего страницу «/welcome» (рисунок 30).

Рисунок 30 – Код класса «WelcomeServlet»

 

Лабораторная работа 

Сделать страничку с аутентификацией пользователя. Предусмотреть как минимум два вида пользователей (обычный пользователь и администратор) с разными итоговыми страницами, на которые осуществляется переход в зависимости от введенного логина и пароля. Предусмотреть проверку корректности введённого пароля с помощью сервлетного фильтра.

Реализация задания:

В качестве примера ниже приведены шесть классов, имитирующих совокупно простую авторизацию пользователя в системе.

Класс HomeServlet отвечает за главную страницу с двумя формами ввод: логин и пароль (рисунок 31).

Рисунок 31 – Код класса «HomeServlet»

 

UserFilter проверяет наличие пользователя в базе днных на основе введенной им информации (рисунок 32).

Рисунок 32 – Код класса «UserFilter»

 

WelcomeServlet отвечает за результат авторизации пользователя, в зависимости от введенных данных пользователь получит соответсвующее сообщение (рисунок 33).

Рисунок 33 – Код класса «WelcomeServlet»

 

Класс Database имитирует базу данных (рисунок 34).

 

Рисунок 34 – Код класса «Database»

 

 

Класс Enum перечисляет роли в приложении (рисунок 35).

Рисунок 35 — Код класса «Role»

 

Класс User описывает пользователя (рисунок 36).

Рисунок 36 — Код класса «User»

КОНТРОЛЬНЫЕ ВОПРОСЫ ПО ТЕМЕ СЕРВЛЕТЫ

 

Что такое сервлеты

  1. Опишите принцип работы сервлетов?
  2. Назовите основные преимущества сервлетов?
  3. Что такое контейнер сервлетов?
  4. Как устроен жизненный цикл сервлетов?
  5. Что такое дескриптор развертывания?
  6. Что такое Http? Какие существуют Http-методы?
  7. Сколько Http-методов можно переопределить в классе наследующего HttpServlet?
  8. Какое предназначение классов HttpServletRequest и HttpServletResponse?
  9. Какими способами можно закрепить за сервлетом обработку конкретного URL?

 

 

Практическое занятие  . Разработка JSP.

Лабораторная работа .

Разработайте web приложение на основе JSP:

  • создайте jsp страницу, отвечающую за корень приложения и выводящее единственное слово «Привет»;
  • доработайте страницу, чтобы она выводила текущие дату и время (используйте директиву для импорта java.util.Date);
  • используйте скриплет для объявления переменной, хранящей значение даты-времени;
  • используйте выражение внутри HTML для вставки текущей даты с предваряющей надписью «Сегодня …».

Код JSP:

<%@ page language=»java» contentType=»text/html; charset=UTF-8″         pageEncoding=»UTF-8″%>

<%@ page import=»java.util.Date»%>

<!DOCTYPE html PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>

<html>

<head>

<meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″>

<title>Задание 1</title>

</head>

<body>

<p>Привет</p>

<%

Date date1 = new Date();

out.println(«Сегодня » + date1);

%>

</body>

</html>

 

Лабораторная работа № 2.

Разработайте web приложение на основе JSP:

  • объявите две переменных date1 и date2 класса java.util.Date. Переменную date1 объявите через скриплет (<%… %>), а переменную date2 – через объявление (<%!…%>). Инициализируйте при объявлении (Date date1 = new Date();)
  • используя jsp синтаксис выведите их значения;
  • обновите страницу несколько раз. Что происходит и почему?

Код JSP:

<%@ page language=»java» contentType=»text/html; charset=UTF-8″         pageEncoding=»UTF-8″%>

<%@ page import=»java.util.Date»%>

<!DOCTYPE html PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>

<html>

<head>

<meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″>

<title>Задание 2</title>

</head>

<body>

<% Date date1 = new Date(); %>

<%! Date date2 = new Date(); %>

<%

out.println(«<p>date1 » + date1 + «</p>»);

out.println(«<p>date2 » + date2 + «</p>»);

%>

</body>

</html>

 

Лабораторная работа 

Разработайте web приложение на основе JSP:

  • создайте текстовый файл, содержащий текст «включение в JSP»;
  • создайте jsp, включающую выше указанный текст директивой include;
  • включите этот же текст, используя действие (action) <jsp:include …>, (не забудьте установить атрибут flush=»true»). Убедитесь, что при отображении текст включен дважды;
  • измените текст во включенном файле (на сервере). Обновите страницу. Поясните, что и почему произошло.

Код JSP:

<%@ page language=»java» contentType=»text/html; charset=UTF-8″         pageEncoding=»UTF-8″%>

<!DOCTYPE html PUBLIC «-//W3C//DTD HTML 4.01 Transitional//EN» «http://www.w3.org/TR/html4/loose.dtd»>

<html>

<head>

<meta http-equiv=»Content-Type» content=»text/html; charset=UTF-8″>

<title>Задание 4</title>

</head>

<body>

<%@ include file=»text.txt» %>

<br>

<jsp:include page=»text.txt» flush=»true»/>

</body>

</html>

 

 

Задание

Разработайте web приложение на основе JSP и EJB, которое реализует калькулятор на два поля.

Код JSP:

<%@ page import=»javax.ejb.EJB»%>

<%@ page import=»ejb.Calc»%>

<%@ page language=»java» contentType=»text/html; charset=UTF-8″ pageEncoding=»UTF-8″%>

<%! @EJB Calc calc = new Calc(); %>

 

<!DOCTYPE html>

<html>

<head>

<meta charset=»UTF-8″>

<title>Calc master</title>

</head>

<body>

 

<form method=»post»>

<input type=»text» name=»a»><br>

<input type=»text» name=»b»><br>

<button type=»submit» name=»plus»>+</button>

<button type=»submit» name=»min»>-</button><br>

<button type=»submit» name=»mult»>*</button>

<button type=»submit» name=»div»>/</button>

</form>

 

<%

if(request.getParameter(«plus») != null)

{

float a = Float.parseFloat(request.getParameter(«a»));

float b = Float.parseFloat(request.getParameter(«b»));

out.println(calc.plus(a, b));

 

}

 

else if (request.getParameter(«min») != null) {

float a = Float.parseFloat(request.getParameter(«a»));

float b = Float.parseFloat(request.getParameter(«b»));

out.println(calc.min(a, b));

}

 

else if (request.getParameter(«mult») != null) {

float a = Float.parseFloat(request.getParameter(«a»));

float b = Float.parseFloat(request.getParameter(«b»));

out.println(calc.mult(a, b));

}

 

else if (request.getParameter(«div») != null) {

float a = Float.parseFloat(request.getParameter(«a»));

float b = Float.parseFloat(request.getParameter(«b»));

out.println(calc.div(a, b));

}

%>

 

</body>

</html>

 

 

 

Код EJB:

package ejb;

import javax.ejb.LocalBean;

import javax.ejb.Stateless;

 

@Stateless

@LocalBean

public class Calc {

public Calc() {}

 

public float plus(float a, float b) {

return a+b;

}

 

public float min(float a, float b) {

return a-b;

}

 

public float mult(float a, float b) {

return a*b;

}

 

public float div(float a, float b) {

return a/b;

}

}

 

 

Контрольные вопросы по практической работе.

  1. Как расшифровывается сокращение JSP ?
  2. Позволяет ли JSP комбинировать HTML Web страницы с кусочками кода Java в одном документе?
  3. Какое расширение бывает у JSP-страниц?
  4. Что из перечисленного ниже НЕ является «движком» для работы с JSP?
  5. Можно ли в одну JSP-страницу вставлять несколько других?
  6. Для вставки текущей даты на JSP-страницу нужно использовать директиву для импорта:
  7. С помощью, каких тегов можно определить код Java на странице JSP?
  8. Комментарии в JSP-странице добавляются с помощью тега:
  9. Можно ли использовать объект request в JSP-странице для отправленных форм?
  10. Что позволяет вставить код Java в страницу JSP, которая взаимодействует с объектами страницы при обработке запроса?

 

 

Практическое занятие  Разработка JPQL запросов.

 

 Лабораторные работы

1-й уровень сложности:

На основе сущностей, созданных в практической работе 7, написать JPQL запросы по выбору информации:

  • Вывод данных созданных сущностей
  • Вывод данных по условию
  • Вывод данных с помощью агрегатных функций
  • Запрос на изменение данных
  • Запрос на удаление данных.

2-й уровень сложности:

На основе сущностей, созданных в практической работе 7, написать JPQL запросы по выбору информации:

  • Вывод связанных данных из сущностей
  • Вывод данных с использованием подзапроса.
  • Вывод данных по введенному параметру

3-й уровень сложности:

Реализовать запрос конструктора класса по выбору частичных данных из созданных сущностей.

 

Выполнение лабораторных работ

         Для демонстрации разработки JPQL запросов на собственном ноутбуке установлены:

  • база данных MYSQL;
  • инструмент для визуального проектирования баз данных MySQL Workbench;
  • программный компонент Java EE 7 SDK;
  • инструмент для разработки приложений Eclipse Java.

В среде MySQL Workbench создана база данных JPADB.

Для реализации запросов созданы сущности Author и Book, связанные между собой отношением многие-ко-многим по идентификаторам.

Сущность Author содержит атрибуты:

  • id – идентификатор автора;
  • firstName – имя автора;
  • lastName – фамилия автора.

Сущность Book содержит атрибуты:

  • id – идентификатор книги;
  • title – название книги;
  • zena – цена книги.

Программы создания классов сущностей представлены в приложениях 1 и 2. Для заполнения сущностей данными создан класс CreateAuthor, представленный в приложении 3. В результате выполнения программе в базе данных jpadb автоматически создаются таблицы:

  1. author
  2. book
  3. author_book

Таблица author_book содержит информацию о связях между идентификаторами таблиц author и book.

Для создания запросов JPQL создан класс JPQL_zapros. Текст класса представлен в приложении 4. В таблице 4 приведены описания созданных запросов.

NN Описание Текст заапроса
1 Записи сущности Author Select e » + «from Author e
2 Записи сущности Book Select b from Book b
3 Выбор авторов книги “12 стульев” SELECT  a FROM Author a  INNER JOIN a.books b where b.title=’12 стульев’
4 Выбор книги по автору (из параметра) SELECT  b FROM Book b  INNER JOIN b.authors a where a.lastName=:lastName

query4.setParameter(«lastName», «Пушкин»);

5 Выбор максимальной цены книги Select max(b.zena) from Book b
6 Использование подзапросов — выбор книги с максимальной ценой Select b from Book b where b.zena=(Select max(b_max.zena) from Book b_max)
7 Замена имени автора книги UPDATE Author a set a.firstName=’Александр Сергеевич’ where a.lastName=’Пушкин’
8 Удаление автора книги DELETE from Author a  where a.id=5

 

Результаты работы программы выводятся в фрейм и представлены на рисунке.

 

 

Приложение 1. Создание сущности Author

package eclipselink.entity;

import java.util.ArrayList; // подключение библиотек

import java.util.List;

import javax.persistence.*;

@Entity // сущность

@Table(name = «author») // определяем имя таблицы БД

public class Author {

@Id  //название поля в соответствующей таблице БД

private Integer id; // аттрибут класса

@Column(name = «first_name»)

private String firstName;

@Column(name = «last_name»)

private String lastName;

@ManyToMany // связь многие-ко-многим

@JoinTable(name=»author_book», // имя таблицы БД для связи 2 таблиц

joinColumns=@JoinColumn(name=»author_id», referencedColumnName=»ID»),

inverseJoinColumns = @JoinColumn(name=»book_id», referencedColumnName=»ID»)

)

private List<Book> books=new ArrayList<>(); // список книг

public void addBook(Book book){ //Метод для добавуления книги в список

this.books.add(book);

book.getAuthors().add(this);

}

// Определение методов get и set для аттрибутов сущности

public Author() {

}

 

public Integer getId() {

return id;

}

 

public void setId(Integer id) {

this.id = id;

}

 

public String getFistName() {

return firstName;

}

public void setFirstName(String name) {

this.firstName = name;

}

public String getLastName() {

return lastName;

}

public void setLastName(String lastName) {

this.lastName = lastName;

}

}

 

Приложение 2. Создание сущности Book

package eclipselink.entity;

import java.util.ArrayList;  // подключение библиотек

import java.util.HashSet;

import java.util.List;

import java.util.Set;

import javax.persistence.*;

@Entity  // сущность

@Table(name = «book»)  // определяем имя таблицы БД

public class Book {

@Id  //название поля в соответствующей таблице БД

Integer id; // аттрибут класса

@Column(name = «title»)

private String title;

@Column(name = «zena»)

private Number zena;

// связь многие-ко-многим

@ManyToMany(fetch = FetchType.EAGER, mappedBy = «books»)

private List<Author> authors;  // список авторов

// Определение методов get и set для аттрибутов сущности

public List<Author> getAuthors() {

return authors;

}

 

public Book() {

authors = new ArrayList<Author>();

}

 

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getTitle() {

return title;

}

public void setTitle(String name) {

this.title = name;

}

public Number getZena() {

return zena;

}

public void setZena(Number summa) {

this.zena = summa;

}

}

 

Приложение 3. Заполнение сущностей данными.

public class CreateAutor {

 

public static void main( String[ ] args ) {

// создание объекта класса EntityManagerFactory

EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( «Eclipselink_JPA» );

// создание объекта EntityManager для управления сущностями

EntityManager entitymanager = emfactory.createEntityManager( );

entitymanager.getTransaction( ).begin( );

////////////Создание объектов класса Author

Author author1 = new Author( );

 

author1.setId( 1 );

author1.setFirstName( «Александр» );

author1.setLastName( «Пушкин» );

 

entitymanager.persist( author1 );

 

////////////

Author author2 = new Author( );

 

author2.setId( 2 );

author2.setFirstName( «Лев» );

author2.setLastName( «Толстой» );

 

entitymanager.persist( author2 );

 

////////////

Author author3 = new Author( );

 

author3.setId( 3 );

author3.setFirstName( «Илья» );

author3.setLastName( «Ильф» );

 

entitymanager.persist( author3 );

 

////////////

Author author4 = new Author( );

 

author4.setId( 4 );

author4.setFirstName( «Евгений» );

author4.setLastName( «Петров» );

 

entitymanager.persist( author4 );

 

 

////////////Создание объектов класса Book

Book book1 = new Book( );

 

book1.setId( 1 );

book1.setTitle( «Евгений Онегин» );

book1.setZena( 200 );

 

entitymanager.persist( book1 );

 

////////////

Book book2 = new Book( );

 

book2.setId( 2 );

book2.setTitle( «Капитанская дочка» );

book2.setZena( 250 );

 

entitymanager.persist( book2 );

 

////////////

Book book3 = new Book( );

 

book3.setId( 3 );

book3.setTitle( «У лукоморья…» );

book3.setZena( 150 );

 

entitymanager.persist( book3 );

 

////////////

Book book4 = new Book( );

 

book4.setId( 4 );

book4.setTitle( «Война и мир» );

book4.setZena( 500 );

 

entitymanager.persist( book4 );

 

////////////

Book book5 = new Book( );

 

book5.setId( 5 );

book5.setTitle( «Детство» );

book5.setZena( 400 );

 

entitymanager.persist( book5 );

 

////////////

Book book6 = new Book( );

 

book6.setId( 6 );

book6.setTitle( «12 стульев» );

book6.setZena( 300 );

 

entitymanager.persist( book6 );

 

////////////Добавление книг к авторам

 

author1.addBook(book1);

author1.addBook(book2);

author1.addBook(book3);

entitymanager.persist( author1 );

entitymanager.persist( book1 );

author2.addBook(book4);

author2.addBook(book5);

author3.addBook(book6);

author4.addBook(book6);

 

//////////// Сохранение данных в БД

entitymanager.getTransaction( ).commit( );

entitymanager.close( );

emfactory.close( );

}

}

 

Приложение 4. Класс JPQL_zapros

package eclipselink.servise;

import java.util.List;     //Подключение библиотек

import javax.persistence.EntityManager;

import javax.persistence.EntityManagerFactory;

import javax.persistence.Persistence;

import javax.persistence.Query;

import eclipselink.entity.DynamicWrite;

import eclipselink.entity.Author; //подключение классов сущностей

import eclipselink.entity.Book;

public class JPQL_zapros {  // создание класса запросов

public static void main( String[ ] args ) {

DynamicWrite dyna = new DynamicWrite(); // объект класса – создание фрейма

// создание объекта класса EntityManagerFactory

EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( «Eclipselink_JPA» );

// создание объекта EntityManager для управления сущностями

EntityManager entitymanager = emfactory.createEntityManager();

////////   вывод строки во фрейм вывода

dyna.prepareAndShowGUI(«Запрос 1 — таблица Author»);

// создание объекта запрос с помощью метода createQuery

Query query = entitymanager.createQuery( «Select e » + «from Author e » );

// создание объекта Список для вывода результатов запроса

List<Author> list=(List<Author>)query.getResultList( );

for( Author e:list ){  // цикл по списку результата

// вывод аттрибутов сущности Author во фрейм

dyna.prepareAndShowGUI(«Author ID :» + e.getId( ));

dyna.prepareAndShowGUI(«\t Имя :» + e.getFistName());

dyna.prepareAndShowGUI(«\t Фамилия :» + e.getLastName());

}

dyna.prepareAndShowGUI(«——————————————————«);

////////     Аналогичный запрос для сущности Book

dyna.prepareAndShowGUI(«Запрос 2 — таблица Book»);

 

Query query2 = entitymanager.createQuery( «Select b from Book b » );

 

List<Book> list_book=(List<Book>)query2.getResultList( );

 

for( Book b:list_book){

 

dyna.prepareAndShowGUI(«Book ID :» + b.getId( ));

dyna.prepareAndShowGUI(«\t Название :» + b.getTitle());

dyna.prepareAndShowGUI(«\t Цена :» + b.getZena());

}

dyna.prepareAndShowGUI(«——————————————————«);

////////   Формирование запроса для вывода связанных сущностей Author и Book

dyna.prepareAndShowGUI(«Запрос 3 — Авторы книги 12 стулльев»);

 

Query query3 = entitymanager.createQuery( «SELECT  a FROM Author a  INNER JOIN a.books b where b.title=’12 стульев'» );

 

List<Author> list_author1=(List<Author>)query3.getResultList( );

 

for( Author a:list_author1 ){

 

dyna.prepareAndShowGUI(a.getFistName()+» «+ a.getLastName());

}

dyna.prepareAndShowGUI(«——————————————————«);

////////  Формирование данных по параметру

dyna.prepareAndShowGUI(«Запрос 4 — Выбор книги по автору(из параметра)»);

 

Query query4 = entitymanager.createQuery( «SELECT  b FROM Book b  INNER JOIN b.authors a where a.lastName=:lastName» );

query4.setParameter(«lastName», «Пушкин»); // задание параметра

dyna.prepareAndShowGUI(«Параметр lastName = Пушкин»);

list_book=(List<Book>)query4.getResultList( );

 

for(Book b:list_book ){

 

dyna.prepareAndShowGUI( b.getTitle());

}

dyna.prepareAndShowGUI(«——————————————————«);

//////// Запрос с использованием агрегатных функций

dyna.prepareAndShowGUI(«Запрос 5 — выбор максимальной цены книги»);

 

Query query5 = entitymanager.createQuery( «Select max(b.zena) from Book b » );

 

Number max_zena=(Number)query5.getSingleResult( ); // Результат запроса  — одно число

 

dyna.prepareAndShowGUI(«\t Цена :» + max_zena.toString());

 

 

dyna.prepareAndShowGUI(«——————————————————«);

//////// Формирование запросов с использованием подзапросов

dyna.prepareAndShowGUI(«Запрос 6 — Использование подзапросов — выбор книги с максимальной ценой»);

 

Query query6 = entitymanager.createQuery( «Select b from Book b where b.zena=(Select max(b_max.zena) from Book b_max)» );

 

list_book=(List<Book>)query6.getResultList( );

 

for( Book b:list_book){

 

dyna.prepareAndShowGUI(«\t Название :» + b.getTitle());

dyna.prepareAndShowGUI(«\t Цена :» + b.getZena());

}

dyna.prepareAndShowGUI(«——————————————————«);

//////// Формирование запроса на замену данных

dyna.prepareAndShowGUI(«Запрос 7 — замена данных»);

entitymanager.getTransaction().begin(); // начало выполнения транзакции

Query query7 = entitymanager.createQuery( «UPDATE Author a set a.firstName=’Александр Сергеевич’ where a.lastName=’Пушкин'» );

Number count = query7.executeUpdate();

dyna.prepareAndShowGUI(«\t Количество обновленных записей :» + count.toString());

entitymanager.getTransaction().commit(); // сохранение измененных данных в БД

entitymanager.close();

entitymanager = emfactory.createEntityManager();

// вывод обновленных значений в окно

query = entitymanager.createQuery( «Select a » + «from Author a  where a.lastName=’Пушкин'» );

list=(List<Author>)query.getResultList( );

for( Author a:list ){

 

dyna.prepareAndShowGUI(«Author ID :» + a.getId( ));

dyna.prepareAndShowGUI(«\t Имя :» + a.getFistName());

dyna.prepareAndShowGUI(«\t Фамилия :» + a.getLastName());

}

entitymanager.close();

// возвращаем предыдущее значение

entitymanager = emfactory.createEntityManager();

entitymanager.getTransaction().begin();

query7 = entitymanager.createQuery( «UPDATE Author a set a.firstName=’Александр’ where a.lastName=’Пушкин'» );

 

count = query7.executeUpdate();

entitymanager.getTransaction().commit();

entitymanager.close();

dyna.prepareAndShowGUI(«——————————————————«);

//////// Формирование запроса на удаление данных

dyna.prepareAndShowGUI(«Запрос 8 — удаление данных»);

entitymanager = emfactory.createEntityManager();

entitymanager.getTransaction().begin();

Query query8 = entitymanager.createQuery( «DELETE from Author a  where a.id=5» );

count = query8.executeUpdate();

dyna.prepareAndShowGUI(«\t Количество удаленных записей :» + count.toString());

entitymanager.getTransaction().commit();

entitymanager.close();

}

 

}

 

Контрольные вопросы

  • Что такое JPQL запрос? В чем его отличие от SQL запроса?
  • Опишите структуру JPQL запроса.
  • Агрегатные функции JPQL запроса.
  • Методика связи сущностей в JPQL запросах.
  • Операции сравнения в JPQL запросах.
  • Использования выражений GROUP BY, HAVING, ORDER BY в JPQL запросах.
  • Функции языка запросов JPQL.
  • Специальные операторы языка запросов JPQL.
  • Описать класс управления сущностями для создания JPQL запросов.
  • Описать интерфейс JPA для запуска JPQL запросов.

 

Практическое задание . Шаблон DAO.

Лабораторная работа 

Создание классов на основе диаграммы классов шаблона DAO

 

Цель: научиться создавать классы, необходимые для реализации шаблона DAO.

Задание: создать классы на основе диаграммы классов шаблона DAO и скомпилировать код на языке JAVA.

Диаграмма классов представлена на рисунке 1:

Рисунок 1. Диаграмма классов шаблона DAO

Решение:

//задание — создать классы User,DaoApi,InMemoryUserDao как часть DAO паттерна, и в main классе получить User по Id, и всех User сразу.

DaoApi<User> userDao = new InMemoryUserDao(); //создаем экземпляр DAO по работе с пользователями

System.out.println(«get user with id = 1:\n» + userDao.get(«1»)); //используя API DAO, получаем пользователя по ID и выводим на экран

System.out.println(«get all users:\n» + userDao.getAll()); //используя API DAO, получаем всех пользователей и выводим на экран

Лабораторная работа 

Создание сущностей, хранимых в памяти программы (создание на основе шаблона DAO)

 

Цель: научиться создавать классы, представляющие сущности из реальной жизни и настроить шаблон DAO на работу с ними.

Задание: на основе лабораторной работы №1 создать сущности и настроить работу шаблона DAO с ними, а именно: написать программу на языке JAVA, с использованием шаблона DAO, которая будет добавлять нового сотрудника в базу данных.

Решение:

// задание — добавить возможность добавления сущности, используя DAO, c хранением той в памяти программы

DaoApi<User> userDao2 = new InMemoryUserDao(); //создаем экземпляр DAO по работе с пользователями

User user = new User(); //создаем новый объект типа User

user.setId(«3»); //устанавливаем ID

user.setName(«Ivan»); //устанавливаем имя

user.setSurName(«Ivanov»); //устанавливаем фамилию

userDao2.save(user); //используя DAO API, сохраняем пользователя в хранилище

System.out.println(«get user with id = 3:\n» + userDao2.get(«3»)); //используя API DAO, получаем пользователя по ID и выводим на экран

 

Лабораторная работа 

Добавление в шаблон DAO возможностей создания, модификации и удаления объектов

 

Цель: научиться добавлять в шаблон DAO CRUD-операции над сущностями.

Задание: на основе лабораторной работы №2 добавить CRUD-методы в шаблон DAO (операции создания, чтения, обновления и удаления).

 

// задание — добавить возможность CRUD операций над сущностью, используя DAO
DaoApi<User> userDao3 = new InMemoryUserDao(); //создаем экземпляр DAO по работе с пользователями

User user3 = new User(); //создаем новый объект типа User
user3.setId(«4»); //устанавливаем ID
user3.setName(«Stan»); //устанавливаем имя
user3.setSurName(«Stanley»); //устанавливаем фамилию

userDao3.save(user3); //используя DAO API, сохраняем пользователя в хранилище

System.out.println(«created user with id = 4:\n» + userDao3.get(«4»)); //используя API DAO, получаем пользователя по ID и выводим на экран

user3.setName(«John»); //устанавливаем новое имя у уже существующего пользователя
userDao3.update(user3); //используя DAO API, изменяем пользователя
System.out.println(«updated user with id = 4:\n» + userDao3.get(«4»)); //используя API DAO, получаем пользователя по ID и выводим на экран

userDao3.delete(user3); //используя DAO API, удаляем пользователя
System.out.println(«deleted user with id = 4»); //

 

Контрольные вопросы

 

1) Что такое шаблон DAO?

2) Шаблон DAO применим только к языку JAVA или ко множеству языков программирования?

3) Какова основная концепция применения шаблона DAO?

4) Из скольких элементов состоит шаблон DAO?

5) Что определяет интерфейс объектов доступа к данным?

6) В случае использования шаблона DAO клиент получает ответ напрямую из базы данных?

7) Если возникнет необходимость миграции на другую базу данных, какую часть кода придётся переделывать? (Если изначально программа проектировалась с использованием шаблона DAO).

8) Какой основной недостаток использования шаблона DAO?

9) В чём сильная сторона применения шаблона DAO?

10) Есть ли альтернативы у шаблона DAO?

   

Обязательная литература

№ п/п Библиографическое описание Тип (учебник, учебное посо- бие, учебно-методическое

пособие, практикум, др.)

Количество в библиотеке
1 Борчанинов М. Г. Корпоративные информационные системы на желез- нодорожном транспорте [Электрон- ный ресурс] : учебник / М. Г. Борча- нинов, Э. К. Лецкий, И. В. Маркова ; Под ред. Э. К. Лецкого, В. В. Яковле- ва. — Москва : Учеб.-метод. центр по образованию на железнодорожном транспорте, 2013. — 255 с. : ил. — ISBN

978-5-9994-0058-1.

учебник ЭБС

«IPRbooks»

2 Золотарёв О. В. Технология внедре- ния корпоративных информационных систем [Электронный ресурс] : мето- дические указания к лабораторным работам / О. В. Золотарёв. — Москва :

РосНОУ, 2013. — 40 с. : ил.

методические указания ЭБС

«IPRbooks»

 

Дополнительная литература и учебные материалы (аудио-видеопособия и др.)

 

№ п/п Библиографическое описание Тип (учебник, учеб- ное пособие, учеб- но-методическое пособие, практикум, аудио-, видео-

пособия и др.)

Количество в библиотеке
1 Мкртычев С. В. Автоматизированные ин- формационные системы в страховании : учеб.-метод. пособие / С. В. Мкртычев ; ТГУ

; каф. информатики и вычислит. техники. — ТГУ. — Тольятти : ТГУ, 2008. — 93 с. : ил. — Библиогр.: с. 83-84. — ISBN 978-5-8259-0432-

07 : 23-04.

учебно- методическое пособие 82

 

  • Перечень ресурсов информационно-телекоммуникационной сети «Интернет»

 

Projects Directory [Electronic resource]. – Electronic data. [2018]. – Mode of access : https://projects.apache.org/projects.html
Портал выбора технологий и поставщиков. [Электронный ресурс]. – Электрон- ные данные. [2018]. – Режим доступа : http://www.tadviser.ru
Java EE APIs & Docs. [Electronic resource] : [API и документация Java EE]. – Electronic data. [2018]. – Mode of access : http://www.oracle.com/technetwork/java/javaee/documentation
Net [Electronic resource]. – Electronic data. [2018]. – Mode of access : http://www.microsoft.com/net
Oracle Products and [Electronic resource] : [Продукты и сервисы Oracle].

–       Electronic     data.      [2018].      –       Mode      of       access      : http://www.oracle.com/us/products/index.html

 

  • Перечень программного обеспечения

 

п/п

Наименование ПО Количество

лицензий

Реквизиты договора (дата,

номер, срок действия)

1 DreamSpark в составе: Microsoft Visio; Microsoft Visual Studio; Microsoft Access;

Microsoft Project

1 До 01.07.2020. Продлевается

каждые 3 года

2 Oracle Products (Oracle Academy: In- stitution Level License Bundle) не ограни- чено Oracle Order 38027935

02/02/2016 (срок действия до 01.2019)

3 Visual Paradigm Community Edition не ограни-

чено

Free
4 Java EE SDK не ограни-

чено

Free

 

 

Была ли полезна данная статья?
Да
61.16%
Нет
38.84%
Проголосовало: 1107

или напишите нам прямо сейчас:

⚠️ Пожалуйста, пишите в MAX или заполните форму выше.
В России Telegram и WhatsApp блокируют - сообщения могут не дойти.
Написать в MAXНаписать в TelegramНаписать в WhatsApp