17529

Розробка Java-програм з Web-інтерфейсом, що працюють з базами даних, на основі фреймворка Spring та Java Persistence API (JPA)

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

Информатика, кибернетика и программирование

Лабораторна робота №3 Тема: Розробка Javaпрограм з Webінтерфейсом що працюють з базами даних на основі фреймворка Spring та Java Persistence API JPA. Мета: Навчитись використовувати шаблон проектування MVC та фреймворк Spring при створенні Javaпрограм з Webінтерфейсом. Навчитись вико...

Украинкский

2013-07-04

305.5 KB

11 чел.

Лабораторна робота №3

Тема: Розробка Java-програм з Web-інтерфейсом, що працюють з базами даних, на основі фреймворка Spring та Java Persistence API (JPA).

Мета: Навчитись використовувати шаблон проектування MVC та фреймворк Spring при створенні Java-програм з Web-інтерфейсом. Навчитись використовувати Java Persistence API для роботи з базами даних.

Хід роботи:

Теоретичні відомості:

Java Persistence API

Java Persistence API забезпечує object/relational mapping для роботи з реляційними даними в Java-програмах. Java Persistence складається з трьох частин:

Java Persistence API

• Мови запитів (Query language)

Метаданих для object/relational mapping

Entities

Entity – це легковісний клас, об’єкти якого використовується для збереження даних в БД. Зазвичай, entity представляє якусь таблицю реляційної БД, а екземпляр entity відповідає одному рядку таблиці. Інформація для збереження в БД представляється або через persistent-поля, або через persistent-властивості. Ці поля чи властивості використовують анотації об’єктно-реляційного відображення (object/relational mapping annotations) для зв’язування entities та їх зв’язків з реляційними даними в базі даних.

Spring

Spring є Java framework, який надає розробнику сукупність сервісів для побудови масштабованих J2EE програм. Spring реалізує в собі концепцію MVC

Inversion of Control (IoC)

Іноді можна почути терміни Inversion of Control та Dependency Injection як взаємозамінні, але це не зовсім вірно. Inversion of Control набагато більш загальна річ, що виражається багатьма різними способами. Dependency Injection є одним з таких способів.

Inversion of Control покриває широке поле методів, які дозволяють об’єкту бути пасивним учасником в системі. Коли застосовується IoC метод, то об’єкт передає контроль над якимись своїми властивостями чи аспектами framework'у чи середовищу. Прикладами такого контролю можуть бути створення об’єктів чи передача управління залежним об’єктам. IoC може виключити необхідність явного програмування вказаних дій за допомогою використання Dependency Injection та аспектно-орієнтованого програмування (Aspect-Oriented Programming AOP) відповідно.

Dependency Injection

Поняття Dependency Injection є стержневим в Spring. Dependency Injection є методом обєднання різних обєктів в єдину систему. При його застосування framework сам забезпечує встановлення звязків між обєктами, позбавляючи програміста необхідності написання в своєму коді логіки звязування обєктів чи створення обєктів.

Якщо два об’єкти зв’язані, бажано, щоб зв’язок не був жорстким і не був прив’язаний до конкретного середовища.

Application Context

The ApplicationContext є реалізацією BeanFactory, яка, в свою чергу, є реєстром всіх обєктів, керованих Spring. Загалом, BeanFactory відповідає за створення бінів, звязування їх з залежними бінами і забезпечення засобів зручного пошуку бінів. ApplicationContext може розглядатися як повнофункціональна BeanFactory. ApplicationContexts також додає деякі додаткові можливості до BeanFactory. Він може автоматично обробляти BeanFactory після ініціалізації шляхом запуску BeanFactoryPostProcessors. Він також забезпечує можливість інтернаціоналізації, механізм маршрутизації повідомлень для слабо звязаних обєктів і підтримує інтерфейси життєвого циклу, такі, як ApplicationContextAware.

Plain Old Java Objects (POJO)

Отже, Dependency Injection та Spring Application Context є двома центральними концепціями в Spring Framework. Вони є інструментом забезпечення можливості побудови програми на основі виключно plain old Java objects (POJOs). Це дає можливість розробляти web-програми, які є повністю обєктно-орієнтованими без привязки до конкретного framework всередині бізнес-логіки. Це дає змогу сфокусуватися на розробці бізнес-логіки вбудовану в model замість концентрації на специфічному для використовуваного framework коді. Це відчиняє двері для всіх  design patterns, принципів і практик ефективної обєктно-орієнтованої розробки.

Лістинг програми:

Bludo.java

package org.chdtu.samples.tryspringjpa;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Table;

@Entity

@Table(name="BLUDO")

