Практическое занятие — Разработка сервлетов
Лабораторная работа
Создать веб-приложение по шагам, описанным в теоретической части. Запустить приложение в серверной среде и проверить его работоспособность.
Лабораторная работа
Создать простой веб-сайт на основе сервлетов. Первый сервлет обрабатывает ввод пользователя, второй на основе полученного ввода выдает сообщение. Например, пользователь вводит свое имя, а на следующей странице получает сообщение «Привет, «имя пользователя»!».
Реализация задания:
Код первого сервлета, обрабатывающего главную страницу «/» (рисунок 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»
КОНТРОЛЬНЫЕ ВОПРОСЫ ПО ТЕМЕ СЕРВЛЕТЫ
- Что такое сервлеты?
- Опишите принцип работы сервлетов?
- Назовите основные преимущества сервлетов?
- Что такое контейнер сервлетов?
- Как устроен жизненный цикл сервлетов?
- Что такое дескриптор развертывания?
- Что такое Http? Какие существуют Http-методы?
- Сколько Http-методов можно переопределить в классе наследующего HttpServlet?
- Какое предназначение классов HttpServletRequest и HttpServletResponse?
- Какими способами можно закрепить за сервлетом обработку конкретного 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»
КОНТРОЛЬНЫЕ ВОПРОСЫ ПО ТЕМЕ СЕРВЛЕТЫ
Что такое сервлеты
- Опишите принцип работы сервлетов?
- Назовите основные преимущества сервлетов?
- Что такое контейнер сервлетов?
- Как устроен жизненный цикл сервлетов?
- Что такое дескриптор развертывания?
- Что такое Http? Какие существуют Http-методы?
- Сколько Http-методов можно переопределить в классе наследующего HttpServlet?
- Какое предназначение классов HttpServletRequest и HttpServletResponse?
- Какими способами можно закрепить за сервлетом обработку конкретного 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;
}
}
Контрольные вопросы по практической работе.
- Как расшифровывается сокращение JSP ?
- Позволяет ли JSP комбинировать HTML Web страницы с кусочками кода Java в одном документе?
- Какое расширение бывает у JSP-страниц?
- Что из перечисленного ниже НЕ является «движком» для работы с JSP?
- Можно ли в одну JSP-страницу вставлять несколько других?
- Для вставки текущей даты на JSP-страницу нужно использовать директиву для импорта:
- С помощью, каких тегов можно определить код Java на странице JSP?
- Комментарии в JSP-странице добавляются с помощью тега:
- Можно ли использовать объект request в JSP-странице для отправленных форм?
- Что позволяет вставить код 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 автоматически создаются таблицы:
- author
- book
- 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 |
или напишите нам прямо сейчас:
Здравствуйте. Скажите пожалуйста, планирую поступать в магистратуру на факультет Психологии « Психология личности»в РГГУ скажите пожалуйста, есть ли у вас, ответы на вступительные экзамены? так как, планирую, сделать акцент на бюджет. Спасибо.
Арсений, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Дистанционная помощь в защите ВКР
Анастасия, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте. Нужна срочно практическая часть вкр, третья глава. Скину похожие работы, на которые можно ориентироваться
Александр, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
вкр по теме: экологический туризм России : анализ состояния, проблемы и перспективы
Людмила, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте вы защищаете ВКР?
Ольга, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать магистерскую ВКР на тему «Совершенствование логистических бизнес-процессов на примере торговой компании». Не менее 100 страниц.
Миша, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте нужна работа Вкр
Лена, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать ВКР 3 раздела Тема строительство строительство жилого дома с применением каркасно-монолитных технологий Антиплагиат от 75% ПЗ и чертежи
Владимир, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.