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 для роботи з базами даних.


 

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

25301. Слуховой анализатор 48.5 KB
  Средняя сосудистая оболочка в передней части глаза образует ресничное тело и радужную оболочку обуславливающую цвет глаз. Внутренняя сетчатая оболочка сетчатка или ретина содержит фоторецепторы глаза палочки и колбочки и служит для преобразования световой энергии в нервное возбуждение. Светопреломляющие среды глаза преломляя световые лучи обеспечивают четкое изображение на сетчатке. Основными преломляющими средами глаза человека являются роговица и хрусталик.
25302. Вкусовой и обонятельный анализатор 23.5 KB
  Хеморецепторы вкуса представляют собой вкусовые луковицы расположенные в эпителии языка задней стенке глотки и мягкого неба. Микроворсинки рецепторных клеток выступают из луковицы на поверхность языка и реагируют на растворенные в воде вещества. Рецепторы разных частей языка воспринимают четыре основных вкуса: горького задняя часть языка кислого края языка сладкого передняя часть языка и соленого яердняя часть и края языка.
25303. РОЛЬ СЕНСОРНЫХ СИСТЕМ В УПРАВЛЕНИИ ДВИЖЕНИЯМИ. СОМАТОСЕНСОРНАЯ ЧУВСТВИТЕЛЬНОСТЬ И КОРРЕКЦИЯ ДВИЖЕНИЙ 35.5 KB
  СОМАТОСЕНСОРНАЯ ЧУВСТВИТЕЛЬНОСТЬ И КОРРЕКЦИЯ ДВИЖЕНИЙ Выполнение движений сопряжено с растягиванием кожи и давлением на отдельные ее участки поэтому кожные рецепторы оказываются включенными в анализ движений. Эта функциональная связь является физиологической основой комплексного кинестетического анализа движений при котором импульсы кожных рецепторов дополняют мышечную проприоцептивную чувствительность. Благодаря проприоцепции возможны коррекция уточнение движений в соответствии с текущими потребностями выполнения произвольного действия....
25304. Физиологические реакции живого организма 39 KB
  Раздражение Раздражителем живой клетки или организма как целого может оказаться любое изменение внешней среды или внутреннего состояния организма если оно достаточно велико возникло достаточно быстро и продолжается достаточно долго. Клетки значительно более чувствительны по отношению к своим адекватным раздражителям чем к неадекватным. Возбудимость Некоторые клетки и ткани нервная мышечная и железистая специально приспособлены к осуществлению быстрых реакций на раздражение.
25305. Стресс 33.5 KB
  0004 ГОМЕОСТАЗ Внутренняя среда организма в которой живут все его клетки это кровь лимфа межтканевая жидкость. Ее характеризует относительное постоянство гомеостаз различных показателей так как любые ее изменения приводят к нарушению функций клеток и тканей организма особенно высокоспециализированных клеток центральной нервной системы. Способность сохранять гомеостаз в условиях постоянного обмена веществ и значительных колебаний факторов внешней среды обеспечивается комплексом регуляторных функций организма. существовать и двигаться...
25306. Адаптация 28 KB
  У человека адаптация выступает как свойство организма которое обеспечивается автоматизированными самонастраивающимися саморегулирующимися системами сердечнососудистой дыхательной выделительной и др. Адаптация это эффективная и экономная адекватная приспособительная деятельность организма к воздействию факторов внешней среды. Чем выше уровень интеграции координированности сложных регуляторных процессов тем эффективнее адаптация.
25307. Природа потенциала покоя 28.5 KB
  Согласно этой теории биоэлектрические потенциалы обусловлены неодинаковой концентрацией ионов К' N3' СГ внутри и вне клетки и различной проницаемостью для них поверхностной мембраны. Протоплазма нервных и мышечных клеток содержит в 3050 раз больше ионов калия в 810 раз меньше ионов натрия и в 50 раз меньше ионов хлора чем внеклеточная жидкость. На структурных элементах мембраны фиксируются различные ионы что придает стенкам ее пор тот или иной заряд и тем самым затрудняет или облегчает прохождение через них ионов. Так предполагается...
25308. Потенциал действия 37.5 KB
  Потенциал действия может быть зарегистрирован двояким способом: с помощью электродов приложенных к внешней поверхности волокна внеклеточное отведение и с помощью микроэлектрода введенного внутрь протоплазмы внутриклеточное отведение. Долгое время физиологи полагали что потенциал действия представляет собой лишь результат кратковременного исчезновения той разности потенциалов которая существует в покое между наружной и внутренней сторонами мембраны. Однако точные измерения проведенные с помощью внутриклеточных микроэлектродов...
25309. Законы раздражения 44 KB
  Механизм раздражающего действия тока при всех видах стимулов в принципе одинаков однако в наиболее отчетливой форме он выявляется при использовании постоянного тока прямоугольной формы. При использовании в качестве раздражителя электрического тока порог выражается в единицах силы тока или напряжения. Существует два способа подведения электрического тока к ткани: внеклеточный и внутриклеточный. Недостаток этого метода заключается в значительном ветвлении тока: только часть его проходит через мембраны клеток часть же ответвляется в...