public class Bludo extends BaseEntity{

private static final long serialVersionUID = -5675138799302239629L;

 

@Column(name="nazvablud")

private String nazvablud;

 

@Column(name="prix")

private String prix;

 

@Column(name="id_ingredient")

private Integer idingredient;

public String getNazvablud() {

 return nazvablud;}

public void setNazvablud(String nazvablud) {

 this.nazvablud = nazvablud;}

public String getPrix() {

 return prix;}

public void setPrix(String prix) {

 this.prix = prix;}

public Integer getIdingredient() {

 return idingredient;}

public void setIdingredient(Integer idingredient) {

 this.idingredient = idingredient;}

 

}

Ingredient.java

package org.chdtu.samples.tryspringjpa;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Table;

@Entity

@Table(name="INGREDIENT")

public class Ingredient extends BaseEntity{

private static final long serialVersionUID = -5675138799302239629L;

@Column(name="nameingredient")

private String nameingredient;

@Column(name="priceforvaga")

private String priceforvaga;

 

@Column(name="vaga")

private String vaga;

 

@Column(name="idbludo")

private Integer idbludo;

 

public String getNameingredient() {

 return nameingredient;

}

public void setNameingredient(String nameingredient) {

 this.nameingredient = nameingredient;

}

public String getPriceforvaga() {

 return priceforvaga;

}

public void setPriceforvaga(String priceforvaga) {

 this.priceforvaga = priceforvaga;

}

public String getVaga() {

 return vaga;

}

public void setVaga(String vaga) {

 this.vaga = vaga;

}

public Integer getIdbludo() {

 return idbludo;

}

public void setIdbludo(Integer idbludo) {

 this.idbludo = idbludo;

}

 

}

Blud. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import org.chdtu.samples.tryspringjpa.Bludo;

import org.springframework.dao.DataAccessException;

/**

* The high-level TrySpringAndJPA business interface.

*

* <p>This is basically a data access object.

* TrySpringAndJPA doesn't have a dedicated business facade.

*

*/

public interface Blud {

Collection<Bludo> getBludos() throws DataAccessException;

}

Ingredientt. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import org.chdtu.samples.tryspringjpa.Ingredient;

import org.springframework.dao.DataAccessException;

public interface Ingredientt {

Collection<Ingredient> getIngredients() throws DataAccessException;

}

EntityManagerBlud. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import org.chdtu.samples.tryspringjpa.Bludo;

import org.springframework.stereotype.Repository;

import org.springframework.transaction.annotation.Transactional;

/**

* JPA implementation of the Clinic interface using EntityManager.

*

* <p>The mappings are defined in "orm.xml" located in the META-INF directory.

*

* @author Mike Keith

* @author Rod Johnson

* @author Sam Brannen

* @since 22.4.2006

*/

@Repository

@Transactional

public class EntityManagerBlud implements Blud {

@PersistenceContext

private EntityManager em;

@Transactional(readOnly = true)

@SuppressWarnings("unchecked")

public Collection<Bludo> getBludos() {

 return this.em.createQuery("SELECT vet FROM Bludo vet").getResultList();

}

}

EntityManagerIngredient. java

package org.chdtu.samples.tryspringjpa.jpa;

import java.util.Collection;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import org.chdtu.samples.tryspringjpa.Ingredient;

import org.springframework.stereotype.Repository;

import org.springframework.transaction.annotation.Transactional;

/**

* JPA implementation of the Clinic interface using EntityManager.

*

* <p>The mappings are defined in "orm.xml" located in the META-INF directory.

*

* @author Mike Keith

* @author Rod Johnson

* @author Sam Brannen

* @since 22.4.2006

*/

@Repository

@Transactional

public class EntityManagerIngredient implements Ingredientt {

@PersistenceContext

private EntityManager em;

@Transactional(readOnly = true)

@SuppressWarnings("unchecked")

public Collection<Ingredient> getIngredients() {

 return this.em.createQuery("SELECT vet FROM Ingredient vet").getResultList();

}

}

BludoController. java

package org.chdtu.samples.tryspringjpa.web;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.chdtu.samples.tryspringjpa.jpa.Blud;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class BludoController {

private final Blud bludo;

protected final Log logger = LogFactory.getLog(getClass());

@Autowired

public BludoController(Blud bludo) {

 this.bludo = bludo;

}

@RequestMapping("/bludo.do")

public ModelMap bludoHandler() {

 return new ModelMap(this.bludo.getBludos());

}

}

IngredientController. java

package org.chdtu.samples.tryspringjpa.web;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

import org.chdtu.samples.tryspringjpa.jpa.Ingredientt;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

@Controller

public class IngredientController {

private final Ingredientt ingredient;

protected final Log logger = LogFactory.getLog(getClass());

@Autowired

public IngredientController(Ingredientt ingredient) {

 this.ingredient = ingredient;

}

@RequestMapping("/ingredient.do")

public ModelMap ingredientHandler() {

 return new ModelMap(this.ingredient.getIngredients());

}

}

