Слайд 1Java : persistence, servlets
http://mcproject.narod.ru
Слайд 2Основы Hibernate
Hibernate – одна из технологий ORM (Object Relational Mapping), реализует
технологию JPA (Java Persistence Architecture). Аналоги – iBATIS, Oracle TopLink
Работа с СУБД происходит через простые java-классы (POJO – Plain Old Java Objects), для которых указывается дополнительная информация (в XML или через аннотации)
Слайд 3Файлы, необходимые для работы
Библиотека hibernate (включает: ядро – core, аннотации –
annotation)
Файл конфигурации (hibernate.cfg.xml), в котором указаны общие параметры для hibernate и список классов для ORM
Классы POJO для воспроизведения структуры БД и хранения данных
Слайд 4Пример hibernate.cfg.xml
org.postgresql.Driver
jdbc:postgresql://localhost:5432/tpl_db
postgres
postgres
update
org.hibernate.dialect.PostgreSQLDialect
false
true
thread
Слайд 6Класс Person
package ormtest.entities;
import java.util.*;
import javax.persistence.*;
import org.hibernate.annotations.IndexColumn;
@Entity
@Table(name="PERSON")
public class Person implements java.io.Serializable{
@Id()
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String firstname;
private String middlename;
private String lastname;
private String gender;
@Temporal(value = TemporalType.DATE)
private Date bdate;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "PERSON_DEPARTMENT",
joinColumns=@JoinColumn(name="PERSON"),
inverseJoinColumns=@JoinColumn(name="DEPARTMENT")
)
private List departments = new ArrayList();
//getXXX, setXXX methods (JavaBeans-style)
}
Слайд 7Класс Department
package ormtest.entities;
import java.util.*;
import javax.persistence.*;
import org.hibernate.annotations.IndexColumn;
@Entity
public class Department {
@Id()
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String briefname;
private String fullname;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name = "PERSON_DEPARTMENT",
joinColumns = @JoinColumn(name = "DEPARTMENT"),
inverseJoinColumns = @JoinColumn(name = "PERSON"))
@IndexColumn(name = "DEP_INDEX")
private List
persons = new ArrayList();
//getXXX, setXXX methods (JavaBeans-style)
}
Слайд 8Класс HibernateUtil
package ormtest.entities;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;
public class HibernateUtil {
private static
final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Слайд 9Использование шаблона
Data Access Object
http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html
DataSource – наши классы-сущности (POJO)
Слайд 10Класс OrganizationDAO
Методы для доступа к объектам в пакете ormtest.entities
public void
beginTransaction() throws Exception{
if( s != null ) throw new Exception( "Session already opened!" );
s = HibernateUtil.getSessionFactory().openSession();
s.beginTransaction();
}
public void commit() throws Exception{
try{
s.getTransaction().commit();
s.close();
}finally{
try{ s.close(); }catch( Exception exc ){}
s = null;
}
}
public void rollback() throws Exception{
s.getTransaction().rollback();
s.close();
}
public List
getPesons() throws Exception{
return s.createQuery( "select p from Person p" ).list();
}
public Person getPerson( long id ) throws Exception{
return (Person)s.createQuery("select p from Person p where p.id=?").setLong( 0, id ).uniqueResult();
}
public void savePerson( Person p ) throws Exception{
s.saveOrUpdate( p );
}
Слайд 11Пример – добавление сотрудника
Person p = new Person();
p.setFirstname("oleg");
p.setLastname("ivanov");
p.setGender("M");
p.setBdate( new java.text.SimpleDateFormat("dd.mm.yyyy").parse("01.01.1980") );
Department dep = new Department( "ПИКО", "Кафедра Прикладной и
Компьютерной Оптики" );
dep.getPersons().add( p );
OrganizationDAO dao = OrganizationDAO.getInstance();
dao.beginTransaction();
dao.savePerson( p );
dao.saveDepartment( dep );
dao.commit();
Слайд 12Выбор всех сотрудников
OrganizationDAO dao = OrganizationDAO.getInstance();
dao.beginTransaction();
List persons = dao.getPesons();
for( Person p
: persons ){
System.out.println( " - " +
p.getFirstname() + " " + p.getLastname() );
System.out.println( "\tDepartments:" );
for( Department dep : p.getDepartments() )
System.out.println( "\t - [" + dep.getBriefname() + "] " +
dep.getFullname() );
}
dao.commit();
Слайд 13Информация по Hibernate
Настройка ORM на основе XML-конфигурации: http://docs.jboss.org/hibernate/stable/core/reference/en/html/index.html
Настройка ORM на основе
аннотаций: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
Слайд 14Задание 1
Создать консольное приложение с поддержкой библиотеки Hibernate. Добавить к классам
из примеров класс Timesheet, связанный с классом Person (связь «многие-к-одному»). Класс должен содержать следующие поля:
Дата (включая время) начала выполнения работы;
Дата (включая время) окончания работы;
Описание работы;
Название проекта.
В классе Test добавить для пользователя несколько записей об использовании рабочего времени. Произвести сохранение в БД, а затем чтение с выводом на консоль.
Слайд 15Технологии JEE
JEE – Java Enterprise Edition
Включает следующие технологии:
Сервлеты (Servlets);
JSP (Java Server
Pages);
JSF (Java Server Faces);
RMI (Remote Method Invocation);
Веб-службы (Web Services)
Слайд 16Сервлеты
Работают под управлением контейнера сервлетов (Apache Tomcat, Sun Application Server, JBoss
и др.);
Состав:
Дескриптор развертывания (файл web.xml);
Класс, наследуемый от javax.servlet.http.HttpServlet
Слайд 17Взаимодействие по протоколу HTTP
Обозреватель отправляет стандартные запросы GET или POST на
сервер. После обработки на сервере клиенту возвращается ответ (с указанием типа: text/html, application/xml, text/plain).
При запросе типа GET на веб-сервере разбирается URL запрос и создается переменная окружения QUERY_STRING (например, a=1&b=2&c=3 для URL: http://localhost/cgi-bin/test.cgi?a=1&b=2&c=3)
При запросах типа POST веб-сервер передает параметры запроса CGI-приложению через стандартный поток ввода.
Слайд 18Особенности работы сервлета
Интерфейсом для сервлетов служит javax.servlet.Servlet. Интерфейс объявляет следующие методы:
void
destroy()
ServletConfig getServletConfig()
String getServletInfo()
void init()
void service( ServletRequest, ServletResponse )
Слайд 19Класс HttpServlet
Абстрактный класс, позволяет реализовать веб-приложение, путем перегрузки методов:
doPost( HttpServletRequest, HttpServletResponse
)
doGet( HttpServletRequest, HttpServletResponse )
Параметры методов позволяют получить доступ к параметрам запроса (по именам) и выходному потоку для записи ответа.
Слайд 20Пример сервлета
package svt;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class TestServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("");
out.println("");
out.println("
Servlet TestServlet");
out.println("");
out.println("");
out.println("Servlet TestServlet at " + request.getContextPath () + "
");
out.println("");
out.println("");
} finally {
out.close();
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
}
Слайд 21Быстрое создание сервлета в NetBeans
Создаем новое веб-приложение: File / New project
/ Web application. Зададим Context Path как “test”
Добавляем сервлет: Source Packages / New / Servlet… (назовем сервлет TestServlet, а url pattern – “/svt/*”)
Раскомментируем содержание метода processRequest
Развернем (deploy) сервлет на веб-сервере: <название проекта> / deploy
Обратимся к сервлету через обозреватель по URL: http://localhost:8084/test/svt
Слайд 22Содержание web.xml
TestServlet
svt.TestServlet
TestServlet
/svt/*
30
index.jsp
Слайд 23Обработка параметров
if( request.getParameter("login") == null || request.getParameter("passwd") == null ){
request.getRequestDispatcher("login.html").forward(request, response);
return;
}
String login = request.getParameter("login");
String passwd = request.getParameter("passwd");
if( login.equals("a") && passwd.equals("a") ){
request.getRequestDispatcher("login-ok.html").forward(request, response);
return;
}else
request.getRequestDispatcher("login-failed.html").
forward(request, response);
Слайд 24Перенаправление запросов
Сервлеты могут перенаправлять запросы, например, другим сервлетам или на другие
ресурсы данного веб-сервера.
RequestDispatcher rd = request.getRequestDispatcher(“page.html”);
В интерфейсе RequestDispatcher объявлены 2 метода.
Метод для перенаправления запроса (с закрытием выходного потока) -
void forward( ServletRequest request, ServletResponse response );
Метод для включение содержимого в текущий ответ, без закрытия потока -
void include( ServletRequest request, ServletResponse response );
Слайд 25Задание 2
Разработать веб-приложение для авторизации пользователя. Первая страница – форма для
ввода имени и пароля. Вторая – сообщение об ошибке авторизации. Третья – приглашение для работы в системе при успешной авторизации.
Форма авторизации
Логин или пароль указаны не правильно
Приглашение для работы в системе