Jdbc.properties

# Properties file with JDBC and JPA settings.

#

# Applied by <context:property-placeholder location="jdbc.properties"/> from

# various application context XML files (e.g., "applicationContext-*.xml").

# Targeted at system administrators, to avoid touching the context XML files.

#-------------------------------------------------------------------------------

# Common Settings

hibernate.generate_statistics = true

hibernate.show_sql            = true

jpa.showSql                   = true

#-------------------------------------------------------------------------------

jdbc.driverClassName=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/restoran

jdbc.username=root

jdbc.password=admin

hibernate.dialect=org.hibernate.dialect.MySQLDialect

jpa.databasePlatform = oracle.toplink.essentials.platform.database.MySQL4Platform

jpa.database = MYSQL

aop.xml

<?xml version="1.0"?>

<!-- Custom aspects for the TrySpringAndJPA sample application -->

<aspectj>

<weaver>

 <include within="org.chdtu.samples.tryspringjpa..*"/>

</weaver>

</aspectj>

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

 version="1.0">

<persistence-unit name="restoran" transaction-type="RESOURCE_LOCAL">

 <!-- Explicitly define mapping file path, else Hibernate won't find the default -->

 <mapping-file>META-INF/orm.xml</mapping-file>

 <!-- Prevent annotation scanning. In this app we are purely driven by orm.xml -->

 <exclude-unlisted-classes>true</exclude-unlisted-classes>

</persistence-unit>

</persistence>

orm.xml

<?xml version="1.0" encoding="Utf-8"?>

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"

 version="1.0">

<persistence-unit-metadata>

 <xml-mapping-metadata-complete/>

 <persistence-unit-defaults>

  <access>PROPERTY</access>

 </persistence-unit-defaults>

</persistence-unit-metadata>

<package>org.chdtu.samples.tryspringjpa</package>

<mapped-superclass class="BaseEntity">

 <attributes>

  <id name="id">

   <generated-value strategy="IDENTITY"/>

  </id>

 </attributes>

</mapped-superclass>

<entity class="Bludo">

 <table name="BLUDO"/>

 <attributes>

  <basic name="nazvablud"/>

  <basic name="prix"/>

  <basic name="idingredient">

  <column name="id_ingredient"/>

  </basic>

 </attributes>

</entity>

 

<entity class="Ingredient">

 <table name="INGREDIENT"/>

 <attributes>

  <basic name="nameingredient"/>

  <basic name="priceforvaga"/>

  <basic name="vaga"/>

  <basic name="idbludo">

  <column name="idbludo"/>

  </basic>

 </attributes>

</entity>

</entity-mappings>

web.xml

<?xml version="1.0" encoding="Windows-1251"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Simple Spring with JPA Program</display-name>

<description>Simple Spring with JPA Program</description>

<context-param>

 <param-name>webAppRootKey</param-name>

 <param-value>tryspringandjpa.root</param-value>

</context-param>

<context-param>

 <param-name>log4jConfigLocation</param-name>

 <param-value>/WEB-INF/log4j.properties</param-value>

</context-param>

<context-param>

 <param-name>contextConfigLocation</param-name>

 <param-value>/WEB-INF/applicationContext-jpa.xml</param-value>

</context-param>

<listener>

 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>

<servlet>

 <servlet-name>tryspringandjpa</servlet-name>

 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

 <load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

 <servlet-name>tryspringandjpa</servlet-name>

 <url-pattern>*.do</url-pattern>

</servlet-mapping>

<session-config>

 <session-timeout>10</session-timeout>

</session-config>

<welcome-file-list>

 <!-- Redirects to "welcome.htm" for dispatcher handling -->

 <welcome-file>index.jsp</welcome-file>

</welcome-file-list>

<error-page>

 <exception-type>java.lang.Exception</exception-type>

 <location>/WEB-INF/jsp/uncaughtException.jsp</location>

</error-page>

</web-app>

bludo.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%@ include file="/WEB-INF/jsp/header.jsp" %>

<h2>Dishs</h2>

Display all dishs...

<table>

 <tr>

 <thead>

   <th>Number</th>

   <th>Name</th>

   <th>Price</th>

   <th>Number ingredient</th>

   <th><img src="images/Pag2.png" align="right" style="position:relative;right:0px;"></th>

 </thead>

 </tr>

 <c:forEach var="vet" items="${bludoList}">

   <tr>

     <td>${vet.id}</td>

     <td>${vet.nazvablud}</td>

     <td>${vet.prix}</td>

     <td>${vet.idingredient}</td>

   </tr>

 </c:forEach>

</table>

<a href="<c:url value="/addbludo.do"/>">Add Dish</a>

<p>&nbsp;</p>

<%@ include file="/WEB-INF/jsp/footer.jsp" %>

ingredient.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%@ include file="/WEB-INF/jsp/header.jsp" %>

<h2>Ingredients</h2>

Display all ingredients...

<table>

 <tr>

 <thead>

   <th>Number</th>

   <th>Name</th>

   <th>Price for weight</th>

   <th>Weight</th>

   <th>Number Dishs</th>

 </thead>

 </tr>

 <c:forEach var="vet" items="${ingredientList}">

   <tr>

     <td>${vet.id}</td>

     <td>${vet.nameingredient}</td>

     <td>${vet.priceforvaga}</td>

     <td>${vet.vaga}</td>

     <td>${vet.idbludo}</td>

   </tr>

 </c:forEach>

</table>

<p>&nbsp;</p>

<%@ include file="/WEB-INF/jsp/footer.jsp" %>

welcome.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%@ include file="/WEB-INF/jsp/header.jsp" %>

<h2>Restaurants</h2>

Display all restaurant...

<table>

 <tr>

 <thead>

   <th>ID</th>

   <th>Name</th>

   <th>Creation Year</th>

 </thead>

 </tr>

 <c:forEach var="vet" items="${groupList}">

   <tr>

     <td>${vet.id}</td>

     <td>${vet.nazva}</td>

     <td>${vet.creationYear}</td>

   </tr>

 </c:forEach>

</table>

<p>&nbsp;</p>

<%@ include file="/WEB-INF/jsp/footer.jsp" %>

index.jsp

<%@ include file="/WEB-INF/jsp/includes.jsp" %>

<%-- Redirected because we can't set the welcome page to a virtual URL. --%>

<c:redirect url="/welcome.do"/>

footer.jsp

 <table class="footer">

   <tr>

          <td><a href="<c:url value="/bludo.do"/>">Bludo</a></td>

      <td><a href="<c:url value="/ingredient.do"/>">Ingredients</a></td>

     <td align="right"><img src="<c:url value="/images/springsource-logo.png"/>"/></td>

   </tr>

 </table>

 </div>

</body>

</html>

Результати роботи:

Рисунок 1 - Сторінка з списком блюд

Рисунок 2 - Сторінка з списком інгредієнтів

Висновок

В даній лабораторній роботі використовувались шаблон проектування MVC та фреймворк Spring при створенні Java-програм з Web-інтерфейсом.  Було здобуто навички використання Java Persistence API для роботи з базами даних.


 

А также другие работы, которые могут Вас заинтересовать

73639. Статистика объема и состава национального богатства 98 KB
  Национальное богатство (НБ) – важнейшая социально-экономическая категория, используемая для оценки экономического потенциала и уровня экономического развития страны.
73640. Статистика основных фондов 169 KB
  Основные фонды представляют собой совокупность потребительных стоимостей производственного и непроизводственного назначения, которые функционируют в экономике на протяжении ряда лет и, постепенно изнашиваясь
73641. Статистика национального богатства 112 KB
  Статистика оборотных фондов Понятие и состав оборотных фондов. Показатели объема и структуры оборотных фондов. Показатели использования и динамики материальных оборотных фондов Показатели оборачиваемости оборотных средств. Понятие и состав оборотных фондов Оборотные фонды важная часть национального богатства страны его наиболее мобильный постоянно возобновляемый элемент.
73642. Память. Типовые структуры и функциональные узлы микросхем памяти 1.32 MB
  Каждый код хранится в отдельном элементе памяти называемом ячейкой памяти. Основная функция любой памяти состоит в выдаче этих кодов на выходы микросхемы по внешнему запросу. Основной параметр памяти ее объем то есть количество кодов которые могут в ней храниться и разрядность этих кодов. Для обозначения количества ячеек памяти используются следующие специальные единицы измерения: 1К это 1024 то есть 210 читается кило или ка примерно равно одной тысяче; 1М это 1048576 то есть 220 читается мега примерно равно одному...
73644. Реформирование и адаптация предприятия к новым условиям хозяйствования 78 KB
  Реформирование и развитие предприятий промышленного комплекса. Проблемы реформирования и адаптации предприятий к новым условиям хозяйствования. Управление предприятием при его реформировании и реабилитации.
73645. Интерфейс ведения журнала кардиологических операций 969 KB
  Компьютеризация медицины идет по самым разным направлениям. На данный момент налицо все технические предпосылки для этого - наличие надежных сетей, серверов, компьютеризированного медицинского инструментария и пр. Большое число медицинских работников активно использует в своей работе самые разнообразные возможности вычислительной техники.